log ejemplo dailyrollingfileappender daily java logging log4j

java - log4j dailyrollingfileappender ejemplo



log4j nombres de archivo de registro? (10)

Tenemos varios trabajos que se ejecutan simultáneamente que tienen que usar la misma información de configuración para log4j. Todos están volcando los registros en un archivo usando el mismo appender. ¿Hay alguna forma de que cada trabajo nombre dinámicamente su archivo de registro para que permanezcan separados?

Gracias
Tom


¿Se puede pasar una propiedad del sistema Java para cada trabajo? Si es así, puede parametrizar de esta manera:

java -Dmy_var=somevalue my.job.Classname

Y luego en tu log4j.properties:

log4j.appender.A.File=${my_var}/A.log

Puede poblar la propiedad del sistema Java con un valor del entorno del host (por ejemplo) que identifique de manera única la instancia del trabajo.


Podría configurar programáticamente log4j cuando inicialice el trabajo.

También puede establecer el archivo log4j.properties en tiempo de ejecución a través de una propiedad del sistema. Del manual :

Establezca la variable de cadena de recursos en el valor de la propiedad del sistema log4j.configuration . La forma preferida de especificar el archivo de inicialización predeterminado es a través de la propiedad del sistema log4j.configuration. En caso de que la propiedad del sistema log4j.configuration no esté definida, entonces establezca el recurso de variable de cadena en su valor predeterminado "log4j.properties".

Asumiendo que está ejecutando los trabajos desde diferentes comandos java, esto les permitirá usar diferentes archivos log4j.properties y diferentes nombres de archivo para cada uno.

¡Sin un conocimiento específico de cómo se ejecutan sus trabajos, es difícil de decir!



Puede hacer que cada trabajo configure NDC o MDC y luego escriba un apéndice que varía el nombre según el valor de NDC o MDC. Crear un nuevo appender no es muy difícil. También puede haber un appender que se ajuste a la factura en el entorno limitado de log4j. Comience a buscar en http://svn.apache.org/viewvc/logging/log4j/trunk/contribs/


Si los nombres de los trabajos se conocen con anticipación, puede incluir el nombre del trabajo cuando realice la llamada a getLogger (). A continuación, puede vincular diferentes apéndices a diferentes registradores, con nombres de archivo separados (u otros destinos).

Si no puede conocer el nombre del trabajo con anticipación, puede configurar el registrador en tiempo de ejecución en lugar de usar un archivo de configuración:

FileAppender appender = new FileAppender(); appender.setFileName(...); appender.setLayout(...); Logger logger = Logger.getLogger("com.company.job."+jobName); logger.addAppender(appender);


Tenemos algo similar implementado en nuestro sistema. Almacenamos los registradores específicos en un HashMap e inicializamos los appenders para cada uno de ellos según sea necesario.

Aquí hay un ejemplo:

public class JobLogger { private static Hashtable<String, Logger> m_loggers = new Hashtable<String, Logger>(); private static String m_filename = "..."; // Root log directory public static synchronized void logMessage(String jobName, String message) { Logger l = getJobLogger(jobName); l.info(message); } public static synchronized void logException(String jobName, Exception e) { Logger l = getJobLogger(partner); l.info(e.getMessage(), e); } private static synchronized Logger getJobLogger(String jobName) { Logger logger = m_loggers.get(jobName); if (logger == null) { Layout layout = new PatternLayout("..."); logger = Logger.getLogger(jobName); m_loggers.put(jobName, logger); logger.setLevel(Level.INFO); try { File file = new File(m_filename); file.mkdirs(); file = new File(m_filename + jobName + ".log"); FileAppender appender = new FileAppender(layout, file.getAbsolutePath(), false); logger.removeAllAppenders(); logger.addAppender(appender); } catch (Exception e) { ... } } return logger; } }

Luego, para usar esto en su trabajo, solo tiene que usar una entrada de una línea como esta:

JobLogger.logMessage(jobName, logMessage);

Esto creará un archivo de registro para cada nombre de trabajo y lo colocará en su propio archivo con ese nombre de trabajo en el directorio que especifique.

Puede jugar con otros tipos de apéndices y, tal como están escritos, continuarán agregándose hasta que se reinicie la JVM, lo que puede no funcionar si ejecuta el mismo trabajo en un servidor que siempre está activo, pero esto da la idea general de cómo puede hacerlo. trabajo.


Tom, podrías especificar y appenders para cada trabajo. Supongamos que tiene 2 trabajos correspondientes a dos paquetes java diferentes com.tom.firstbatch y com.tom.secondbatch, tendría algo como esto en log4j.xml:

<category name="com.tom.firstbatch"> <appender-ref ref="FIRST_APPENDER"/> </category> <category name="com.tom.secondtbatch"> <appender-ref ref="SECOND_APPENDER"/> </category>


usted puede implementar lo siguiente:

  • Un titular de ThreadLocal para la identidad de su trabajo.
  • Extienda FileAppender, su FileAppender tiene que mantener un Mapa con un QuietWriter para cada identidad de trabajo. En el método subAppend, obtiene la identidad de su trabajo del ThreadLocal, busca (o crea) el QuietWriter y escribe en él ...

Puedo enviarle un código por correo si lo desea ...


log4j.logger.com.foo.admin =, AdminFileAppender log4j.logger.com.foo.report =, ReportFileAppender

Es otra forma de hacer esta tarea ... aquí com.foo.admin es el nombre completo del paquete


Basándose en la respuesta de Shadit . Si cada trabajo puede identificarse mediante el método principal de la clase que se inició, puede utilizar la propiedad del sistema sun.java.command que contiene el nombre completo de la clase iniciada. Por ejemplo, así:

log4j.appender.LOGFILE.File=${sun.java.command}.log

Lo uso junto con un TimestampFileAppender como este:

log4j.appender.LOGFILE=TimestampFileAppender log4j.appender.LOGFILE.TimestampPattern=yyyy_MM_dd__HH_mm log4j.appender.LOGFILE.File=${sun.java.command}_{timestamp}.log

De esta forma, cuando desarrollo en Eclipse obtengo un nuevo archivo de registro para cada nuevo proceso que ejecuto, identificado por el nombre de clase de la clase con el método principal y la hora en que se inició.