【问题标题】:log4j - write to file name as the logger namelog4j - 写入文件名作为记录器名称
【发布时间】:2021-08-26 17:57:24
【问题描述】:

我正在尝试根据记录器名称将我的日志写入不同的文件...

有可能吗?

如何在目标文件名中使用记录器名称?

这是我使用的 XML 文件:

<Configuration status="info">
<Properties>
    <Property name="log-path" value="logs/"/>
    <Property name="file-name" value="server"/>
    <Property name="file-type" value=".log"/>
</Properties>
<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5level %logger - %msg%n"/>
    </Console>
    <RollingFile name="File" fileName="${log-path}${file-name}${file-type}"
                 filePattern="${file-name}-%d{yyyy.MM.dd_HH.mm.ss}-%i.log">
        <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5level %logger - %msg%n"/>
        <SizeBasedTriggeringPolicy size="1 MB"/>
    </RollingFile>
</Appenders>
<Loggers>
    <Root level="info">
        <AppenderRef ref="File"/>
        <AppenderRef ref="Console"/>
    </Root>
</Loggers>

我尝试过使用:&lt;Property name="file-name" value="%logger"/&gt; 就像在 PatternLayout 中的使用和&lt;Property name="file-name" value="%c{10}"/&gt; witout secssus...

【问题讨论】:

    标签: java xml logging log4j log4j2


    【解决方案1】:

    你不能用 RollingFileAppender 那样做。 appender 接收由 &lt;Loggers&gt; 块配置的日志事件,如果 log4j 向它发送具有不同 LoggerNames 的日志事件,它们将被附加到打开的任何文件中。 RollingFileAppender 一次写入一个文件,并在配置的策略告诉它时滚动。

    您可以通过设置多个针对不同 appender 的 Logger 来写入不同的文件。像这样:

    <Configuration status="info">
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5level %logger - %msg%n"/>
            </Console>
            <RollingFile name="FileA"
                         filePattern="/tmp/A-%d{yyyy.MM.dd_HH.mm.ss}-%i.log">
                <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5level %logger - %msg%n"/>
                <SizeBasedTriggeringPolicy size="1 MB"/>
            </RollingFile>
            <RollingFile name="FileB"
                         filePattern="/tmp/B-%d{yyyy.MM.dd_HH.mm.ss}-%i.log">
                <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5level %logger - %msg%n"/>
                <SizeBasedTriggeringPolicy size="1 MB"/>
            </RollingFile>
        </Appenders>
        <Loggers>
            <Logger name="org.example.App" level="info" additivity="false">
                <AppenderRef ref="FileA"/>
            </Logger>
            <Logger name="org.example.App2" level="info" additivity="false">
                <AppenderRef ref="FileB"/>
            </Logger>
            <Root level="info">
                <AppenderRef ref="Console"/>
            </Root>
        </Loggers>
    </Configuration>
    

    要根据某种模式将每个事件路由到不同的 RollingFileAppender,您可以使用 RoutingAppender

    RoutingAppender 评估 LogEvents,然后将它们路由到从属 Appender。目标 Appender 可以是之前配置的 appender,可以通过其名称引用,也可以根据需要动态创建 Appender。 RoutingAppender 应该在它引用的任何 Appender 之后配置,以允许它正确关闭。

    您还可以使用脚本配置 RoutingAppender:您可以在 appender 启动以及为日志事件选择路由时运行脚本。

    以下是根据 LoggerName 进行路由的方法:

    <Configuration status="info">
        <Properties>
            <Property name="log-path" value="logs/"/>
            <Property name="file-name" value="server"/>
            <Property name="file-type" value=".log"/>
        </Properties>
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5level %logger - %msg%n"/>
            </Console>
            <Routing name="Routing">
                <Routes pattern="$${event:Logger}">
                    <Route>
                        <RollingFile name="Rolling-${event:Logger}" fileName="${log-path}${file-name}-${event:Logger}${file-type}"
                                     filePattern="${file-name}-%d{yyyy.MM.dd_HH.mm.ss}-%i-${event:Logger}.log">
                            <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5level %logger - %msg%n"/>
                            <SizeBasedTriggeringPolicy size="1 MB"/>
                        </RollingFile>
                    </Route>
                </Routes>
            </Routing>
        </Appenders>
        <Loggers>
            <Root level="info">
                <AppenderRef ref="Routing"/>
                <AppenderRef ref="Console"/>
            </Root>
        </Loggers>
    </Configuration>
    

    另外,出于兴趣,如果你真的想要,你可以implement your own Appender 对 LogEvent 做任何你想做的事情。

    这是very rough start。它是一个为每个 LoggerName 创建一个 RollingFileAppender 的 Appender。它仅在您使用 SizeBasedTriggeringPolicy 时才有效。您应该能够将这样的类放到您的项目中并使用 XML,例如:

    <Configuration status="info">
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5level %logger - %msg%n"/>
            </Console>
            <FilePerLoggerNameAppender name="File"
                         filePattern="/tmp/log-%d{yyyy.MM.dd_HH.mm.ss}-%i-$LOGGER$.log">
                <PatternLayout pattern="%d{dd.MM.yyyy HH:mm:ss.SSS} %-5level %logger - %msg%n"/>
                <SizeBasedTriggeringPolicy size="1 MB"/>
            </FilePerLoggerNameAppender>
        </Appenders>
        <Loggers>
            <Root level="info">
                <AppenderRef ref="File"/>
                <AppenderRef ref="Console"/>
            </Root>
        </Loggers>
    </Configuration>
    

    并查看使用您的记录器名称替换的 $LOGGER$ 创建的日志文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多