Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Log4J Custom Fields

Tags:

java

log4j

Introduction:

I'm trying to get additional fields to log with log4j, and its working but only when I create an appender in code and not in the log4j.properties

Progress:

  1. Used this article Adding Conversion Characters to PatternLayout for log4j 1.1.3
  2. Made a sample app for log4j 1.2

Problem:

using the properties file it will run but won't use AppServerPatternLayout so the custom fields aren't displayed.

Download Code

customlog.properties

log4j.rootLogger=FATAL
log4j.logger.some.log=INFO,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=logging.AppServerPatternLayout
log4j.appender.stdout.layout.ConversionPattern=-----------------using log file------------------------%nTime:      %d%nHost:      %h%nServer:    %s%nComponent: %b%nVersion:   %v%nPriority:  %p%nThread Id: %t%nContext:   %x%nMessage:   %m%n

Main.java logging without a log4j properties file

AppServerLoggerFactory factory;
factory = new AppServerLoggerFactory("MyServer", "MyComponent", "1.0");
AppServerLogger.setFactory(factory);
Logger logger = AppServerLogger.getLogger("some.log");
PatternLayout layout = new AppServerPatternLayout( formatString );
logger.addAppender( new ConsoleAppender(layout) );
logger.info("Hello");

Main.java logging with a log4j properties file

PropertyConfigurator.configure("customlog.properties");
AppServerLoggerFactory factory;
factory = new AppServerLoggerFactory("MyServer", "MyComponent", "1.0");
AppServerLogger.setFactory(factory);
Logger logger = AppServerLogger.getLogger("some.log");
logger.info("Hello");

Expected output

----------------using in code appender----------------------
Time:      2009-11-06 12:55:05,785
Host:      M1330
Server:    MyServer
Component: MyComponent
Version:   1.0
Priority:  INFO
Thread Id: main
Context:   
Message:   logging config from code

Actual output

-----------------using log file------------------------
Time:      2009-11-06 12:56:17,983
Host:      
Server:    
Component: 
Version:   
Priority:  INFO
Thread Id: main
Context:   
Message:   logging config from customlog.properties

Solution

Using MDC you can add custom fields like

MDC.put("Version", versionName);
Logger log = LogManager.getLogger("some.log");        
log.info("Hello");

and pull it out in the log4j.properties with a UPPER case X

log4j.appender.stdout.layout.ConversionPattern=%X{Version}
like image 839
Scott Cowan Avatar asked Nov 06 '09 13:11

Scott Cowan


1 Answers

From the example you posted, I can only guess that AppServerPatternLayout is not in the package logging. Everything else looks find. Add

log4j.DEBUG=true

to your properties file. log4j will then dump what it does while reading the properties. Maybe that gives you an idea what's wrong.

If that doesn't help, consider to use Nested Diagnostic Contexts.

like image 71
Aaron Digulla Avatar answered Sep 23 '22 18:09

Aaron Digulla