Hi there!

To be able to log and trace some events I've added a LoggingHandler class to
my java project. Inside this class I'm using two different log4j logger
instances - one for logging an event and one for tracing an event into
different files. The initialization block of the class looks like this:

    public void initialize()
    {
        System.out.print("starting logging server ...");

        // create logger instances
        logLogger = Logger.getLogger("log");
        traceLogger = Logger.getLogger("trace");

        // create pattern layout
        String conversionPattern = "%c{2} %d{ABSOLUTE} %r %p %m%n";
        try
        {
            patternLayout = new PatternLayout();
            patternLayout.setConversionPattern(conversionPattern);
        }
        catch (Exception e)
        {
            System.out.println("error: could not create logger layout
pattern");
            System.out.println(e);
            System.exit(1);
        }

        // add pattern to file appender
        try
        {
            logFileAppender = new FileAppender(patternLayout, logFilename,
false);
            traceFileAppender = new FileAppender(patternLayout,
traceFilename, false);
        }
        catch (IOException e)
        {
            System.out.println("error: could not add logger layout pattern
to corresponding appender");
            System.out.println(e);
            System.exit(1);
        }

        // add appenders to loggers
        logLogger.addAppender(logFileAppender);
        traceLogger.addAppender(traceFileAppender);

        // set logger level
        logLogger.setLevel(Level.INFO);
        traceLogger.setLevel(Level.INFO);

        // start logging server
        loggingServer = new LoggingServer(logLogger, traceLogger,
serverPort, this);
        loggingServer.start();

        System.out.println(" done");
    }

To make sure that only only thread is using the functionality of a logger
instance at the same time each logging / tracing method calls the logging
method .info() inside a synchronized-block. One example looks like this:

        public void logMessage(String message)
    {
        synchronized (logFileAppender)
        {
            if (logLogger.isInfoEnabled() && logFileAppender != null)
            {
                logLogger.info(instanceName + ": " + message);
            }
        }
    }

If I look at the log files, I see that sometimes a event appears in the
wrong file. One example:

    trace 10:41:30,773 11080 INFO masterControl(192.168.2.21): string
broadcast message was  pushed from 1267093 to vehicle 1055293 (slaveControl
1)
    trace 10:41:30,784 11091 INFO masterControl(192.168.2.21): string
broadcast message was pushed from 1156513 to vehicle 1105792 (slaveControl
1)
    trace 10:41:30,796 11103 INFO masterControl(192.168.2.21): string
broadcast message was pushed from 1104306 to vehicle 1055293 (slaveControl
1)
    trace 10:41:30,808 11115 INFO masterControl(192.168.2.21): vehicle
1327879 was pushed to slave control 1
    10:41:30,808 11115 INFO masterControl(192.168.2.21): string broadcast
message was pushed from 1101572 to vehicle 106741 (slaveControl 1)
    trace 10:41:30,820 11127 INFO masterControl(192.168.2.21): string
broadcast message was pushed from 1055293 to vehicle 1104306 (slaveControl
1)

I think that the problem occures everytime two event happen at the same time
(here: 10:41:30,808). Does anybody has an idea how to solve my problem? I
already tried to add a sleep() after the method call, but that doesn't
helped ...

BR,

Markus

Reply via email to