【问题标题】:Need to append params to each and every log before - in log4j in java需要在每个日志之前附加参数 - 在 java 的 log4j 中
【发布时间】:2018-02-21 18:02:28
【问题描述】:

我需要将变量附加到每个日志的记录器中。 必须更新配置 log4J 文件以更新每个日志输出的打印语句。此信息应位于每个日志语句的开头。

如果您查看其中一个日志输出: “2018-02-02 15:34:43 INFO TestClass:135 - 开始时间戳为:1517585580000,HHmm 为:1533” 我需要编辑“-”之前的部分 即 1533 param1 Param2 时间戳 2018-02-02 15:34:43 INFO TestClass:135 - - 开始时间戳为:1517585580000,HHmm 为:1533。 注意:参数因日志而异,我可以通过 logger.info 传递它们。 谁能帮我解决这个问题?

【问题讨论】:

    标签: java log4j log4j2


    【解决方案1】:

    通过在 log4j2.xml 或 log4j2.properties 文件中使用 ThreadContext 和模式,获得了预期的输出。请找到下面的代码。 log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
      <Appenders>
    
    <!--     Console Appender -->
        <Console name="Console" target="SYSTEM_OUT">
          <PatternLayout
            pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L %X{param1} %X{param2} %X{param3} - %m%n" />
        </Console>
    
      </Appenders>
      <Loggers>
        <Root level="all">
          <AppenderRef ref="Console" />
        </Root>
      </Loggers>
    </Configuration>
    

    log4j2.properties

    # Root logger option
    log4j.rootLogger=INFO, file, stdout
    
    # Direct log messages to stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L %X{param1} %X{param2} %X{param3} - %m%n
    

    在 JAVA 文件中

    package com.test;
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.apache.logging.log4j.ThreadContext;
    
    public class Test {
    public static void ThreadContextLoggerCreation(long param1, String param2, String param3) {
            ThreadContext.push(UUID.randomUUID().toString()); // Add the fishtag;
            ThreadContext.put("param1", param1);
            ThreadContext.put("param2", param2);
            ThreadContext.put("param3", param3);
            ThreadContext.pop();
        }
    
        public static void ThreadContextLoggerClear() {
            ThreadContext.clearAll();
        }
    public static void main(String args[]) {
     Logger logger =  LogManager.getLogger(Test.class);   LogUtil.ThreadContextLoggerCreation(logger,currentTime,customerId,agentLocation,streamId,streamVariant,levelOfDetail);
                logger.info("Current Time of execution(HHmm) is: {}",BatchTimeUtil.convertTimestampToReadableDate(currentTime));
    }
    }
    

    【讨论】:

      【解决方案2】:

      您可能正在寻找自定义布局。下面的文章应该对你有所帮助。简而言之,创建自定义布局,设置您自己的转换字符并相应地处理日志消息(& object var args)以将转换字符替换为适当的动态值。

      http://www.wideskills.com/log4j-tutorial/10-custom-appender-and-layout-in-log4j

      https://fw-geekycoder.blogspot.in/2010/07/creating-log4j-custom-patternlayout.html

      您可以在 log4j/log4j2 中尝试 MDC/ThreadContext。这将允许您通过简单的 Map 提供动态日志信息,并使用自定义模式字符串在您的日志布局中提供这些信息。请看下面这方面的文章-

      http://www.baeldung.com/mdc-in-log4j-2-logback

      【讨论】:

      • 通过使用 MDC 和 ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L %X{param1} %X{param2} % X{param3} - %m%n 我需要在 log4j2.xml 中进行此配置。有人可以帮忙吗?
      • 您需要做的就是在记录消息之前将值放入 M​​DC(映射)中,并在完成后将其清除。请说明您在这方面需要什么样的帮助。
      • 我已经在 log4j.properties 文件中使用 MDC(map) 完成了该操作,但 ConversionPattern 在 log4j2.xml 中不起作用。我需要配置 log4j2.xml。任何快速的解决方案都对我有很大帮助!!提前致谢!
      • 我使用了 ThreadContext 并设置了所需的参数,但无法通过 logger.info 打印出来。但是,当我尝试使用带有 StructuredDataMessage 的 EventLogger 时,它会将该参数附加到我添加到 ThreadContext 的任何内容中。我很困惑。有什么想法吗?
      • 代替静态Logger logger = Logger.getLogger(Test.class);我使用了静态 Logger logger = LoggerManager.getLogger(Test.class);它按预期工作。
      猜你喜欢
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多