log4j - 写入文件名作为记录器名称

时间:2021-06-09 17:29:12

标签: java xml logging log4j log4j2

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

有可能吗?

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

这是我使用的 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>

我尝试使用:<Property name="file-name" value="%logger"/> 就像在 PatternLayout 和 <Property name="file-name" value="%c{10}"/> witout secssus 中的使用一样...

1 个答案:

答案 0 :(得分:0)

你不能用 RollingFileAppender 那样做。 appender 接收由您的 <Loggers> 块配置的日志事件,如果 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。它是一个 Appender,它为每个 LoggerName 创建一个 RollingFileAppender。它仅在您使用 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$ 创建的日志文件。

相关问题