특정 로그에 대한 로그 메시지를 추출하기 위해 systemd의 로깅을 사용할 수 있는지 궁금합니다. 예를 들어 C에서 로그를 열면 " " 또는 ? openlog('slog', LOG_CONS | LOG_PID, LOG_LOCAL1)
아래에 기록된 메시지만 추출됩니다.slog
LOCAL1
내가 journalctl -u slog
이와 같은 작업을 수행하면 journalctl -u LOG_LOCAL1
실제 로그 메시지가 아니라 로그가 시작되고 끝나는 시기만 알려줍니다.
답변1
예, 가능합니다. 하지만 잘못된 스위치를 에 전달하고 있습니다 journalctl
.
~에 따르면로그 제어(1)매뉴얼 페이지:
주어진 syslog 식별자(예: "foo")가 있는 메시지를 읽으려면,
journalctl -t foo
또는journalctl SYSLOG_IDENTIFIER=foo
;주어진 syslog 도구를 사용하여 메시지를 읽으려면 발행하십시오
journalctl SYSLOG_FACILITY=1
(도구는 숫자 값을 사용하여 저장되고 일치됩니다).
SYSLOG_IDENTIFIER
보다 일반적으로 syslog 식별자와 기능은 로그에 별도의 필드( 및 )로 저장됩니다 SYSLOG_FACILITY
. C API 등에서 로그에 액세스해야 하는 경우 이러한 필드에 직접 일치 항목을 추가해야 합니다.
이 journalctl -u
스위치는 메시지를 생성한 프로세스를 소유한 시스템 장치의 이름에 일치 항목을 추가합니다. 따라서 이것은 사용하기에 잘못된 스위치입니다.
답변2
옳은. 그게 다야. 이제 Journalctl을 중심으로 스크립트를 작성할 시간입니다.
#!/bin/bash
# Provide a simple command-line interface for systemd "journalctl"
# See /usr/include/sys/syslog.h for syslog integer ids
# Example usage: "./syslog/bin/syslogga.sh --local0 --tail" to tail local0
set -o nounset
declare -a OPTIONS
declare -a MATCHES
OPTIONS=()
MATCHES=()
function processOptions {
local UNKNOWN=
local HELP=
local SYSLOGSEL=0
for P in "$@"; do
if [[ $P == --kernel || $P == --kern || $P == -0 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=0")
continue
fi
if [[ $P == --user || $P == -1 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=1")
continue
fi
if [[ $P == --mail || $P == -2 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=2")
continue
fi
if [[ $P == --daemon || $P == -3 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=3")
continue
fi
if [[ $P == --auth || $P == -4 || $P == --selinux ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=4")
continue
fi
if [[ $P == --syslog || $P == -5 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=5")
continue
fi
if [[ $P == --lpr || $P == -6 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=6")
continue
fi
if [[ $P =~ --news || $P == -7 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=7")
continue
fi
if [[ $P == --uucp || $P == -8 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=8")
continue
fi
if [[ $P == --cron || $P == -9 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=9")
continue
fi
if [[ $P == --authpriv || $P == -10 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=10")
continue
fi
if [[ $P == --ftp || $P == -11 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=11")
continue
fi
if [[ $P == --local0 || $P == -16 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=16")
continue
fi
if [[ $P == --local1 || $P == -17 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=17")
continue
fi
# In our system, local2 is sshd log
if [[ $P == --local2 || $P == -18 || $P == --ssh ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=18")
continue
fi
# In our system, local3 is pdns-recursor log
if [[ $P == --local3 || $P == -19 || $P == --dns ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=19")
continue
fi
if [[ $P == --local4 || $P == -20 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=20")
continue
fi
if [[ $P == --local5 || $P == -21 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=21")
continue
fi
if [[ $P == --local6 || $P == -22 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=22")
continue
fi
if [[ $P == --local7 || $P == -23 ]]; then
(( SYSLOGSEL += 1 )); if [[ $SYSLOGSEL -gt 1 ]]; then break; fi
MATCHES+=("SYSLOG_FACILITY=23")
continue
fi
# Additional options
if [[ $P =~ ^(--tail|-t|--follow|-f) ]]; then
OPTIONS+=("--follow") # yup, "journalctl" uses "follow" instead of "tail"
continue
fi
if [[ $P =~ ^(--pager-end|-e|--bottom|--btm|--end) ]]; then
OPTIONS+=("--pager-end")
continue
fi
if [[ $P =~ ^(--help|-h) ]]; then
HELP=1
break
fi
# if we are here, we encountered something unknown in P
# if UNKNOWN is already set, add a comma for separation
if [[ -n $UNKNOWN ]]; then
UNKNOWN="$UNKNOWN,"
fi
UNKNOWN="${UNKNOWN}${P}"
done
if [[ $SYSLOGSEL -gt 1 ]]; then
echo "More than one facility selected" >&2
HELP=1
fi
if [[ -n $UNKNOWN ]]; then
echo "Unknown parameters '$UNKNOWN'" >&2
HELP=1
fi
if [[ -n $HELP ]]; then
# Only in our setup:
SPECIAL_16
cat >&2 <<HERE
Facilities:
--kern[el] , -0
--user , -1
--mail , -2
--daemon , -3
--auth , -4 , --selinux
--syslog , -5
--lpr , -6
--news , -7
--uucp , -8
--cron , -9
--authpriv , -10
--ftp , -11
--local0 , -16
--local1 , -17
--local2 , -18 , --ssh
--local3 , -19 , --dns
--local4 , -20
--local5 , -21
--local6 , -22
--local7 , -23
Options:
--tail , --follow , -t , -f
--pager-end, --btm, --bottom, --end, -e
HERE
exit 1
fi
}
processOptions "$@"
declare -a ALL
ALL=()
if [[ -n ${OPTIONS[@]:-""} ]]; then
ALL+=(${OPTIONS[@]})
fi
if [[ -n ${MATCHES[@]:-""} ]]; then
ALL+=(${MATCHES[@]})
fi
if [[ -n ${ALL[@]:-""} ]]; then
echo Running journalctl "${ALL[@]}" >&2
journalctl "${ALL[@]}"
else
echo "Nothing set"
fi