log ejemplo dailyrollingfileappender daily crear configurar archivo java .net logging log4net log4j

java - crear - log4j dailyrollingfileappender ejemplo



Establecer un nombre de archivo de registro para incluir la fecha actual en Log4j (8)

Como respuesta a las dos respuestas que mencionan DailyRollingFileAppender (lo siento, no tengo suficiente representante para comentar sobre ellas directamente, y creo que esto debe mencionarse), me gustaría advertir que, lamentablemente, los desarrolladores de esa clase han documentado que exhibe sincronización y pérdida de datos, y recomienda que se busquen alternativas para nuevas implementaciones.

logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/…

Me gustaría establecer el nombre del archivo de registro para que log4j y log4net appender tengan la fecha actual. Estamos haciendo reinversiones diarias, pero el archivo de registro actual no tiene fecha. El formato del nombre del archivo de registro sería

logname.2008-10-10.log

¿Alguien sabe la mejor manera para que yo haga esto?

editar: Olvidé mencionar que también querríamos hacer esto en log4net. Además, cualquier solución debería ser utilizable en JBoss.


DailyRollingFileAppender es lo que estás buscando exactamente.

<appender name="roll" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="application.log" /> <param name="DatePattern" value=".yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MMM-dd HH:mm:ss,SSS} [%t] %c %x%n %-5p %m%n"/> </layout> </appender>


Estoy 99% seguro de que RollingFileAppender / DailyRollingFileAppender, a la vez que le da la funcionalidad de fechar que desea, no tiene forma de especificar que el archivo de registro actual también debe usar el DatePattern .

Simplemente podría simplemente subclase RollingFileAppender (o DailyRollingFileAppender, se me olvida cuál es cuál en log4net) y modificar la lógica de denominación.


He creado un appender que hará eso. http://stauffer.james.googlepages.com/DateFormatFileAppender.java

/* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this * distribution in the LICENSE.txt file. */ package sps.log.log4j; import java.io.IOException; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.*; import org.apache.log4j.helpers.LogLog; import org.apache.log4j.spi.LoggingEvent; /** * DateFormatFileAppender is a log4j Appender and extends * {@link FileAppender} so each log is * named based on a date format defined in the File property. * * Sample File: ''logs/''yyyy/MM-MMM/dd-EEE/HH-mm-ss-S''.log'' * Makes a file like: logs/2004/04-Apr/13-Tue/09-45-15-937.log * @author James Stauffer */ public class DateFormatFileAppender extends FileAppender { /** * The default constructor does nothing. */ public DateFormatFileAppender() { } /** * Instantiate a <code>DailyRollingFileAppender</code> and open the * file designated by <code>filename</code>. The opened filename will * become the ouput destination for this appender. */ public DateFormatFileAppender (Layout layout, String filename) throws IOException { super(layout, filename, true); } private String fileBackup;//Saves the file pattern private boolean separate = false; public void setFile(String file) { super.setFile(file); this.fileBackup = getFile(); } /** * If true each LoggingEvent causes that file to close and open. * This is useful when the file is a pattern that would often * produce a different filename. */ public void setSeparate(boolean separate) { this.separate = separate; } protected void subAppend(LoggingEvent event) { if(separate) { try {//First reset the file so each new log gets a new file. setFile(getFile(), getAppend(), getBufferedIO(), getBufferSize()); } catch(IOException e) { LogLog.error("Unable to reset fileName."); } } super.subAppend(event); } public synchronized void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize) throws IOException { SimpleDateFormat sdf = new SimpleDateFormat(fileBackup); String actualFileName = sdf.format(new Date()); makeDirs(actualFileName); super.setFile(actualFileName, append, bufferedIO, bufferSize); } /** * Ensures that all of the directories for the given path exist. * Anything after the last / or / is assumed to be a filename. */ private void makeDirs (String path) { int indexSlash = path.lastIndexOf("/"); int indexBackSlash = path.lastIndexOf("//"); int index = Math.max(indexSlash, indexBackSlash); if(index > 0) { String dirs = path.substring(0, index); // LogLog.debug("Making " + dirs); File dir = new File(dirs); if(!dir.exists()) { boolean success = dir.mkdirs(); if(!success) { LogLog.error("Unable to create directories for " + dirs); } } } } }


No sé si es posible en Java, pero en .NET la propiedad StaticLogFileName en RollingFileAppender le proporciona lo que desea. El defecto es cierto.

<staticLogFileName value="false"/>

Configuración completa:

<appender name="DefaultFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="application"/> <staticLogFileName value="false"/> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyy-MM-dd&quot;.log&quot;" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender>

&quot;.log&quot; es para no dejar que el formato de fecha reconozca el patrón de fecha global ''g'' en el registro.


Puede establecer FileAppender dinámicamente

SimpleLayout layout = new SimpleLayout(); FileAppender appender = new FileAppender(layout,"logname."+new Date().toLocaleString(),false); logger.addAppender(appender);


Usando el archivo log4j.properties, e incluyendo apache-log4j-extras 1.1 en mi POM con log4j 1.2.16

log4j.appender.LOGFILE=org.apache.log4j.rolling.RollingFileAppender log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy log4j.appender.LOGFILE.RollingPolicy.FileNamePattern=/logs/application_%d{yyyy-MM-dd}.log


este ejemplo creará un registrador por cada minuto, si desea cambiar para cada día, cambie el valor de DatePattern .

<appender name="ASYNC" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="./applogs/logger.log" /> <param name="Append" value="true" /> <param name="Threshold" value="debug" /> <appendToFile value="true" /> <param name="DatePattern" value="''.''yyyy_MM_dd_HH_mm"/> <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> <param name="fileNamePattern" value="./applogs/logger_%d{ddMMMyyyy HH:mm:ss}.log"/> <param name="rollOver" value="TRUE"/> </rollingPolicy> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ddMMMyyyy HH:mm:ss,SSS}^[%X{l4j_mdc_key}]^[%c{1}]^ %-5p %m%n" /> </layout> </appender> <root> <level value="info" /> <appender-ref ref="ASYNC" /> </root>