programing

지난 7 일 동안 만 로그 파일을 보관하도록 log4j를 구성하는 방법은 무엇입니까?

copyandpastes 2021. 1. 18. 22:12
반응형

지난 7 일 동안 만 로그 파일을 보관하도록 log4j를 구성하는 방법은 무엇입니까?


로깅에 사용하는 여러 Java 응용 프로그램에 다음과 같은 로깅 문제가 log4j있습니다.

로그 파일이 매일 순환되기를 원합니다.

log.2010-09-10
log.2010-09-09
log.2010-09-08
log.2010-09-07
log.2010-09-06
log.2010-09-05
log.2010-09-04

하지만 데이터 보안상의 이유로 회사에서 로그 파일을 7 일 이상 보관할 수 없습니다. 따라서 다음 다음 로그 파일 log.2010-09-11생성되면 log.2010-09-04. 이러한 동작을 구성 할 수 log4j있습니까? 그렇지 않다면 이런 종류의 로깅 문제에 대한 또 다른 우아한 해결책을 알고 있습니까?


매일 실행되도록 크론화할 수있는 별도의 스크립트에서 하우스 키핑을 수행 할 수 있습니다. 이 같은:

find /path/to/logs -type f -mtime +7 -exec rm -f {} \;

RollingFileAppender를 사용하고 있다고 가정합니까? 이 경우 MaxBackupIndex파일 수를 제한하도록 설정할 수 있는 속성 이 있습니다. 예를 들면 :

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=7
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

다음 게시물에 따르면 log4j 로는 이 작업을 수행 할 수 없습니다. DailyRollingFileAppender -log4j에서 MaxBackupIndex 사용

내가 아는 한,이 기능은 log4j 2.0으로 만들 예정 이었지만 그 노력은 헛수고되었습니다. logback 웹 사이트에 따르면 logback은 log4j의 후속 제품이므로 사용을 고려할 수 있습니다.

로깅에 공통 API를 제공하는 SLF4J라는 API가 있습니다. 런타임에 실제 로깅 구현을로드하므로 제공 한 구성에 따라 java.util.log 또는 log4j 또는 logback 또는 로깅 기능을 제공 할 수있는 기타 라이브러리를 사용할 수 있습니다. log4j를 직접 사용하는 것에서 SLF4J를 사용하는 것까지 약간의 선행 작업이 있지만이 프로세스를 자동화하는 도구를 제공합니다. SLF4J를 사용하도록 코드를 변환 한 후 로깅 백엔드를 전환하는 것은 구성 파일을 변경하는 경우 일뿐입니다.


log2j는 이제 이전 로그 삭제를 지원합니다. DefaultRolloverStrategy 태그와 아래 스 니펫을 살펴보세요. 같은 날 최대 10 개의 아카이브를 생성하고, 최대 깊이 2에서 속성 태그 아래에 정의한 $ {baseDir} 디렉토리를 구문 분석하고 로그 파일 이름이 "app-*. log.gz"와 일치하고 7보다 오래된 로그를 삭제합니다. 일이지만 가장 최근 5 개의 로그가 7 일보다 오래된 경우 가장 최근 5 개의 로그를 유지합니다.

  <DefaultRolloverStrategy max="10">
    <Delete basePath="${baseDir}" maxDepth="2">
      <IfFileName glob="*/app-*.log.gz">
        <IfLastModified age="7d">
          <IfAny>
            <IfAccumulatedFileCount exceeds="5" />
          </IfAny>
        </IfLastModified>
      </IfFileName>
    </Delete>
  </DefaultRolloverStrategy>

DailyRollingFileAppender도 있습니다. http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html

편집 :이 걱정스러운 진술을 읽은 후;

DailyRollingFileAppender는 동기화 문제 및 데이터 손실을 나타내는 것으로 관찰되었습니다. log4j 엑스트라 컴패니언에는 새 배포에 대해 고려해야하며 org.apache.log4j.rolling.RollingFileAppender에 대한 설명서에서 논의되는 대안이 포함되어 있습니다.

위의 URL에서 (이전에 결코 깨닫지 못했던), 이것은 더 나은 내기처럼 보입니다. http://logging.apache.org/log4j/companions/extras/apidocs/index.html


DailyRollingFileAppender 또 다른 옵션이 있습니다 . 하지만 찾고있는 자동 삭제 (7 일 로그 유지) 기능이 없습니다.

견본

log4j.appender.DRF=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRF.File=example.log
log4j.appender.DRF.DatePattern='.'yyyy-MM-dd

뭔가 호출 건너 않는 org.apache.log4j.CompositeRollingAppender 의 특징을 모두 결합이며, RollingFileAppender (maxSizeRollBackups, 아니합니다. 백업 파일의)와 DailyRollingFileAppender (하루 롤).

그러나 그것을 시도하지 않은 것은 표준 1.2 분기 log4j 기능이 아닌 것 같습니다.


여기 에서 원하는 작업을 수행하는 이 appender 발견했습니다. 날짜별로 롤오버 된 특정 수의 파일을 유지하도록 구성 할 수 있습니다.

다운로드 : http://www.simonsite.org.uk/download.htm

예 (groovy) :

new TimeAndSizeRollingAppender(name: 'timeAndSizeRollingAppender',
   file: 'logs/app.log', datePattern: '.yyyy-MM-dd',
   maxRollFileCount: 7, compressionAlgorithm: 'GZ',
   compressionMinQueueSize: 2,
   layout: pattern(conversionPattern: "%d [%t] %-5p %c{2} %x - %m%n"))

log4j.appender.FILE.RollingPolicy.FileNamePatternlog4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gz들어 롤오버하기 한 달 전에 로그를 보관 하려면 설정을 사용하십시오 .

I didn't wait for one month to check but I tried with mm (i.e. minutes) and confirmed it overwrites, so I am assuming it will work for all patterns.


If you are using Linux, you can configure a cron job using tmpwatch.

Most Linux systems have a tmpwatch cron job that cleans up the /tmp directory. You can add another that monitors your logging directory and deletes files over 7 days old.

If you are using a different system, there are probably equivalent utilities.


Inspite of starting a chrone job, for the task, we can use log4j2.properties file in config folder of logstash. Have a look at the link below, this will be helpful.

https://github.com/elastic/logstash/issues/7482


The class DailyRollingFileAppender uses the DatePattern option to specify the rolling schedule. This pattern should follow the SimpleDateFormat conventions from Std. Ed. v1.4.2. So, we have to use E option (Day in week). For example:

<param name="DatePattern" value="'.'EEE"/>

See more about DailyRollingFileAppender class from log4j javadoc here. Unfortunately the Java 1.4.2 documentation is no longer online, but you can download a copy here.


I had set:

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.DatePattern='.'yyyy-MM-dd
# Archive log files (Keep one year of daily files)
log4j.appender.R.MaxBackupIndex=367

Like others before me, the DEBUG option showed me the error:

log4j:WARN No such property [maxBackupIndex] in org.apache.log4j.DailyRollingFileAppender.

Here is an idea I have not tried yet, suppose I set the DatePattern such that the files overwrite each other after the required time period. To retain a year's worth I could try setting:

log4j.appender.R.DatePattern='.'MM-dd

Would it work or would it cause an error ? Like that it will take a year to find out, I could try:

log4j.appender.R.DatePattern='.'dd

but it will still take a month to find out.


I create this Methode and call it by closing the application:

  public void deleteFiles(){

    File f = new File("log");
    File[] fileArray = f.listFiles();
    double timenow = System.currentTimeMillis();

    double olderTenDays = timenow - 864000000;// MS for ten days

    for (int i = 0; i < fileArray.length; i++) {

        if(fileArray[i].lastModified()< olderTenDays )
           fileArray[i].delete();
    }
 }

ReferenceURL : https://stackoverflow.com/questions/3683364/how-to-configure-log4j-to-only-keep-log-files-for-the-last-seven-days

반응형