Rotação diária do Log4j e retenção mensal com qualquer remetente de arquivos

11

É possível com qualquer um dos anexos do log4j gravar os logs com tempo de rotação e limite de retenção específicos.
O objetivo seria:

  • ter um arquivo de log para cada dia; crie um novo arquivo à meia-noite para os novos logs
  • manter os arquivos de log e excluí-los automaticamente após um certo período de tempo; exclua os arquivos de log com mais de X dias (por exemplo, 30 dias)

Parece que a rotação é possível, mas o limite do tempo de retenção não é possível com log4j

A versão do log4j é 1.2.

PaulEdison
fonte

Respostas:

4

essas propriedades do log4J funcionam para mim

log4j.rootLogger=DEBUG, stdout, file

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=/opt/cronjob/logs/cronlogs.log
log4j.appender.file.MaxFileSize=1028MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Basharat Ali
fonte
4

Minha resposta é baseada logback, não log4j(desculpe pela confusão ..)


Você pode conseguir essa rotação de log usando TimeBasedRollingPolicy .

por exemplo)

<appender name="SYSTEMLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>./logs/system.log</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>./logs/system.log.%d{yyyy-MM-dd}</fileNamePattern>
    <!-- keep last 30 days of logs -->
    <maxHistory>30</maxHistory>
  </rollingPolicy>
  <encoder>
    <charset>UTF-8</charset>
      <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %msg %n</Pattern>
  </encoder>
</appender>

Ele girará à meia-noite e excluirá os arquivos de log com mais de 30 dias.

fileNamePattern: o período de sobreposição é deduzido do valor de fileNamePattern

maxHistory: A propriedade opcional maxHistory controla o número máximo de arquivos a serem mantidos, excluindo assincronamente os arquivos mais antigos. Por exemplo, se você especificar rollover mensal e definir maxHistory como 6, 6 meses no valor de arquivos serão mantidos com os arquivos com mais de 6 meses excluídos. Observe que os arquivos de log arquivados antigos são removidos, todas as pastas criadas para fins de arquivamento de arquivos de log serão removidas conforme apropriado.

Você pode verificar mais informações sobre TimeBasedRollingPolicy

tonarimochi
fonte
@PaulEdison Apenas curioso, essas configurações não estão funcionando?
JavaGroup456 21/10/19
11
Esta solução é baseada em logback não log4j
benbenw
Uau .... @benbenw está correto !! Não entendo por que eu entendi errado essa pergunta como logback ... Obrigado por me lembrar. Por favor, consulte sua resposta para log4j.
tonarimochi
3

sim, nós podemos!

Arquivo: project->src->main->resources->logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>folderName/logFile.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>folderName/archive/logFile.%d{dd-MM-yyyy}.log</fileNamePattern>
      <!-- keep last 30 days of logs -->
      <maxHistory>30</maxHistory>
    </rollingPolicy>

    <!-- filter by level (optional) -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>DEBUG</level>
    </filter>

    <encoder>
      <pattern>%date %-5level [%thread] %file:%L [%M] - %msg%n</pattern>
    </encoder>
  </appender>

  <!-- you can filter by type of level (optional) -->
  <root level="DEBUG">
    <appender-ref ref="FILE"/>
  </root>
</configuration>

Para mais informações consulte a documentação: TimeBasedRollingPolicy

JavaDoc: TimeBasedRollingPolicy

Aymen
fonte
1

A maioria das respostas é baseada em logback. Mas a questão é sobre log4j 1.2 (antigo ...)

a resposta mencionando DailyRollingFileAppender também não funcionará. org.apache.log4j.DailyRollingFileAppendernão suporta a MaxBackupIndexpropriedade, consulte http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html (isto é para RollingFileAppender)

você pode estar interessado em: Use MaxBackupIndex no DailyRollingFileAppender -log4j

e para uma possível resposta: Log4j Rollingpolicy e MaxbackupIndex

Mas você provavelmente deve usar a "emulação" do slf4j log4j ( http://www.slf4j.org/legacy.html#log4j-over-slf4j ) e rotear seu log pelo logback (sem nenhuma alteração de código), onde é muito mais fácil implementar .

benbenw
fonte