Arquivo de configuração XML log4j2 muito simples usando o console e o aplicativo appender


223

Eu gostaria de um arquivo de configuração XML muito simples com um console e um aplicativo de arquivo usando log4j2.

(O site da Apache está me matando com muita informação.)


72
Haha - que bom que você disse isso "(o site da Apache está me matando com muita informação.)"
thonnor

19
Essa frase sua (o site Apache está me matando com muita informação.) É a principal razão pela qual estou vendo sua pergunta!
Ju Oliveira

Respostas:


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:

  • Coloque o seguinte conteúdo no seu arquivo de configuração.
  • Nomeie o arquivo de configuração log4j2.xml
  • Coloque o log4j2.xml em uma pasta que esteja no caminho da classe (ou seja, sua pasta de origem "src")
  • Use Logger logger = LogManager.getLogger();para inicializar seu logger
  • Eu configurei o imediatoFlush = "false", pois isso é melhor para a vida útil do SSD . Se você precisar do log imediatamente no seu arquivo de log, remova o parâmetro ou configure-o como true

1
Para garantir a integridade, o uso de imediatoFlush = "false" é especialmente recomendado ao usar o Async Loggers ou o AsyncAppender.
Remko Popma

1
Background: imediatFlush = "false" permite que os componentes assíncronos do Log4J2 agrupem vários eventos de log em uma única gravação de disco. Como bônus, seus eventos de log mais recentes são sempre gravados em disco e nunca são deixados em um buffer de memória. (Algo que eu encontrei irritante sobre log4j-1.2.)
Remko Popma

1
Não consegui obter os exemplos no site do Log4j 2.0 para funcionar, mas este funcionou. Obrigado.
21814 djangofan

12
Inclua o fato de que uma limpeza pode ser necessária para quem usa o eclipse. Pelo bem da humanidade.
Reut Sharabani

1
@ThorstenNiehues Não consigo editar meu comentário anterior, mas o eclipse copia a configuração quando você cria e, por algum motivo, nem sempre copia o log4j.xml, mesmo que tenha sido alterado. Pelo menos foi o que resolveu isso para mim.
Reut Sharabani 5/05

19

Aqui está o meu simplista log4j2.xmlque imprime no console e grava em um arquivo diário:

// 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 (inteiro) - com que freqüência uma substituição deve ocorrer com base na unidade de tempo mais específica no padrão de data. Por exemplo, com um padrão de data com horas como o item mais específico e um incremento de 4 rollovers ocorreria a cada 4 horas. O valor padrão é 1.

modular (booleano) - indica se o intervalo deve ser ajustado para fazer com que a próxima rolagem ocorra no limite do intervalo. Por exemplo, se o item for horas, a hora atual é 3 horas e o intervalo é 4, a primeira rolagem ocorrerá às 4 horas e as próximas ocorrerão às 8 horas, meio-dia, 16 horas, etc.

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

Resultado:

[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

Um novo arquivo de log será criado diariamente com o dia anterior renomeado automaticamente para:

cucumber_yyyy-MM-dd.log

Em um projeto Maven, você colocaria log4j2.xmlin src/main/resources ou src/test/resources .


12

O log4j2 possui um sistema de configuração muito flexível (que IMHO é mais uma distração do que uma ajuda), você pode até usar o JSON. Consulte https://logging.apache.org/log4j/2.x/manual/configuration.html para obter uma referência.

Pessoalmente, comecei recentemente a usar o log4j2, mas estou tendendo à configuração "XML estrito" (ou seja, usando atributos em vez de nomes de elementos), que podem ser validados pelo esquema.

Aqui está meu exemplo simples usando a configuração automática e o modo estrito, usando uma "Propriedade" para definir o nome do arquivo:

<?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>

A configuração flexível é útil quando você está tentando separar a configuração da compilação e colocar a configuração em um repositório em outro lugar. Infelizmente, as complexidades estão tornando isso um pouco irritante, mas apenas pensei em oferecer um benefício às opções flexíveis de configuração.
adprocas 7/09/17

Qual é a Filepolítica aqui? Qual é o tamanho máximo do arquivo? E como ele grava no arquivo? (faz arquivo contém sempre o último 10mb de toras?)
Tina J
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.