如何在log4j2-spring.xml中设置Log Pattern来记录Class Method和Line

wkyowqbh  于 2023-06-05  发布在  Spring
关注(0)|答案(1)|浏览(115)

我试图设置日志模式打印类方法和日志文件行。下面是我的配置。它与控制台工作正常,但不与异步工作

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
    <Property name="LOG_PATTERN" value="%d [%thread] [%-5level] [%class{36}.%M %L] [Content-Id:%X{contentId}] [Request-Id:%X{requestId}] [%c{1.}] - %msg%n" />
    <Property name="LOG_DIR" value="logs" />
    <Property name="SYSTEM_FILE" value="application.log" />
</Properties>
<Appenders>

    <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
        <PatternLayout pattern="${LOG_PATTERN}" />
    </Console>
    <Async name="Async">
        <AppenderRef ref="FileAppender" />
    </Async>

    <RollingFile name="FileAppender"
        fileName="${LOG_DIR}/${SYSTEM_FILE}"
        filePattern="${LOG_DIR}/${SYSTEM_FILE}-%d{yyyy-MM-dd}-%i.log">
        <PatternLayout>
            <Pattern>${LOG_PATTERN}</Pattern>
        </PatternLayout>
        <Policies>
            <SizeBasedTriggeringPolicy size="10MB" />
        </Policies>
        <DefaultRolloverStrategy max="100" />
    </RollingFile>
</Appenders>

<Loggers>

    <Logger name="com.myproject" level="debug" additivity="false">
        <AppenderRef ref="ConsoleAppender" />
        <AppenderRef ref="Async" />
    </Logger>
    
    <Root level="info">
        <AppenderRef ref="ConsoleAppender" />
        <AppenderRef ref="Async" />
    </Root>
</Loggers>

我正在使用此**[%class{36}.%M %L]**模式来记录类方法和行。
感谢您的支持。

bqucvtff

bqucvtff1#

在Java中,检索调用者位置是一项开销很大的操作。它总是需要某种堆栈遍历。
如果一切都是同步的,Log4j会在需要时延迟检索位置。但如果appender或logger是异步的,则必须在跳转线程之前检索位置。对于异步元素,这会使日志记录速度降低5到20倍。这就是为什么在这些情况下,默认情况下位置是禁用的。
您可以使用includeLocation属性启用位置:

  • 对于异步附加用途:
<Async name="Async" includeLocation="true">
    <AppenderRef ref="FileAppender" />
</Async>
  • 对于异步日志记录器(需要额外的依赖项,参见documentation)用途:
<AsyncLogger name="com.myproject"
             level="DEBUG"
             additivity="false"
             includeLocation="true">
    <AppenderRef ref="ConsoleAppender" />
</AsyncLogger>

另一种解决方案(如果您使用Maven)是使用最近发布的log4j-transform-maven-plugin,它在编译时计算位置,因此不再需要运行时查找,位置始终可用。只需将其添加到您的POM文件(参见documentation):

<build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-transform-maven-plugin</artifactId>
        <version>0.1.0</version>
        <executions>
          <execution>
            <goals>
              <goal>process-classes</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
    [...]
  </build>

免责声明:我是log4j-maven-transform-plugin的主要作者。

相关问题