java - Log4J 自定义字段

标签 java log4j

简介:

我正在尝试获取其他字段以使用 log4j 进行记录,并且它可以工作,但仅当我在代码中而不是在 log4j.properties 中创建 appender 时才有效

进度:

  1. 使用了这篇文章 Adding Conversion Characters to PatternLayout对于 log4j 1.1.3
  2. 取得了 sample app for log4j 1.2

问题:

使用它将运行的属性文件,但不会使用 AppServerPatternLayout,因此不会显示自定义字段。

Download Code

自定义日志属性

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}

最佳答案

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

log4j.DEBUG=true

到您的属性文件。然后 log4j 将在读取属性时转储它所做的事情。也许这让您知道出了什么问题。

如果这没有帮助,请考虑使用 Nested Diagnostic Contexts .

关于java - Log4J 自定义字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687473/

相关文章:

java - Android Studio 中不同 java 文件中的类似导入是否会导致应用程序大小增加?

java - 无法从始终为空的包中获取值

java - 如何在 pom.xml 中设置类路径?

java - Log4J:备份文件名带有sysdate

java - 使用 AES 算法解密消息时异常 :Given final block not properly padded

java - 对于何时编写静态方法与实例方法,是否有经验法则?

java - 如果没有更改 thrift 文件,如何防止 java 代码的日期重新生成?

java - 设置日志文件名以在 Log4j 中包含当前日期

java - 如何使用 Apache Chainsaw 打开 log4j2 日志

grails - 如何在Grails Log4j DSL中使用xml或html布局