介绍:
我试图获取其他字段以使用log4j及其工作日志进行记录,但是仅当我在代码中而不是在log4j.properties中创建附加程序时
进展:
问题:
使用属性文件,它将运行,但不会使用AppServerPatternLayout,因此不会显示自定义字段。
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
没有log4j属性文件的Main.java日志记录
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");
使用log4j属性文件记录Main.java
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");
预期产量
----------------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
实际产量
-----------------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
解
使用MDC,您可以添加自定义字段,例如
MDC.put("Version", versionName);
Logger log = LogManager.getLogger("some.log");
log.info("Hello");
并用大写字母X将其拉出到log4j.properties中
log4j.appender.stdout.layout.ConversionPattern=%X{Version}
最佳答案
从您发布的示例中,我只能猜测AppServerPatternLayout
不在logging
包中。一切看起来都找到了。加
log4j.DEBUG=true
到您的属性文件。然后log4j将在读取属性时转储其操作。也许这使您知道出了什么问题。
如果那没有帮助,请考虑使用Nested Diagnostic Contexts。