파일 이름에 오늘 날짜가 포함된 로그 파일로 파이프

파일 이름에 오늘 날짜가 포함된 로그 파일로 파이프

다음은 "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" ]

관련 정보