Как вы получаете log4j для свертывания файлов на основе даты и размера?
Итак, log4j поставляется с двумя существующими лог-роликами: RollingFileAppender и DailyRollingFileAppender. Кто-нибудь слышал о приложении, который делает то, что делает первый?
Мне нужно приложение, которое будет рулонировать файлы журналов на основе файлов, но также добавит к нему текущую дату.
Я думал о создании своего собственного приложения, но если уже есть тот, который был создан, почему бы не сохранить время и не использовать его?
Ответы
Ответ 1
Похоже, вы хотите сочетание 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.
Вам придется писать код самостоятельно. Хорошая новость заключается в следующем: у вас просто будет "объединить" эти функциональные возможности классов, не требуется новый код "низкого уровня".
Ответ 2
Я знаю, что это сообщение немного поздно, но вы можете попробовать TimeAndSizeRollingAppender. Он свободно доступен под лицензией Apache 2.0, загружает его из www.simonsite.org.uk.
Ответ 3
Функции Log4J Extras из проекта "компаньоны" предоставляют множество политик для катания, включая то, что вы ищете.
APIDoc: http://logging.apache.org/log4j/extras/apidocs/index.html
Домашняя страница: http://logging.apache.org/log4j/extras/
Ответ 4
Использование 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 есть несколько примеров, которые, по-видимому, соответствуют вашим потребностям.
Ответ 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");
}
}
Готово!!
Ответ 6
Мы используем класс, который вы видите здесь. Он работает так, как вы описали и расширяет FileAppender.