如何创建滚动日志文件

How to create rolling log file

我似乎无法获得滚动日志文件。

我的 logback.xml 配置如下:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date %level %thread %X{jobid} %logger{20}.%method\(%line\) %msg%n</pattern>
    </encoder>
</appender>

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator>
        <key>logFileName</key>
        <defaultValue>unknown</defaultValue>
    </discriminator>
    <sift>
        <appender name="FILE-${logFileName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${catalina.base}/logs/${logFileName}.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${catalina.base}/logs/${logFileName}_%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>%date %level %thread %X{jobid} %logger{20}.%method\(%line\) %msg%n</pattern>
            </encoder>
        </appender>
    </sift>
</appender>


<root level="INFO">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="SIFT" />
</root>

一旦 Tomcat 启动并加载应用程序,我就可以看到日志文件 "unknown.log"。那是因为我还没有在代码中设置logFileName。

但是,我没有看到滚动文件。即使等了几分钟。

根据 logback documentation 模式“%d{yyyy-MM-dd_HH-mm}”应该创建每分钟的滚动时间策略。

我没有看到创建的新日志文件。

更新:

我添加了 STDOUT 附加程序。现在我在 catalina.out 日志中看到了。

有意思。来自 SIFT 的 "unknown.log" 文件中的条目在分钟停止时停止。之后没有任何内容写入 SIFT 文件,但我不断在 catalina.out:

中获取条目
2015-12-09 16:31:22,269 INFO Thread1 RlQti5b0QYybZvRuHi/m c.l.l.w.Worker.consumeMessage(51) Rcvd: job.complete.
2015-12-09 16:31:49,654 INFO Thread1 mY0E7sV7QZyTRZAw9UwV c.l.l.w.Worker.consumeMessage(51) Rcvd: job.complete.
2015-12-09 16:31:51,812 INFO Thread1 WWjuyzH+RmCa35JcxRJy c.l.l.w.Worker.consumeMessage(51) Rcvd: job.complete.
2015-12-09 16:31:58,977 INFO Thread1 jUdqB1DaQ8KxajDFk6jN c.l.l.w.Worker.consumeMessage(51) Rcvd: job.complete.

只是猜测 - 可能是因为您没有记录任何内容。他们就是这样"lazy"。

从 fileNamePattern 中删除 %i 似乎可以解决问题。我猜索引 (%i) 只允许用于 FixedWindowRollingPolicy。

试试这个

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
    <property name="USER_HOME" value="\logs" />

    <appender name="FILE-THREAD" class="ch.qos.logback.classic.sift.SiftingAppender">

        <!-- This is MDC value -->
        <!-- We will assign a value to 'logFileName' via Java code -->
        <discriminator>
            <key>logFileName</key>
            <defaultValue>head0</defaultValue>
        </discriminator>

        <sift>

            <!-- A standard RollingFileAppender, the log file is based on 'logFileName' 
                at runtime -->
            <appender name="FILE-${logFileName}"
                class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>${USER_HOME}/${logFileName}.log</file>

                <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                    <Pattern>
                        %d{yyyy-MM-dd HH:mm:ss} %mdc [%thread] %level %logger{35}
                        - %msg%n
                    </Pattern>
                </encoder>

                <rollingPolicy
                    class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                    <FileNamePattern>${USER_HOME}/${logFileName}.%i.log.zip
                    </FileNamePattern>
                    <MinIndex>1</MinIndex>
                    <MaxIndex>10</MaxIndex>
                </rollingPolicy>

                <triggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                    <MaxFileSize>10MB</MaxFileSize>
                </triggeringPolicy>

            </appender>

        </sift>
    </appender>