Bash 시스템 단위에 사용자 정의 로그 필드 값을 추가하는 방법

Bash 시스템 단위에 사용자 정의 로그 필드 값을 추가하는 방법

bash 파일을 실행하는 시스템 서비스가 있습니다. 이 스크립트의 모든 출력은 systemd 로그에 기록되며 systemd에 의해 해당 장치에 올바르게 귀속됩니다.

# myservice.sh
echo "PROGRESS 1/5"
echo "PROGRESS 2/5"
echo "PROGRESS 3/10"
echo "PROGRESS 9/10"
> journalctl -eu my-service
oct. 19 16:01:38 my-computer systemd[1]: Started My service.
oct. 19 16:01:40 my-computer my-service[137083]: PROGRESS: 1/5
oct. 19 16:01:42 my-computer my-service[137083]: PROGRESS: 2/5
oct. 19 16:01:44 my-computer my-service[137083]: PROGRESS: 3/10
oct. 19 16:01:46 my-computer my-service[137083]: PROGRESS: 9/10
oct. 19 16:01:46 my-computer systemd[1]: my-service.service: Succeeded.

하지만 새 필드를 추가하여 로그 항목에 추가 정보를 추가하고 싶습니다. 이 방법을 사용해 보았 logger으나 성공하지 못했습니다. 필드가 올바르게 저장되지 않았고 기록된 행이 my-service.service에서 온 것으로 표시되지 않았습니다.

# myservice.sh
function log_progress() {
    logger --tag my-service --priority user.info \
           --rfc5424
           --sd-id lcupdater@1 \
           --sd-param "PROGRESS_VALUE=\"$2\"" \
           --sd-param "PROGRESS_TO=\"$3\"" \
            "$1"
}

log_progress "Doing stuff" 1 5
log_progress "Doing more stuff" 2 5
log_progress "Going on..." 3 10
log_progress "Almost done..." 9 10

> journalctl -e -o json
{
  "_UID": "0",
  "_GID": "0",
  "_PID": "147370",
  "_SOURCE_REALTIME_TIMESTAMP": "1603120378691356",
  "MESSAGE": "1 2020-10-19T17:12:58.691328+02:00 my-computer my-service - - [timeQuality tzKnown=\"1\" isSynced=\"1\" syncAccuracy=\"132000\"][lcupdater@1 PROGRESS_VALUE=\"9\" PROGRESS_TO=\"10\"] Almost d
one...",
  "__MONOTONIC_TIMESTAMP": "28976809066",
  "_TRANSPORT": "syslog",
  "SYSLOG_RAW": "<14>1 2020-10-19T17:12:58.691328+02:00 my-computer my-service - - [timeQuality tzKnown=\"1\" isSynced=\"1\" syncAccuracy=\"132000\"][lcupdater@1 PROGRESS_VALUE=\"9\" PROGRESS_TO=\"10\"] A
lmost done...",
  "SYSLOG_FACILITY": "1",
  "PRIORITY": "6",
  "__REALTIME_TIMESTAMP": "1603120378691368"
}

_SYSLOG_UNIT 필드가 누락되었으며 PROGRESS_VALUE 및 PROGRESS_TO가 올바르게 저장되지 않았습니다. 이것을 달성할 수 있는 방법이 있나요?

편집하다:

이를 달성하는 상세하지만 더 정확한 방법은 다음을 사용하는 것입니다 logger --journald.

function log_progress() {
    logger --journald <<EOF
MESSAGE=$1
PROGRESS_VALUE=$2
PROGRESS_TO=$3
SYSLOG_IDENTIFIER=my-service
SYSLOG_FACILITY=3
PRIORITY=6
_SYSTEMD_UNIT=my-service.service
EOF
}

그러나 _SYSTEMD_UNIT 필드는 systemd만 작동할 수 있으므로 제거됩니다.

답변1

절대적으로 기반systemd.journal-필드문서("새 필드는 응용 프로그램에서 자유롭게 정의할 수 있지만 [...]"내가 찾은 유일한 해결책Journald-socket 및 c-library를 통해 기본 메시징을 사용합니다. 쉘 스크립트에서 쉽게 사용할 수 있는 것을 찾지 못했습니다.시스템 고양이json을 입력으로 허용합니다.

지금까지 가장 쉬운 방법은 아마도 Python으로 애플리케이션을 다시 작성하고 다음을 사용하는 것입니다.systemd.journal-모듈

관련 정보