다음은 "pushtolog"가 파이프에서 텍스트 줄을 받아 이름에 오늘 날짜가 포함된 파일에 기록하는 유틸리티인 가상의 명령줄입니다.
tail -F mylatestlogfile.log | grep "ERROR" | pushtolog -d /tmp/myerrors/ -f yyyy-MM-dd -r errors -e log
2017년 2월 17일에 실행하면 출력이 파일에 기록됩니다.
/tmp/myerrors/errors.2017-02-17.log
2017년 2월 18일 자정에 파일이 닫히고 추가 출력이 파일에 기록됩니다.
/tmp/myerrors/errors.2017-02-18.log
전환은 자동으로 수행됩니다. 관련 로그 라인의 수가 적기 때문에 성능은 그다지 중요하지 않으므로 최악의 경우 유틸리티가 로그 라인을 작성할 때마다 날짜를 확인하는 것이 좋습니다.
이 프로그램을 실행할 GNU/Linux 서버에는 최소한의 유틸리티 세트가 설치되어 있습니다. Python 2가 설치되어 있고 유틸리티를 직접 작성할 수 있습니다. 이 단계를 수행하기 전에 작업을 수행할 수 있는 도구가 있는지 또는 작업을 수행할 수 있는 관용적 대안이 있는지 물어보는 것이 좋습니다.
logrotate를 사용할 수 있지만 한 단계에서 모든 작업을 수행하는 것이 "더 쉬워" 보이기 때문에 매번 회전을 수행하는 것을 피하고 싶습니다.
다중 로그대상 로그 파일을 전환하는 유사한 문제를 해결하는 것 같지만 날짜가 변경될 때가 아닌 로그 파일이 가득 찼을 때 발생합니다. 루트 액세스 권한이 없고 이를 얻기 위해 패키지 관리자를 실행할 수 없습니다. 내가 가진 권한으로 소스에서 성공적으로 빌드할 수 있는지 조사하지 않았습니다. 그것이 분명히 작업을 위한 도구라면 저는 이 옵션을 선택하겠습니다.
답변1
나는 Awk의 기능을 사용하여 각 평가의 오늘 날짜(로그의 각 줄)를 포함하여 파일 이름 구성을 평가했으며 다음과 같이 끝났습니다.
tail -F mylatestlogfile.log | grep "ERROR" | awk '{print >> "/tmp/myerrors/errors." strftime("%Y-%m-%d") ".log"}'
답변2
bash
다음 코드를 스크립트 로 사용해 볼 수 있습니다 .
#!/bin/bash
while getopts "d:f:e:r:a" opt; do
case $opt in
f) FDATE=$(awk -v fmt="$OPTARG" '{print strftime(fmt)}'<<<DUMMY) ;;
r) PREFIX="$OPTARG" ;;
e) SUFFIX="$OPTARG" ;;
d) DEST="$OPTARG" ;;
a) APPEND=true ;;
esac
done
if [ ! $APPEND ]
then
> ${DEST}/${PREFIX}.${FDATE}.${SUFFIX}
fi
while read line; do echo ${line} >> ${DEST}/${PREFIX}.${FDATE}.${SUFFIX}; done
다음을 사용하여 스크립트 본문을 둘러쌀 수도 있습니다.
pushtolog()
{
...
}
그리고 그 소스를 얻으세요.
또한 기존 데이터에 추가할 수 있도록 플래그를 추가했습니다. 특정 옵션이 설정되면 기본적으로 추가하고 재정의하도록 스크립트를 쉽게 변경할 수 있어야 합니다.
참고 1: 날짜 형식은 strftime
( 참조 man strftime
)을 준수해야 하므로 다음을 사용하십시오."%Y-%m-%d"
노트 2: 이 변수 APPEND
는 실제로 부울이 아닙니다. 단지 그럴 것이라고 상상했을 뿐입니다. 어쩌면 사용하는 것이 APPEND="true"
더 나을 수도 있습니다.if [ -z "$APPEND" ]