Log4J自定义字段

介绍:

我正在尝试使用log4j获取其他字段,并且它的工作正常但只有当我在代码中而不是在log4j.properties中创建一个appender时

进展:

  1. 使用本文为log4j 1.1.3 添加转换字符到PatternLayout
  2. 为log4j 1.2制作了一个示例应用程序

问题:

使用属性文件,它将运行但不会使用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"); 

并使用UPPER案例X在log4j.properties中将其拉出

 log4j.appender.stdout.layout.ConversionPattern=%X{Version} 

从您发布的示例中,我只能猜测AppServerPatternLayout不在包logging 。 其他一切看起来都找不到。 加

 log4j.DEBUG=true 

到您的属性文件。 然后log4j将在读取属性时转储它的作用。 也许这会让你知道什么是错的。

如果这没有帮助,请考虑使用嵌套诊断上下文 。

是否可以在通过属性加载时,在创建AppServerLoggerFactory之前实例化AppServerLoggerFactory ? 如果您在创建时选择自定义字段的值,而不是在第一次使用时可能是一个解释。

我不确定您是否会通过属性配置实现此目的,但我认为您可以使用XML执行此操作,这为您提供了许多自定义选项:

                    

您需要在AppServerLoggerFactory为服务器,组件和版本定义setter。 另外,在xml配置文件的一般布局上读取log4j.dtd

将此文件另存为log4j.xml,并在启动脚本中定义-Dlog4j.configuration = / path / to / log4j.xml,或将log4j.properties替换为web-app中的log4j.xml。

我之前从未尝试过自定义LoggerFactory,但可能是因为它是由配置器安装的,所以你可以使用标准的getLogger工厂调用,例如

 //Logger logger = AppServerLogger.getLogger("some.log"); Logger logger = Logger.getLogger("some.log");