简介:
我正在尝试用log4j记录额外的字段,并且只有在我用代码而不是在log4j.properties中创建附加器时它才能起作用
进度:
问题:
使用它将运行的属性文件,但不会使用AppServerPatternLayout,因此不会显示自定义字段。
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");
并在log4j.properties中使用大写X将其拉出
log4j.appender.stdout.layout.ConversionPattern=%X{Version}
发布于 2009-11-06 21:21:24
从您发布的示例中,我只能猜测logging
包中没有AppServerPatternLayout
。其他的一切看起来都找到了。添加
log4j.DEBUG=true
添加到属性文件中。然后,log4j将在读取属性时转储它所做的事情。也许这会让你知道出了什么问题。
如果这还不能解决问题,考虑使用Nested Diagnostic Contexts。
发布于 2009-11-06 21:16:32
当您通过属性加载时,是否会在创建AppServerLoggerFactory
之前实例化AppServerPatternLayout
?如果您在创建时选择自定义字段的值,而不是在第一次使用时,这可能是一种解释。
发布于 2009-11-06 21:34:23
我不确定您是否可以通过属性配置来实现这一点,但我认为您可以使用XML来实现这一点,它为您提供了许多自定义选项:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration
xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="true"
reset="true"
>
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="your.package.AppServerPatternLayout">
<param name="ConversionPattern" value="YOUR CONVERSION PATTERN"/>
</layout>
</appender>
<root>
<level value="info"/>
<appender-ref ref="stdout" />
</root>
<loggerFactory class="your.package.AppServerLoggerFactory">
<param name="server" value="MyServer"/>
<param name="component" value="MyComponent"/>
<param name="version" value="1.0r"/>
</loggerFactory>
</log4j:configuration>
您需要在AppServerLoggerFactory
上为服务器、组件和版本定义设置器。另外,请阅读log4j.dtd
关于xml配置文件的总体布局。
将此文件另存为log4j.xml,并在启动脚本中定义-Dlog4j.configuration=/path/to/log4j.xml,或者在web应用程序中将log4j.properties替换为log4j.xml。
我以前从未尝试过自定义LoggerFactory,但可能是因为它是由配置器安装的,所以您可以使用标准的getLogger
工厂调用,例如
//Logger logger = AppServerLogger.getLogger("some.log");
Logger logger = Logger.getLogger("some.log");
https://stackoverflow.com/questions/1687473
复制相似问题