我可以使用 log4j 拥有 Below Log 文件结构吗?

Can I have Below Log files structure using log4j?

期望当前日志同名(即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

你想要实现的是 "Size And Time Based File Naming And Triggering Policy" (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

希望对您有所帮助。

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