On 5 Nov, Marcel Ruff wrote:
Peter Antman wrote:
Hi,
I have been taking a quick look at the logging, since I think it would
be nice to be able to hook in another logging system. The problem is,
that since the logging is tied to Global and to me the singleton global
is not something you want to use i an embedded envrionment, you will
have to have manuall access to the Glob for the component yoy would want
to hook antoher logger to.
What do you say about the following solution:
1. Define a LogDeviceFactory
public interface {
LoggableDevive getLoggableDebice(LogChannel channel, Global glob);
}
2. Make is possible to define a LogDeviceFactory in properties, either
one or many or even your [...] style, ie:
logDeviceFactory=my.pack.Log4jDeviceFactory
or
logDeviceFactory=my.pack.Log4jLogDeviceFactory,org.xmlBlaster.util.ConsoleLogDeviceFactory
or even
logDeviceFactory[cb]=org.xmlBlaster.util.ConsoleLogDeviceFactory
3. And in initLog in Global set up the LogDevice factory structure and
use that if its available.
In
xmlBlaster/src/java/org/xmlBlaster/MainGUI.java
there is an example how to redirect the logging to
public void log(int level, String source, String str)
The redirect is added by
log.addLogDevice(this);
where 'this' implements LogableDevice
This is only for one LogChannel.
Yea I know that, but it is not at all what I want, since it requres
programatic access to global, which is not possible, if you for example
want to ad a LoggableDevice to XmlBlasterService, which is not already
part of XmlBlaster.
You could intercept in util.Global in
public LogChannel getLog(String key)
and if a new LogChannel is created do a
logChannel.removeAllDevices()
redirect this to your plugin as well.
I think it would be better to do it in:
private void initLog(LogChannel lc)
since all log channel creation/inititalization seems to go through that
method, both from addLogChannel, getLog and from constructors.
We would prefer if you use our
xmlBlaster/src/java/org/xmlBlaster/util/plugin/PluginManagerBase.java
framework to load plugins so that we have a common plugin loading mechanism
which looks the same for configuration
and if we change it in future all plugins
benefit from this change.
(The plugin framework changed a bit on our dev branch
but we will merge it when the time comes).
Ok. I will look at it and see if I understand it, but I don't know if I
reallt view this as a plugin: its more a small variation on the code
thats already there:
Instead of
boolean bVal = getProperty().get("logConsole", true);
if (key != null) getProperty().get("logConsole[" + key + "]", bVal);
if (bVal == true) {
LogDeviceConsole ldc = new LogDeviceConsole(lc);
lc.addLogDevice(ldc);
}
something like this:
if (logdeviceFactory == null) {
String fac = getProperty().get("logDeviceFactory",
"org.jutils.log.LogDeviceConsole");
Class clazz =
Thread.currentThread().getContextClassLoader().loadClass(fac):
logdeviceFactory = (LogDeviceFactory)clazz.newInstance();
}