因此log4j带有两个现有的日志滚轮:RollingFileAppender和DailyRollingFileAppender。有没有人听说过一个可以同时做前者做什么的追加者?
我需要一个能够根据filesize滚动日志文件的appender,还需要将当前日期附加到它上面。
我一直在考虑创建自己的appender,但是如果已经创建了一个appender,为什么不节省时间并使用那个呢?
答案 0 :(得分:12)
您希望混合使用http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html和http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/RollingFileAppender.html。
你必须自己编码。好消息是:您只需“合并”这些类功能,不需要“低级”新代码。
答案 1 :(得分:10)
我知道这篇文章有点晚了但你可以尝试一下TimeAndSizeRollingAppender。它在Apache 2.0许可下免费提供,从www.simonsite.org.uk下载。
答案 2 :(得分:7)
“companions”项目中的Log4J Extras提供了一系列滚动策略,包括您正在寻找的内容。
APIDoc:http://logging.apache.org/log4j/extras/apidocs/index.html 主页:http://logging.apache.org/log4j/extras/
答案 3 :(得分:6)
正如@JavaJigs所说,可以使用Log4j的附加功能。
首先,如果您正在使用Maven,请将其添加为依赖项,并记住使用相同的log4j版本,以避免任何类型的冲突。
<!-- you should already have something like this -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- add this one, please note the version is the same than log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>apache-log4j-extras</artifactId>
<version>1.2.17</version>
</dependency>
然后,设置一个appender来使用这两种滚动。这是一个快速而肮脏的示例,每分钟滚动和/或日志文件的大小超过1000个字节。
<appender name="rollout5" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="ActiveFileName" value="log4j-current.log" />
<param name="FileNamePattern" value="log4j-%d{HH-mm}.%i.log.gz" />
</rollingPolicy>
<triggeringPolicy class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
<param name="MaxFileSize" value="1000" />
</triggeringPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n" />
</layout>
</appender>
像往常一样将appender添加到记录器中。
如果您运行该应用程序,您应该获得类似的东西......
log4j-current.log
log4j-18-13.1480266729211.log.gz
log4j-18-12.1480266729095.log.gz
log4j-18-12.1480266729123.log.gz
显然,文件数量及其名称取决于应用程序的记录方式。
正如您所看到的,%i
占位符被替换为一种随机但不断增加的数字。我无法找到从0开始用数字替换它的方法。然而,按字母顺序列出的此类文件应与其历史顺序相匹配。
我知道你明确提到了log4j。但是,如果可以,为什么不评估转移到log4j2? In this log4j2 piece of doc有几个例子似乎符合您的需求。
答案 4 :(得分:5)
回复太迟了。但希望这会对某人有所帮助。
将log4j依赖项添加到pom.xml文件
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
获取此FileAppender实现的副本。感谢此文件的作者。
http://haobangshou.googlecode.com/svn/trunk/hbs/APPLICATION/server/common/src/com/hbs/common/appender/TimeSizeRollingFileAppender.java
将此log4j.xml文件放在资源文件夹
中<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%p] %c{1} %m%n"/>
</layout>
</appender>
<appender name="debug" class="com.myproject.log.TimeSizeRollingFileAppender">
<param name="File" value="log/debug.log"/>
<param name="MaxBackupIndex" value="300"/>
<param name="Encoding" value="GB2312"/>
<!--CHANGE THIS TO A LARGER SIZE EG : 20MB. USE 1MB TO TEST IF THE SETTING WORKS.-->
<param name="MaxFileSize" value="1MB"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %p [%c] - [%m]%n"/>
</layout>
</appender>
<!--CHANGE name TO ROOT PACKAGE NAME OF YOUR PROJECT THAT YOU WANT TO LOG.-->
<logger name="com.myproject" additivity="false">
<level value="debug"/>
<appender-ref ref="consoleAppender"/>
<appender-ref ref="debug"/>
</logger>
<logger name="org.springframework" additivity="false">
<level value="debug"/>
<appender-ref ref="consoleAppender"/>
<appender-ref ref="debug"/>
</logger>
<logger name="org.hibernate" additivity="false">
<level value="debug"/>
<appender-ref ref="consoleAppender"/>
<appender-ref ref="debug"/>
</logger>
<root>
<priority value="INFO"></priority>
<appender-ref ref="consoleAppender"/>
<appender-ref ref="debug"/>
</root>
进行快速测试:
import org.apache.log4j.Logger;
public class Main {
static public void main(String[] args) {
Logger log = Logger.getLogger(Main.class);
for(int i = 0; i < 10000; i ++)
log.info("Testing log");
}
}
完成!!
答案 5 :(得分:1)
我们使用您看到的课程here。它可以像你描述的那样工作并扩展FileAppender。