warn loj4j logger found for example ejemplo could application appenders java logging log4j

java - logger - loj4j example



Log4j: ¿Cómo configurar el registro de archivos más simple posible? (4)

Mi historia:

Quiero hacer algo que sea tan simple como un registrador log4j lo más simple posible que registra filas en un archivo. He encontrado varios ejemplos con algunas funcionalidades, pero no básicas, que realmente funcionan, y ninguna con una explicación de cómo funciona cada fila.

Pregunta:

¿Alguien podría proporcionar uno?

Prerrequisitos:

  • Ya sé dónde colocar el archivo y tengo el log4j configurado y funcionando para el registro de la consola.
  • Ahora quiero iniciar sesión en un archivo y también encontrar el archivo desde el sistema de archivos una vez que el programa se haya ejecutado.
  • Las filas necesarias para agregar al archivo existente log4j.properties son el resultado deseado.

Aquí hay un archivo log4j.properties que he utilizado con gran éxito.

logDir=/var/log/myapp log4j.rootLogger=INFO, stdout #log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{MM/dd/yyyy hh:mm:ss a}|%-5p|%-30c{1}| %m%n log4j.appender.stdout.DatePattern=''.''yyyy-MM-dd log4j.appender.stdout.File=${logDir}/myapp.log log4j.appender.stdout.append=true

DailyRollingFileAppender creará nuevos archivos cada día con nombres de archivo que se ven así:

myapp.log.2017-01-27 myapp.log.2017-01-28 myapp.log.2017-01-29 myapp.log <-- today''s log

Cada entrada en el archivo de registro tendrá este formato:

01/30/2017 12:59:47 AM|INFO |Component1 | calling foobar(): userId=123, returning totalSent=1 01/30/2017 12:59:47 AM|INFO |Component2 | count=1 > 0, calling fooBar()

Establezca la ubicación del archivo anterior utilizando -Dlog4j.configuration , como se menciona en esta publicación :

java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp

En su código de Java, asegúrese de establecer el nombre de cada componente de software cuando crea una instancia de su objeto de registro. También me gusta iniciar sesión en el archivo de registro y en la salida estándar, así que escribí esta pequeña función.

private static final Logger LOGGER = Logger.getLogger("Component1"); public static void log(org.apache.log4j.Logger logger, String message) { logger.info(message); System.out.printf("%s/n", message); } public static String stackTraceToString(Exception ex) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); return sw.toString(); }

Y luego llámalo así:

LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));


Aquí hay uno simple que suelo usar:

# Set up logging to include a file record of the output # Note: the file is always created, even if there is # no actual output. log4j.rootLogger=error, stdout, R # Log format to standard out log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern= %5p/t[%d] [%t] (%F:%L)/n /t%m%n/n # File based log output log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=owls_conditions.log log4j.appender.R.MaxFileSize=10000KB # Keep one backup file log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern= %5p/t[%d] [%t] (%F:%L)/n /t%m%n/n

El formato del registro es el siguiente:

ERROR [2009-09-13 09:56:01,760] [main] (RDFDefaultErrorHandler.java:44) http://www.xfront.com/owl/ontologies/camera/#(line 1 column 1): Content is not allowed in prolog.

Tal formato está definido por la cadena %5p/t[%d] [%t] (%F:%L)/n /t%m%n/n . Puede leer el significado de los caracteres de conversión en log4j javadoc para PatternLayout .

Los comentarios incluidos deberían ayudar a entender lo que hace. Notas adicionales:

  • se registra tanto en la consola como en el archivo; en este caso, el archivo se llama owls_conditions.log : cámbielo de acuerdo con sus necesidades;
  • los archivos se rotan cuando alcanzan los 10000 KB y se guarda un archivo de respaldo

Tengo un archivo genérico log4j.xml para usted:

<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > <log4j:configuration debug="false"> <appender name="default.console" class="org.apache.log4j.ConsoleAppender"> <param name="target" value="System.out" /> <param name="threshold" value="debug" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" /> </layout> </appender> <appender name="default.file" class="org.apache.log4j.FileAppender"> <param name="file" value="/log/mylogfile.log" /> <param name="append" value="false" /> <param name="threshold" value="debug" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" /> </layout> </appender> <appender name="another.file" class="org.apache.log4j.FileAppender"> <param name="file" value="/log/anotherlogfile.log" /> <param name="append" value="false" /> <param name="threshold" value="debug" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" /> </layout> </appender> <logger name="com.yourcompany.SomeClass" additivity="false"> <level value="debug" /> <appender-ref ref="another.file" /> </logger> <root> <priority value="info" /> <appender-ref ref="default.console" /> <appender-ref ref="default.file" /> </root> </log4j:configuration>

con una consola, dos archivos appender y un registrador que apunta al segundo archivo appender en lugar del primero.

EDITAR

En uno de los proyectos más antiguos, encontré un simple archivo log4j.properties:

# For the general syntax of property based configuration files see # the documentation of org.apache.log4j.PropertyConfigurator. # The root category uses two appenders: default.out and default.file. # The first one gathers all log output, the latter only starting with # the priority INFO. # The root priority is DEBUG, so that all classes can be logged unless # defined otherwise in more specific properties. log4j.rootLogger=DEBUG, default.out, default.file # System.out.println appender for all classes log4j.appender.default.out=org.apache.log4j.ConsoleAppender log4j.appender.default.out.threshold=DEBUG log4j.appender.default.out.layout=org.apache.log4j.PatternLayout log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n log4j.appender.default.file=org.apache.log4j.FileAppender log4j.appender.default.file.append=true log4j.appender.default.file.file=/log/mylogfile.log log4j.appender.default.file.threshold=INFO log4j.appender.default.file.layout=org.apache.log4j.PatternLayout log4j.appender.default.file.layout.ConversionPattern=%-5p %c: %m%n

Para la descripción de todos los argumentos de diseño, mire aquí: log4j Argumentos de PatternLayout


<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender"> <param name="Threshold" value="INFO" /> <param name="File" value="sample.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" /> </layout> </appender> <root> <priority value ="debug" /> <appender-ref ref="fileAppender" /> </root> </log4j:configuration>

Log4j puede ser un poco confuso. Así que intentemos comprender qué está pasando en este archivo: en log4j tiene dos constructos básicos, appenders y loggers.

Los appenders definen cómo y dónde se anexan las cosas. ¿Se registrará en un archivo, en la consola, en una base de datos, etc.? En este caso, está especificando que las instrucciones de registro dirigidas a fileAppender se incluirán en el archivo sample.log utilizando el patrón especificado en las etiquetas de diseño . También podría crear fácilmente un appender para la consola o la base de datos. Donde el appender de la consola especificaría cosas como el diseño en la pantalla y el appender de la base de datos tendría detalles de conexión y nombres de tablas.

Los madereros responden a los eventos de registro a medida que surgen. Si un evento capta el interés de un registrador específico, invocará a sus apéndices adjuntos. En el siguiente ejemplo, solo tiene un registrador, el registrador de raíz, que responde a todos los eventos de registro de forma predeterminada. Además del registrador de raíz, puede especificar registradores más específicos que respondan a eventos de paquetes específicos. Estos registradores pueden tener sus propios apéndices especificados utilizando las etiquetas appender-ref o heredarán los appenders del registrador de raíz. El uso de registradores más específicos le permite afinar el nivel de registro en paquetes específicos o dirigir ciertos paquetes a otros appenders.

Entonces, lo que este archivo está diciendo es:

  1. Cree un archivoAppender que se registre en el archivo sample.log
  2. Adjunte ese apéndice al registrador de raíz.
  3. El registrador de raíz responderá a cualquier evento al menos tan detallado como el nivel de "depuración"
  4. El appender está configurado para registrar solo eventos que son al menos tan detallados como ''información''

La logger.debug("blah blah") es que si tienes un logger.debug("blah blah") en tu código, se ignorará. Un logger.info("Blah blah"); saldrá a sample.log.

El fragmento a continuación podría agregarse al archivo anterior con las etiquetas log4j . Este registrador heredaría los appenders de <root> pero limitaría todos los eventos de registro desde el paquete org.springframework a aquellos registrados en la info nivel o superior.

<!-- Example Package level Logger --> <logger name="org.springframework"> <level value="info"/> </logger>