2014-01-29 80 views
5

我有一个XML配置,我想转换为JSON。 JSON版本没有被Log4j加载,我找不到任何拼写错误。我的测试代码只需记录一个ERROR级别和一个DEBUG级别的消息。只有ERROR消息正在显示,没有文件输出正在生成 - 我假设框架回落到默认初始化,而不是JSON文件。Log4j 2 JSON配置

注意:log4j2-test.json文件位于类路径中。

我正在使用apache-log4j-2.0-beta9二进制文件found here

XML配置如下:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration name="Test"> 
    <Properties> 
     <Property name="Directory">${sys:user.home}/logs</Property> 
     <Property name="Filename">test.log</Property> 
    </Properties> 
    <Appenders> 
     <Console name="Console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
     </Console> 
     <RollingFile name="File" 
      fileName="${Directory}/${Filename}" 
      filePattern="${Directory}/${date:yyyy-MM}/test-%d{MM-dd-yyyy}-%i.log.gz"> 
      <PatternLayout> 
       <pattern>%d %p %logger{36} [%t] %m%n</pattern> 
      </PatternLayout> 
      <Policies> 
       <SizeBasedTriggeringPolicy size="1 MB"/> 
      </Policies> 
      <DefaultRolloverStrategy max="10"/> 
     </RollingFile> 
    </Appenders> 
    <Loggers> 
     <Root level="debug"> 
      <AppenderRef ref="Console"/> 
      <AppenderRef ref="File"/> 
     </Root> 
    </Loggers> 
</Configuration> 

和JSON配置是:

{ 
    "configuration": { 
     "name": "Default", 
     "properties": { 
     "property": { 
      "name":"Directory", 
      "value":"${sys:user.home}/logs" 
     }, 
     "property": { 
      "name":"FileName", 
      "value":"test.log" 
     } 
     }, 
     "appenders": { 
     "Console": { 
      "name":"Console", 
      "target":"SYSTEM_OUT", 
      "PatternLayout": { 
       "pattern":"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" 
      } 
     }, 
     "RollingFile": { 
      "name":"File", 
      "fileName":"${Directory}/${FileName}", 
      "filePattern":"${Directory}/${date:yyyy-MM}/test-%d{MM-dd-yyyy}-%i.log.gz", 
      "PatternLayout": { 
       "pattern":"%d %p %logger{36} [%t] %m%n" 
      }, 
      "Policies": { 
       "SizeBasedTriggeringPolicy": { 
        "size":"1 MB" 
       } 
      }, 
      "DefaultRolloverStrategy": { 
       "max":"10" 
      } 
     } 
     }, 
     "loggers": { 
     "root": { 
      "level":"debug", 
      "appender-ref": { 
       "ref":"Console" 
      }, 
      "appender-ref": { 
       "ref":"File" 
      } 
     } 
     } 
    } 
} 

回答

10

我找到了解决该问题。

事实证明,该Log4j 2 Configuration不会记录所有必需的依赖关系:

的JSON支持使用杰克逊数据处理器解析JSON 文件。这些依赖关系必须被添加到想要使用 JSON用于配置的项目:

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.8.7</version> 
</dependency> 

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.8.7</version> 
</dependency> 

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-annotations</artifactId> 
    <version>2.8.7</version> 
</dependency> 
+0

谢谢 - 我会将其添加到配置文档中。任何关于log4j用户或开发人员名单的反馈将不胜感激。 – Scott

+0

很高兴我能帮到你。一旦我拥有了正确的依赖关系,一切都顺利进行。好东西! – bblincoe

3

我相信,我有一个额外的修正被张贴的JSON配置。对我来说,这部分产生的问题:

"properties": { 
    "property": { 
     "name":"Directory", 
     "value":"${sys:user.home}/logs" 
    }, 
    "property": { 
     "name":"FileName", 
     "value":"test.log" 
    } 
    }, 

在我的设置,这将输出〜/日志/ $ {文件名}或〜/ $ {电话簿} /test.log,这意味着它只是一个插值的属性而不是两者。

我从中得出结论,这些属性没有在JSON格式中正确指定。为了修正它,我所指定的属性作为JSON阵列

"properties": { 
     "property": [{ 
      "name":"Directory", 
      "value":"${sys:user.home}/logs" 
     }, 
     { 
      "name":"FileName", 
      "value":"test.log" 
     }] 
    }, 

有了这个地方,它似乎解决的问题,并正确地输出到〜/日志/ test.log中

我的设置是log4j2 2.0 .2在Mac上与tomcat 7.0.55

2

你有另一个缺陷可能会抓住你,我遇到了log4j json。

"appender-ref": { 
    "ref":"Console" 
}, 
"appender-ref": { 
    "ref":"File" 
} 

试试这个,因为它是现在,它只会捕获一个appender。

"appender-ref": [{ 
    "ref":"Console" 
}, 
{ 
    "ref":"File" 
}]