我可以使用 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
期望当前日志同名(即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