Archivo de configuración XML log4j2 muy simple usando la consola y el anexo de archivo


223

Me gustaría un archivo de configuración XML muy simple con una consola y un complemento de archivo usando log4j2.

(El sitio web de Apache me está matando con mucha información).


72
Jaja - me alegra que hayas dicho esto "(El sitio web de Apache me está matando con mucha información)"
thonnor

19
¡Esa frase tuya (el sitio web de Apache me está matando con mucha información) es la razón principal por la que estoy viendo tu pregunta!
Ju Oliveira

Respuestas:


281
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

Notas:

  • Ponga el siguiente contenido en su archivo de configuración.
  • Denomine el archivo de configuración log4j2.xml
  • Coloque log4j2.xml en una carpeta que se encuentra en la ruta de clase (es decir, su carpeta de origen "src")
  • Use Logger logger = LogManager.getLogger();para inicializar su registrador
  • Establecí el valor inmediatoFlush = "false" ya que esto es mejor para la vida útil de SSD . Si necesita el registro de inmediato en su archivo de registro, elimine el parámetro o configúrelo como verdadero

1
Para completar, se recomienda el uso de inmediatamenteFlush = "false" cuando se utilizan Async Loggers o AsyncAppender.
Remko Popma

1
Antecedentes: initialFlush = "false" permite que los componentes asíncronos de Log4J2 agrupen múltiples eventos de registro en una sola escritura de disco. Como beneficio adicional, sus eventos de registro más recientes siempre se escriben en el disco y nunca se cuelgan en un búfer de memoria. (Algo que encontré molesto sobre log4j-1.2.)
Remko Popma

1
No pude conseguir que los ejemplos en el sitio Log4j 2.0 funcionaran, pero este sí. Gracias.
djangofan

12
Por favor, añadir el hecho de que una limpieza puede ser necesaria para aquellos que utilizan eclipse. Por el bien de la humanidad.
Reut Sharabani

1
@ThorstenNiehues No puedo editar mi comentario anterior, pero eclipse copia la configuración cuando construyes, y por alguna razón no siempre copia el log4j.xml incluso si cambia. Al menos eso fue lo que me resolvió.
Reut Sharabani

19

Aquí está mi simplista log4j2.xmlque imprime en la consola y escribe en un archivo rodante diario:

// java
private static final Logger LOGGER = LogManager.getLogger(MyClass.class);


// log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logPath">target/cucumber-logs</Property>
        <Property name="rollingFileName">cucumber</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
        </Console>
        <RollingFile name="rollingFile" fileName="${logPath}/${rollingFileName}.log" filePattern="${logPath}/${rollingFileName}_%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
            <Policies>
                <!-- Causes a rollover if the log file is older than the current JVM's start time -->
                <OnStartupTriggeringPolicy />
                <!-- Causes a rollover once the date/time pattern no longer applies to the active file -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="rollingFile" />
        </Root>
    </Loggers>
</Configuration>

TimeBasedTriggeringPolicy

intervalo (entero) : con qué frecuencia debe producirse una reinversión en función de la unidad de tiempo más específica en el patrón de fecha. Por ejemplo, con un patrón de fecha con horas como el elemento más específico y un incremento de 4 vuelcos ocurriría cada 4 horas. El valor predeterminado es 1.

modulate (boolean) : indica si el intervalo debe ajustarse para que se produzca el siguiente rollover en el límite del intervalo. Por ejemplo, si el artículo es horas, la hora actual es las 3 a.m. y el intervalo es 4, entonces el primer vuelco ocurrirá a las 4 a.m. y luego los siguientes ocurrirán a las 8 a.m., mediodía, 4 p.m., etc.

Fuente: https://logging.apache.org/log4j/2.x/manual/appenders.html

Salida:

[INFO ] 2018-07-21 12:03:47,412 ScenarioHook.beforeScenario() - Browser=CHROME32_NOHEAD
[INFO ] 2018-07-21 12:03:48,623 ScenarioHook.beforeScenario() - Screen Resolution (WxH)=1366x768
[DEBUG] 2018-07-21 12:03:52,125 HomePageNavigationSteps.I_Am_At_The_Home_Page() - Base URL=http://simplydo.com/projector/
[DEBUG] 2018-07-21 12:03:52,700 NetIncomeProjectorSteps.I_Enter_My_Start_Balance() - Start Balance=348000

Se creará un nuevo archivo de registro diariamente con el día anterior automáticamente renombrado a:

cucumber_yyyy-MM-dd.log

En un proyecto Maven, que pondría el log4j2.xmlde src/main/resources o src/test/resources .


12

log4j2 tiene un sistema de configuración muy flexible (en mi humilde opinión es más una distracción que una ayuda), incluso puede usar JSON. Consulte https://logging.apache.org/log4j/2.x/manual/configuration.html para obtener una referencia.

Personalmente, recientemente comencé a usar log4j2, pero estoy tendiendo a la configuración de "XML estricto" (es decir, usando atributos en lugar de nombres de elementos), que pueden ser validados por esquema.

Aquí está mi ejemplo simple usando autoconfiguración y modo estricto, usando una "Propiedad" para configurar el nombre de archivo:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorinterval="30" status="info" strict="true">
    <Properties>
        <Property name="filename">log/CelsiusConverter.log</Property>
    </Properties>
    <Appenders>
        <Appender type="Console" name="Console">
            <Layout type="PatternLayout" pattern="%d %p [%t] %m%n" />
        </Appender>
        <Appender type="Console" name="FLOW">
            <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n" />
        </Appender>
        <Appender type="File" name="File" fileName="${filename}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="File" />
            <AppenderRef ref="Console" />
            <!-- Use FLOW to trace down exact method sending the msg -->
            <!-- <AppenderRef ref="FLOW" /> -->
        </Root>
    </Loggers>
</Configuration>

La configuración flexible es útil cuando intentas separar la configuración de la compilación y poner la configuración en un repositorio en otro lugar. Desafortunadamente, las complejidades lo están volviendo un poco molesto, pero pensé que arrojaría un beneficio a las opciones flexibles de configuración.
adprocas

¿Cuál es la Filepolítica aquí? ¿Cuál es el tamaño máximo de archivo? ¿Y cómo se escribe en el archivo? (¿el archivo siempre contiene los últimos 10 MB de registros?)
Tina J
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.