Как вы получаете log4j катить файлы на основе даты и размера? - PullRequest
27 голосов
/ 27 апреля 2009

Таким образом, log4j поставляется с двумя существующими роликами журнала: RollingFileAppender и DailyRollingFileAppender. Кто-нибудь слышал об аппендиате, который делает то же, что и первый?

Мне нужен аппендир, который будет накатывать файлы журнала на основе размера файла, но также добавлять к нему текущую дату.

Я думал о создании собственного приложения, но если оно уже создано, почему бы не сэкономить время и не использовать его?

Ответы [ 6 ]

12 голосов
/ 27 апреля 2009

Похоже, вы хотите сочетание 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.

Тебе придется самому кодировать. Хорошей новостью является то, что вам нужно просто «объединить» эти классы, новый код «низкого уровня» не требуется.

10 голосов
/ 06 июня 2010

Я знаю, что этот пост немного опоздал, но вы можете попробовать TimeAndSizeRollingAppender. Он свободно доступен под лицензией Apache 2.0, загрузите его с www.simonsite.org.uk .

7 голосов
/ 13 марта 2012

Дополнительные функции Log4J из проекта «Компаньоны» предоставляют множество политик для перехода, включая то, что вы ищете.

APIDoc: http://logging.apache.org/log4j/extras/apidocs/index.html Домашняя страница: http://logging.apache.org/log4j/extras/

6 голосов
/ 27 ноября 2016

Использование 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 в регистратор, как обычно.

Если вы запустите приложение, вы должны получить что-то подобное ...

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 есть пара примеров, которые, кажется, соответствуют вашим потребностям.

5 голосов
/ 11 июля 2013

Слишком поздно, чтобы ответить. Но, надеюсь, это кому-нибудь поможет.

Добавление зависимости 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");
        }
}

Готово !!

1 голос
/ 11 декабря 2012

Мы используем класс, который вы видите здесь . Он работает как вы описали и расширяет FileAppender.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...