代码之家  ›  专栏  ›  技术社区  ›  Scott Cowan

Log4J自定义字段

  •  17
  • Scott Cowan  · 技术社区  · 16 年前

    我正在尝试使用log4j记录其他字段,它可以工作,但只有在代码中创建appender时,而不是在log4j.properties中

    进展:

    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");
    

    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}
    
    3 回复  |  直到 16 年前
        1
  •  5
  •   Aaron Digulla    16 年前

    AppServerPatternLayout 包裹里没有 logging . 其他一切看起来都很好。添加

    log4j.DEBUG=true
    

    到您的属性文件。然后,log4j将在读取属性时转储它所做的事情。也许这会让你知道怎么了。

    Nested Diagnostic Contexts .

        2
  •  2
  •   rsp    16 年前

    AppServerPatternLayout 在 AppServerLoggerFactory

        3
  •  2
  •   Alexander Pogrebnyak    16 年前

    我不确定您是否可以通过属性配置实现这一点,但我认为您可以通过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");