【问题标题】:Rolling logback logs on filesize and time在文件大小和时间上滚动 logback 日志
【发布时间】:2011-02-05 20:12:04
【问题描述】:

我一直在尝试设置一个简单的 logback 项目来按日期和文件大小滚动我的日志文件,但到目前为止,我一直无法让我的 appender 滚动到另一个文件。相反,它写入由 标签指定的日志。

这是我的 logback.xml 配置文件:

<?xml version="1.0"?>
<configuration scan="true" scanPeriod="10 seconds">
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </layout>
    </appender>

    <appender name="milliroller" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>log/output.log</file>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </layout>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>log/mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>1KB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="stdout"/>
        <appender-ref ref="milliroller"/>
    </root>

    <logger name="com.tkassembled.logback" level="DEBUG"/>
</configuration>

乍一看,它应该可以工作,对吧?有什么我做错了吗?我的整个可构建项目在此处以 zip 的形式提供:http://www.mediafire.com/file/2bxokkdyz2i/logback.zip

【问题讨论】:

    标签: java logging logback


    【解决方案1】:

    虽然这是一个老问题,但我觉得一个可行的答案适合帮助任何需要这种实施的人。

    我使用以下 logback 配置来提供 HTML 日志,按日期和文件大小滚动,以及记录到控制台以进行调试输出。

    日志文件存储在logs 目录中,其活动时名称为logFile.html,滚动时名称为logFile.2013-mm-dd.i.html,其中i 是50MB 日志文件的数量。例如logFile.2013-01-07.0.html

    <configuration>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
          <charset>UTF-8</charset>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{35}) - %msg %n</pattern>
        </encoder>
      </appender>
    
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs\logFile.html</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <!-- daily rollover -->
          <fileNamePattern>logs\logFile.%d{yyyy-MM-dd}.%i.html</fileNamePattern>
          <timeBasedFileNamingAndTriggeringPolicy
              class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
              <!-- or whenever the file size reaches 50MB -->
            <maxFileSize>50MB</maxFileSize>
          </timeBasedFileNamingAndTriggeringPolicy>
          <!-- keep 30 days' worth of history -->
          <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          <charset>UTF-8</charset>
          <layout class="ch.qos.logback.classic.html.HTMLLayout">
            <pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern>
          </layout>         
        </encoder>
      </appender> 
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />     
      </root>
    
    </configuration>
    

    【讨论】:

    • 参见AndreLDM's answer,此配置记录SizeAndTimeBasedFNATP is deprecated.debug=true 选项在logback.xml
    • 根据我的测试maxHistory 不是天数,而是文件数,所以如果你每天有更多的文件,你就会有更少的天...
    • 好的,我测试了更多,它似乎是周期数,yyyy-MM-dd 是天数,yyyy-MM-dd-HH 是小时数,可以在周期内处理多个文件。
    【解决方案2】:

    自 logback 1.1.7(2016 年 3 月发布)以来,可以使用名为 SizeAndTimeBasedRollingPolicy 的新策略,它极大地简化了您需要执行的操作:

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>app-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>    
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>
    

    更多信息请参见here

    【讨论】:

    • 根据我的测试maxHistory 不是天数,而是文件数,所以如果你每天有更多的文件,你就会有更少的天...
    • 除非它是一个错误,否则documentation 清楚maxHistory 是天数(注意xml 注释)。
    • 不是真的,documentation 读作“可选的 maxHistory 属性控制要保留的存档文件的最大数量...”,他们的每月翻转示例有点令人困惑,XML 中的注释确实是错误的.我会给他们发一封电子邮件,然后通知你。
    • 好的,我测试了更多,它似乎是周期数,yyyy-MM-dd 是天数,yyyy-MM-dd-HH 是小时数,可以在周期内处理多个文件。
    猜你喜欢
    • 2012-12-05
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多