지난 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.FileNamePattern
예 log4j.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
'programing' 카테고리의 다른 글
django-목록을 다시 쿼리 셋으로 변환 (0) | 2021.01.18 |
---|---|
PHP에서 소켓 전송 "ssl"이 활성화되지 않음 (0) | 2021.01.18 |
CurrentCulture, InvariantCulture, CurrentUICulture 및 InstalledUICulture의 차이점 (0) | 2021.01.18 |
오류 : Maven 컴파일 중 UTF8 인코딩에 매핑 할 수없는 문자 (0) | 2021.01.18 |
정수 목록에 대한 JSON (0) | 2021.01.18 |