首页 > 解决方案 > SLF4J LogBack - 多个记录器和附加器

问题描述

我需要有关我所拥有的日志记录要求的指导。我的应用程序有两个服务 - 上传和下载。我需要为两者维护单独的日志 - 到目前为止,我已经在 logback.xml 中完成了以下操作

<appender name="DownloadAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>download.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>download.log_%d{yyyy-MM-dd}_%i.zip</fileNamePattern>
        <maxFileSize>100MB</maxFileSize>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>%date [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>

    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
            <expression>logger.equals("DownloadLogger")</expression>
        </evaluator>
        <OnMismatch>DENY</OnMismatch>
        <OnMatch>ACCEPT</OnMatch>
    </filter>
</appender>

<appender name="UploadAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>upload.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>upload.log_%d{yyyy-MM-dd}_%i.zip</fileNamePattern>
        <maxFileSize>100MB</maxFileSize>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>%date [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>

    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
            <expression>logger.equals(UploadLogger")</expression>
        </evaluator>
        <OnMismatch>DENY</OnMismatch>
        <OnMatch>ACCEPT</OnMatch>
    </filter>
</appender>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>
            %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>

<logger name="DownloadLogger" level="DEBUG" additivity="true">
    <appender-ref ref="DownloadAppender" />
</logger>

<logger name="UploadLogger" level="DEBUG" additivity="true">
    <appender-ref ref="UploadAppender" />
</logger>

<root level="DEBUG">
    <appender-ref ref="STDOUT"/>
</root>

应用程序中定义的记录器的使用由相应的服务类使用。即上传服务类获取记录器

LoggerFactory.getLogger("UploadLogger")

对于 DownloadLogger,反之亦然。

运行该服务后,我注意到仅创建并填写了 upload.log。创建了 download.log,但其中没有记录任何内容。

我怀疑过滤器的使用不正确,但我找不到任何解决方案,以便可以正确维护两个日志文件。

有人可以帮助我如何更正配置吗?

标签: logbackslf4j

解决方案


上面的配置适合这个目的。问题在于 logback.xml 作为命令行参数提供的方式。

为 logback.xml 提供 -Dlogback.configurationFile 后问题得到解决


推荐阅读