Issue regarding log4j

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Abhinay
    New Member
    • Jul 2006
    • 44

    Issue regarding log4j

    Hi there,

    I am working on server which used thread pool to process each client request by separate dedicated thread.
    My intention was each thread ( of thread pool ) have its own logger and hence all client processed by that thread must be logged in corresponding thread specific logger.

    My problem is that logger merging log content with other logger content, my doubt is Logger.getLogge r(...) function return wrong logger object.

    I am creating and configuring logger at run time using following function.

    where:
    sLoggerName : Current thread name ( Thread.currentT hread.getName() )

    m_sFilePath : log file path
    m_sExt : log file extention
    m_layout : static layout object

    Code:
    public static Logger getLogger( String sLoggerName )throws IOException
     {
            boolean bLoggerExists = false;
            if(LogManager.exists(sLoggerName) != null)
                bLoggerExists = true;
            Logger logger = Logger.getLogger(sLoggerName);
            if( !bLoggerExists )
            {
                //Logger is not exists so create appender for logger
                String sFileName = m_sFilePath + sLoggerName + m_sExt;
                RollingFileAppender appender = new RollingFileAppender(m_layout, sFileName, true );
                appender.setMaxBackupIndex( m_iMaxBufferIndex );
                appender.setMaxFileSize( m_sLogMaxFileSize );
                logger.addAppender( appender );
                logger.setLevel( m_logLevel );
                logger.setAdditivity(false);
            }
     
            return logger;
        }
    for example logger for thread 5 wirtes log in file for thread 8 and so on .....

    Is there any thing I am missing in code ????

    note: I have used java's executor server for thread pooling

    log4j.property ( for root logger )

    Code:
    # Category Configuration
    log4j.rootLogger=INFO,Konsole,Roll
    # Console Appender Configuration
    log4j.appender.Konsole=org.apache.log4j.ConsoleAppender
    log4j.appender.Konsole.layout=org.apache.log4j.PatternLayout
    # Date Format based on ISO­8601 : %d
    log4j.appender.Konsole.layout.ConversionPattern=%d [%t] %5p %c ­ %m%n
    # Roll Appender Configuration
    log4j.appender.Roll=org.apache.log4j.RollingFileAppender
    log4j.appender.Roll.File=D\:/4YsClient/Log/ErrorFileList.log
    log4j.appender.Roll.MaxFileSize=100MB
    log4j.appender.Roll.MaxBackupIndex=10
    log4j.appender.Roll.layout=org.apache.log4j.PatternLayout
    # Date Format based on ISO­8601 : %d
    log4j.appender.Roll.layout.ConversionPattern=%d [%t] %p (%F:%L) ­ %m%n

    pleas suggest, your help make me happy,

    Thank you,
    Abhinay
  • Abhinay
    New Member
    • Jul 2006
    • 44

    #2
    I changed my logic as below

    Code:
    public static final Logger getLogger( final String sLoggerName )throws IOException
    {
      final Logger logger = LogManager.exists(sLoggerName);
            if(logger != null)
            {
                return logger;
            }
     
             Logger newLogger = LogManager.getLogger(sLoggerName);
            //Logger is not exists so create appender for logger
            String sFileName = m_sFilePath + sLoggerName + m_sExt;
            RollingFileAppender appender = new RollingFileAppender(m_layout, sFileName, true );
            appender.setMaxBackupIndex( m_iMaxBufferIndex );
            appender.setMaxFileSize( m_sLogMaxFileSize );
            newLogger.addAppender( appender );
            newLogger.setLevel( m_logLevel );
            newLogger.setAdditivity(false);
           return newLogger;
    }
    still logger writing logs in wrong files, can any buddy please help me and suggest what's wrong with my logic.

    My server having 64 threads ( ie 64 logger ) and it is running on "8 core" machine, is this a problem as it is hightly multithreaded ????

    Abhinay

    Comment

    • umbr
      New Member
      • Feb 2009
      • 9

      #3
      Hi Abhinay!
      For logging into separate files you need cofigure different loggers instead of appenders. Look, like this:
      Code:
      log4j.rootLogger=DEBUG, ROOT
      log4j.appender.ROOT=... #configure main(root) appender
      
      # configure logger for com.foo.1 category
      log4j.logger.com.foo.1=INFO, ONE
      log4j.appender.ONE=... #configure appender ONE
      
      # configure logger for com.foo.2 category
      log4j.logger.com.foo.2=INFO, TWO
      log4j.appender.TWO=... #configure appender TWO

      Comment

      • Abhinay
        New Member
        • Jul 2006
        • 44

        #4
        Thank you umbr for your suggestion,

        but what should I do if I want to create logger at runtime ?

        My thread count ( hence logger ) are configurable hence I can't decide and configure logger in advance, I must have to create logger at runtime.

        Comment

        • umbr
          New Member
          • Feb 2009
          • 9

          #5
          Hi Abhinay!
          Yes, for indetermined categories you must override Logger class for your purposes(may be with custom appender), which will dynamically create new log files.
          Code:
              String filename = ... // generate name of new logfile
              Logger logger = new MyLogger(filename);
              // do as you need with logger
              ...

          Comment

          • Abhinay
            New Member
            • Jul 2006
            • 44

            #6
            Thank all of you for helping me, finally I got the root cause of problem.
            This problem is due to static layout which I was sharing with all logger appenders.


            ---Abhinay

            Comment

            Working...