【问题标题】:Can I have Below Log files structure using log4j?我可以使用 log4j 获得以下日志文​​件结构吗?
【发布时间】:2016-04-30 10:14:15
【问题描述】:

期望当前日志具有相同的名称(即 test.log) 并且归档文件名应该是 test_(CurrentDate).log.1。

/logs/projectlogs/test.log

/logs/projectlogs/test_20160430.log.1

/logs/projectlogs/test_20160430.log.2

/logs/projectlogs/test_20160430.log.3

使用下面的属性文件,当前日期将附加到所有文件中。

log4j.properties::

log4j.rootLogger= ALL, A1, file, rollingAppender
#log4j.date=contains current date
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:/logs/projectlogs/test_${log4j.date}.log
log4j.appender.file.MaxFileSize=100KB
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS zzz} %-5p[%t]  %m%n

【问题讨论】:

    标签: java date logging log4j log4j2


    【解决方案1】:

    log4j 2 手册有很多示例配置,RollingFileAppender 部分有一个符合您要求的示例:

    http://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="warn" name="MyApp" packages="">
      <Appenders>
        <RollingFile name="RollingFile" fileName="logs/projectlogs/test.log"
                     filePattern="logs/projectlogs/$${date:yyyy-MM}/test-%d{yyyy-MM-dd-HH}-%i.log.gz">
          <PatternLayout>
            <Pattern>%d %-5p[%t] %c{1.} %m%n</Pattern>
          </PatternLayout>
          <Policies>
            <TimeBasedTriggeringPolicy interval="5" modulate="true"/>
            <SizeBasedTriggeringPolicy size="100 MB"/>
          </Policies>
        </RollingFile>
      </Appenders>
      <Loggers>
        <Root level="trace">
          <AppenderRef ref="RollingFile"/>
        </Root>
      </Loggers>
    </Configuration>
    

    您可能还感兴趣的是,Log4j-2.5 引入了删除操作,使用户可以更好地控制在翻转时删除哪些文件。见http://logging.apache.org/log4j/2.x/manual/appenders.html#CustomDeleteOnRollover

    【讨论】:

    • 您的原始配置使用了 Log4j 1.x。要利用 Log4j 2 功能,您无需重新编码您的应用程序。相反,只需包含 log4j-1.2-api jar。这将允许对 Log4j 1.2 API 的调用路由到 Log4j 2。
    • @Remko Popma :这个解决方案对我有用,非常感谢。
    • @Remko Popma:只是一个问题,我们可以使用 log4j1.x 实现这个功能吗?
    • 我不这么认为。反正。 Log4j1.x 自 2015 年 8 月起终止使用。您可以做的是 Ralph 在上述评论中建议的:将 log4j-1.2-api-2.x.jar 与 log4j-api-2.x.jar 和log4j-core-2.x.jar。 (请务必从您的类路径中删除 log4j-1.2.x.jar!)这样您的应用程序可以继续使用 log4j-1.x API,但在后台使用 log4j 2。
    【解决方案2】:

    您想要实现的称为“基于大小和时间的文件命名和触发策略”(SizeAndTimeBasedFNATP),可以在最新版本的 logback 包中找到,目前是 1.1.7,但是,它可以是在 1.1.2 中也可以找到,我使用它是因为它可以在没有太多异步进程的情况下产生更可预测的结果(即使 1.1.2 更慢)。

    logback 包的工作方式与 log4j 类似,但使用基于 XML 的配置文件 (logback.xml),在您的情况下可能如下所示(注意 test_%d{yyyyMMdd}.log.%i - 这是你的模式)。

    请注意,很遗憾,(目前)不可能将索引限制在日期内。因此,每个日期不能只有 5 个日志块——每个日期都将完全使用独立于每个日期的日志块索引进行记录。但是,您可以限制日期总数和(在 1.1.7 中)日志文件夹的总大小(使用 ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy)。

    另外我建议你至少使用 10Mb 的块大小(100Kb 很小),因为更大的块,一般来说,更容易通过日志库维护(更少的 CPU 消耗)。

    <?xml version="1.0" ?>
    <configuration>
        <property name="log.folder" value="C:/logs/projectlogs"/>
    <!--  UNCOMMENT BELOW SECTION IF CONSOLE IS REQUIRED -->
    <!--
      <appender class="ch.qos.logback.core.ConsoleAppender" name="CONSOLE">
        <encoder>
          <pattern>[%p] [%thread] %logger - %msg%n</pattern>
        </encoder>
      </appender>
    -->
      <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="FILE"> 
        <File>${log.folder}/test.log</File>
        <Append>true</Append>
        <encoder>
          <pattern>%d{ISO8601} [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.folder}/test_%d{yyyyMMdd}.log.%i</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100KB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- keep 30 days' worth of history -->
                <maxHistory>30</maxHistory>
                <!-- up to 10 GB max -->
                <totalSizeCap>10GB</totalSizeCap>
                 <MaxFileSize>100KB</MaxFileSize>
        </rollingPolicy>
      </appender>
    
      <root>
        <level value="INFO"/>
        <appender-ref ref="FILE"/>
      </root>
    
      <logger name="Main">
        <level value="DEBUG" />
      </logger>     
    
      <logger name="ch.qos">
        <level value="WARN"/>
      </logger>
    </configuration>
    

    测试 Java 应用程序

    package logtester;
    import org.apache.log4j.Logger;
    public class LogTester {
        public static void main(String[] args) {
            Logger logger = Logger.getLogger("Main");
            for(int i = 1; i<=20000; i++)
                logger.info("Log message "+i);
        }
    }
    

    运行后的文件夹结构:

     13,230 test.log
    102,929 test_20160430.log.0
    103,168 test_20160430.log.1
    102,816 test_20160430.log.10
    102,816 test_20160430.log.11
    103,168 test_20160430.log.2
    103,168 test_20160430.log.3
    103,168 test_20160430.log.4
    103,168 test_20160430.log.5
    102,815 test_20160430.log.6
    102,816 test_20160430.log.7
    102,816 test_20160430.log.8
    102,816 test_20160430.log.9
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2015-03-21
      • 2018-11-03
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      相关资源
      最近更新 更多