27

所以 log4j 带有两个现有的日志滚轮:RollingFileAppender 和 DailyRollingFileAppender。有没有人听说过一个可以同时做前者的附加程序?

我需要一个附加器,它会根据文件大小滚动日志文件,但也会将当前日期附加到它。

我一直在考虑创建自己的 appender,但是如果已经创建了一个 appender,为什么不节省时间并使用它呢?

4

6 回答 6

12

看起来您想要混合使用http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.htmlhttp://logging.apache.org/log4j/1.2/apidocs /org/apache/log4j/RollingFileAppender.html

你必须自己编码。好消息是:您只需“合并”这些类功能,不需要“低级”新代码。

于 2009-04-27T19:48:20.587 回答
11

我知道这篇文章有点晚了,但你可以试试 TimeAndSizeRollingAppender。它在 Apache 2.0 许可下免费提供,从www.simonsite.org.uk下载。

于 2010-06-06T07:28:25.813 回答
7

“companions”项目中的 Log4J Extras 提供了一系列滚动策略,包括您正在寻找的内容。

APIDoc:http ://logging.apache.org/log4j/extras/apidocs/index.html 主页:http ://logging.apache.org/log4j/extras/

于 2012-03-13T13:32:51.610 回答
6

使用 Log4j

正如@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 添加到 logger。

如果你运行应用程序,你应该得到类似的东西......

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 呢?在这个 log4j2 文档中,有几个示例似乎可以满足您的需求。

于 2016-11-27T17:22:40.760 回答
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");
        }
}

完毕!!

于 2013-07-11T16:16:01.587 回答
1

我们使用您在此处看到的类。它按照您的描述工作并扩展了 FileAppender。

于 2012-12-11T09:17:20.430 回答