policies - ¿Cómo se obtiene log4j para rodar archivos según la fecha y el tamaño?
log4j2 json configuration example (6)
Usando Log4j
Como dijo @JavaJigs, se pueden usar los extras de Log4j.
En primer lugar, si está utilizando Maven, agréguelo como dependencia teniendo en cuenta el uso de la misma versión de log4j, para evitar cualquier tipo de conflicto.
<!-- 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>
Luego, configura un appender para usar ambos tipos de rollings. Este es un ejemplo rápido y sucio que se desplaza cada minuto y / o cuando el tamaño de los archivos de registro supera los 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>
Agregue el appender al registrador como lo hace normalmente.
Si ejecutas la aplicación deberías obtener algo así ...
log4j-current.log
log4j-18-13.1480266729211.log.gz
log4j-18-12.1480266729095.log.gz
log4j-18-12.1480266729123.log.gz
Obviamente, la cantidad de archivos y sus nombres dependen de cómo se registre su aplicación.
Como puede ver, el marcador de posición %i
se reemplaza por una especie de número aleatorio pero cada vez mayor. Sin embargo, no pude encontrar una manera de reemplazarlo con un número que comienza con 0. Sin embargo, dichos archivos listados en orden alfabético deben coincidir con su orden histórico.
Otras ideas
Sé que usted mencionó explícitamente log4j. Pero, si puedes, ¿por qué no evaluar el cambio a log4j2? En este documento log4j2 hay un par de ejemplos que parecen satisfacer sus necesidades.
Así que log4j viene con dos rodillos de registro existentes: RollingFileAppender y DailyRollingFileAppender. ¿Alguien ha oído hablar de un appender que hace lo mismo que el anterior?
Necesito un agregador que rodará los archivos de registro en función del tamaño del archivo, pero también le adjuntará la fecha actual.
He estado pensando en crear mi propio appender, pero si ya se ha creado uno, ¿por qué no ahorrar tiempo y usar ese?
Demasiado tarde para responder. Pero espero que esto ayude a alguien.
Agregue la dependencia log4j a su archivo pom.xml
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
Agarra una copia de esta implementación FileAppender. Gracias al autor de este archivo.
http://haobangshou.googlecode.com/svn/trunk/hbs/APPLICATION/server/common/src/com/hbs/common/appender/TimeSizeRollingFileAppender.java
Coloque este archivo log4j.xml en su carpeta de recursos
<?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>
Para hacer una prueba rápida:
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");
}
}
¡¡Hecho!!
Los Log4J Extras del proyecto "complementarios" brindan una variedad de políticas para rodar, incluido lo que está buscando.
APIDoc: http://logging.apache.org/log4j/extras/apidocs/index.html Página de inicio: http://logging.apache.org/log4j/extras/
Parece que desea una combinación de http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html y http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/RollingFileAppender.html .
Tendrás que codificar por ti mismo. La buena noticia es que solo tendrá que "combinar" la funcionalidad de esas clases, no se requiere un nuevo código de "bajo nivel".
Sé que esta publicación es un poco tarde, pero puedes probar el TimeAndSizeRollingAppender. Está disponible gratuitamente bajo la licencia Apache 2.0, descárguela de www.simonsite.org.uk .
Usamos la clase que ves haobangshou.googlecode.com/svn/trunk/hbs/APPLICATION/server/… . Funciona como usted describió y extiende FileAppender.