首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Log4J自定义域

Log4J自定义域
EN

Stack Overflow用户
提问于 2009-11-06 21:02:47
回答 3查看 24K关注 0票数 17

简介:

我正在尝试用log4j记录额外的字段,并且只有在我用代码而不是在log4j.properties中创建附加器时它才能起作用

进度:

  1. 将这篇文章用于Adding Conversion Characters to PatternLayout log4j 1.1.3
  2. Made a sample app for log4j 1.2

问题:

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

Download Code

customlog.properties

代码语言:javascript
复制
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日志记录

代码语言:javascript
复制
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日志记录

代码语言:javascript
复制
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");

预期输出

代码语言:javascript
复制
----------------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

实际产出

代码语言:javascript
复制
-----------------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,您可以添加自定义字段,如

代码语言:javascript
复制
MDC.put("Version", versionName);
Logger log = LogManager.getLogger("some.log");        
log.info("Hello");

并在log4j.properties中使用大写X将其拉出

代码语言:javascript
复制
log4j.appender.stdout.layout.ConversionPattern=%X{Version}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-06 21:21:24

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

代码语言:javascript
复制
log4j.DEBUG=true

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

如果这还不能解决问题,考虑使用Nested Diagnostic Contexts

票数 5
EN

Stack Overflow用户

发布于 2009-11-06 21:16:32

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

票数 2
EN

Stack Overflow用户

发布于 2009-11-06 21:34:23

我不确定您是否可以通过属性配置来实现这一点,但我认为您可以使用XML来实现这一点,它为您提供了许多自定义选项:

代码语言:javascript
复制
<?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工厂调用,例如

代码语言:javascript
复制
//Logger logger = AppServerLogger.getLogger("some.log");
Logger logger = Logger.getLogger("some.log");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1687473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档