Bash의 로그 파일 작성 유틸리티(로거는 파일을 생성하지 않음)?

Bash의 로그 파일 작성 유틸리티(로거는 파일을 생성하지 않음)?

디버깅을 돕거나 단순히 프로그램 흐름을 추적하기 위해 크거나 복잡한 bash 스크립트를 만들 때 /tmp 또는 /var에 로그 파일을 작성하는 경우가 많습니다. 나는 일반적 echo "$(date '+%Y-%m-%d_%H:%M:%S') something happened" > /tmp/log으로 괜찮은 것과 유사한 작업을 수행 하지만 "표준" syslog 형식을 기대하는 프로그램에 쉽게 수집될 수 있는 작업은 아닙니다(Apache 농담은 제쳐두고). 어딘가에 새 로그 파일을 생성하라는 명령을 내려고 했지만 logger이에 대한 옵션이 없는 것 같습니다. 나는 그것이 그 부분을 syslogd에 맡기고 시설 구성이라고 생각합니다.

호스트 이름, 벙크 기능 및 PID를 포함하도록 위의 "표준" 형식을 수정할 수 있지만 누군가가 이미 알아낸 다른 뉘앙스와 형식이 간과되었을 수도 있습니다.

loggersyslog를 거치지 않고 RFCxxx 형식의 로그 파일을 작성할 수 있는 유사한 유틸리티가 있습니까 ?

답변1

그냥 손으로 하면 될 것 같은데...

재미있는 부분은 다양한 형식입니다. Bash가 두 가지를 모두 생성하는 기능은 다음과 같습니다.RFC 5424그리고RFC 3164스타일 메시지. 첫 번째 타임스탬프의 %06N및 형식 %:z에는 GNU 날짜가 필요할 수 있지만 확실하지 않습니다.

#!/bin/bash

# print RFC 5424 syslog message, without structured data,
# somewhat like 'logger -i --rfc5424=notq', e.g.
# <13>1 2021-10-28T14:48:10.613772+03:00 myhost ilkkachu 20415 - - a problem happened
# format is
# <prio>version date host tag pid - - message
lognew() {
        local facility="${log_facility-5}"  # default 'user'
        local severity="$1"
        shift 
        local prio=$(( facility*8 + severity ))
        local version=1
        local date=$(date +"%Y-%m-%dT%H:%M:%S.%06N%:z")
        local tag="${log_tag-$USER}"        # default to username 
        local pid="$$"
        local IFS=" "
        local message="$*"
        printf "<%d>%d %s %s %s %d - - %s\n" "$prio" "$version" "$date" "$HOSTNAME" "$tag" "$pid" "$message"
}

# print RFC 3164 syslog message,
# somewhat like 'logger -i --rfc3164'
# <13>Oct 28 14:49:13 myhost ilkkachu[20418]: another problem happened
# format:
# <prio>date host tag[pid]: message
logold() {
        local facility="${log_facility-5}"  # default 'user'
        local severity="$1"
        shift
        local prio=$(( facility*8 + severity ))
        local date=$(LC_ALL=C date +"%b %_d %H:%M:%S")
        local tag="${log_tag-$USER}"        # default to username 
        local pid="$$"
        local IFS=" "
        local message="$*"
        printf "<%d>%s %s %s[%d]: %s\n" "$prio" "$date" "$HOSTNAME" "$tag" "$pid" "$message"
}

log_facility=1 # user
log_tag="test"

# 6 = info
lognew 6 testing messaging
# 4 = warning
logold 4 obsolete message format

인쇄된 PID는 스크립트의 PID이며 출력은 다음과 같습니다.

<14>1 2021-10-28T15:06:17.413125+03:00 myhost test 20499 - - testing messaging
<12>Oct 28 15:06:17 myhost test[20499]: obsolete message format

관련 정보