【问题标题】:Does log4j support JSON format?log4j 支持 JSON 格式吗?
【发布时间】:2015-04-01 09:17:33
【问题描述】:

是否可以仅通过更改log4j.properties.xml 配置文件让 log4j 以 JSON 格式输出其日志记录?
我使用了一个使用log4j 1.2 的旧应用程序。我只看到 XML 布局,没有看到 JSON 布局。

【问题讨论】:

    标签: java json log4j


    【解决方案1】:

    这是官方的 JSON 布局

    https://github.com/logstash/log4j-jsonevent-layout

    1) 添加maven依赖https://mvnrepository.com/artifact/net.logstash.log4j/jsonevent-layout

    <dependency>
        <groupId>net.logstash.log4j</groupId>
        <artifactId>jsonevent-layout</artifactId>
        <version>1.7</version>  
    </dependency>
    

    2) 将配置添加到您的 log4j.properties 文件中

     log4j.rootCategory=WARN, RollingLog
     log4j.appender.RollingLog=org.apache.log4j.DailyRollingFileAppender
     log4j.appender.RollingLog.Threshold=TRACE
     log4j.appender.RollingLog.File=api.log
     log4j.appender.RollingLog.DatePattern=.yyyy-MM-dd
     log4j.appender.RollingLog.layout=net.logstash.log4j.JSONEventLayoutV1
    

    【讨论】:

    • 不幸的是,步骤 1 与 OP 中的“仅更改 log4j.properties.xml 配置文件”冲突。
    【解决方案2】:

    只需使用内置 PatternLayout 即可:

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.encoding=UTF-8
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern={"debug_level":"%p","debug_timestamp":"%d{ISO8601}","debug_thread":"%t","debug_file":"%F", "debug_line":"%L","debug_message":"%m"}%n
    

    会像这样:

    {
        "debug_level" : "INFO",
        "debug_timestamp" : "2016-05-26 16:37:08,938",
        "debug_thread" : "main",
        "debug_file" : "TestLogOutPut.java",
        "debug_line" : "316",
        "debug_message" : "hello i am a log message"
    }
    

    【讨论】:

    • 如果消息包含",这将中断。
    • 当错误信息中包含“\n”等时,这个不能工作
    • 我知道这是一个老话题,但我遇到了同样的问题。我只能访问 log4j.xml 配置代码,而不能访问代码本身。在 .xml 配置文件中,我尝试了许多这样的组合: { 'jsonPayload': { 'timestamp':"%d{ISO8601}", 'level' :"%p", 'category':"%c", 'message':"%m" } }%n
    • 本质上是穷人的 JSON,只能在最简单的情况下工作。
    • 绝对是,但如果您正在处理旧版应用程序,则没有可行的替代方案......除了放弃 JSON 的想法,并使用不会与日​​志中已有任何内容发生冲突的分隔符输出。
    【解决方案3】:

    是的,这是可能的。 Take a look at this link 它可以生成

    {
       "timestamp":1352412458890,
       "date":"Nov 8, 2012 10:07:38 PM",
       "hostname":"michael1",
       "username":"michael",
       "level":"INFO",
       "thread":"main",
       "classname":"uk.me.mjt.log4jjson.SimpleJsonLayoutTest",
       "filename":"SimpleJsonLayoutTest.java",
       "linenumber":25,
       "methodname":"testDemonstration",
       "message":"Example of some logging"
     }
    

    【讨论】:

      【解决方案4】:

      我使用 logback.xml 和下面的模式

      <appender name="Console"
                class="ch.qos.logback.core.ConsoleAppender">
          <layout class="ch.qos.logback.classic.PatternLayout">
              <Pattern>
                  {"level":"%p","timestamp":"%d{ISO8601}","thread":"%t","file":"%F", "line":"%L","message":"%m"}%n
              </Pattern>
          </layout>
      </appender>
      

      它会生成 json 格式的日志。我正在使用带有 springboot 依赖项的 log4j。

      {"level":"INFO","timestamp":"2020-09-22 15:26:38,354","thread":"main","file":"StartupInfoLogger.java", "line":"55","correlationId":"","message":"Starting Application on XX with PID 88794 (/Users/Documents/target/classes started by xxx in /Users/Documents)"}
      

      【讨论】:

      • 确保你有正确的依赖,logback-core:1.2.3 和 logback-classic:1.2.3
      猜你喜欢
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      相关资源
      最近更新 更多