如何让 log4j 根据日期和大小滚动文件?

发布于 2024-07-18 22:14:40 字数 216 浏览 3 评论 0原文

因此 log4j 附带了两个现有的日志滚轮:RollingFileAppender 和 DailyRollingFileAppender。 有没有人听说过一个附加程序可以完成前者的两种功能?

我需要一个附加程序,它可以根据文件大小滚动日志文件,但也可以将当前日期附加到其中。

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

So log4j comes with two existing log rollers: RollingFileAppender, and DailyRollingFileAppender. Has anyone heard of an appender that does both of what the former do?

I need an appender that will roll log files based on filesize, but also append the current date to it.

I've been thinking about creating my own appender, but if there is already one that has been created, why not save the time and use that one?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

梨涡 2024-07-25 22:14:40

看起来您想要混合 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

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

Looks like you want a mix of the http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html and the http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/RollingFileAppender.html.

You'll have to code by yourself. The good news is: you'll just have "merge" those classes functionality, no "low level" new code required.

故事还在继续 2024-07-25 22:14:40

我知道这篇文章有点晚了,但您可以尝试一下 TimeAndSizeRollingAppender。 它可以根据 Apache 2.0 许可证免费提供,请从 www.simonsite.org.uk 下载。

I know this post is a bit late but you could try out the TimeAndSizeRollingAppender. It's freely available under the Apache 2.0 license, download it from www.simonsite.org.uk.

静谧 2024-07-25 22:14:40

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

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

The Log4J Extras from the "companions" project provide an array of policies for rolling, including what you're looking for.

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

白色秋天 2024-07-25 22:14:40

使用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>

然后,设置一个附加器来使用这两种滚动。 这是一个快速而肮脏的示例,每分钟和/或当日志文件的大小超过 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>

像平常一样将附加程序添加到记录器中。

如果您运行该应用程序,您应该获得类似的内容...

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 文档中 有几个似乎适合您需求的示例。

Using Log4j

As @JavaJigs said, Log4j's extras can be used.

First of all, if you're using Maven, add it as dependency keeping in mind to use the same log4j version, just to avoid any kind of conflict.

<!-- 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>

Then, set up an appender to use both kinds of rollings. This is a quick and dirty example that rolls every minute and / or when the size of the log files exceeds 1000 bytes.

<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>

Add the appender to the logger as you usually do.

If you run the application you should obtain something like that...

log4j-current.log
log4j-18-13.1480266729211.log.gz
log4j-18-12.1480266729095.log.gz
log4j-18-12.1480266729123.log.gz

Obviously the numbers of files and their names depend on how your application logs.

As you can see, the %i placeholder gets replaced with a sort of random yet ever increasing number. I was not able to find a way to have it replaced with number starting from 0 though. Nevertheless, such files listed in alphabetic order should match their historical order.

Other ideas

I know you mentioned explicitly log4j. But, if you can, why not to evaluate moving to log4j2? In this log4j2 piece of doc there are a couple of examples that seem to suit your needs.

挽清梦 2024-07-25 22:14:40

来不及回复了。 但希望这会对某人有所帮助。

将 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");
        }
}

完成!

Too late to reply. But hopefully this will help someone.

Add log4j dependency to your pom.xml file

   <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

Grab a copy of this FileAppender implementation. Thanks to the author of this file.

http://haobangshou.googlecode.com/svn/trunk/hbs/APPLICATION/server/common/src/com/hbs/common/appender/TimeSizeRollingFileAppender.java

Place this log4j.xml file in your resources folder

<?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>

To do a quick test:

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");
        }
}

Done!!

没︽人懂的悲伤 2024-07-25 22:14:40

我们使用您看到的类 这里。 它的工作方式如您所描述并扩展了 FileAppender。

We use the class you see here. It works as you described and extends FileAppender.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文