介绍:

我试图获取其他字段以使用log4j及其工作日志进行记录,但是仅当我在代码中而不是在log4j.properties中创建附加程序时

进展:

  • 本文将Adding Conversion Characters to PatternLayout用于log4j 1.1.3
  • 制作了sample app for log4j 1.2

  • 问题:

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

    07-26 00:05
    查看更多