systemd-journald에 전송되지 않은 수십 개의 로그 파일을 검색하려고 하는데, Journalctl의 -S
(since) 및 -U
(until)과 같이 시간별로 결과를 필터링하고 싶습니다.
- 옵션 1: 행을 읽고, 타임스탬프를 구문 분석하고, 필터링된 출력을 인쇄하는 프로그램 작성
- 옵션 2: Ubuntu dateutils 패키지의 /usr/bin/dateutils.dgrep 사용
- 옵션 3: 로그 파일을 로그 형식으로 변환하고 사용
journalctl --root $dir -S xxx -U yyy
저는 1번부터 시작해서 바퀴를 재창조하고 있다는 것을 깨달았고, 2번을 시도해 보았는데 속도가 매우 느리다는 것을 알았습니다. 그런 다음 3번을 봤습니다. 대부분은 빠르고 완벽했으며 많은 "눈알"(특히 "유료 눈알")을 끌었기 때문입니다. ) ") 조심해.
그렇다면 항목을 시간별로 필터링할 수 있도록 syslog 스타일 로그 파일을 로그 파일로 변환할 수 있는 도구가 있습니까? Systemd-cat
타임스탬프 위조가 허용되지 않기 때문에 작동하지 않습니다. 결과 로그 파일에는 모든 일이 거의 동시에 일어났다고 표시됩니다.
어떤 제안이 있으십니까?
감사해요!
편집하다:
로그 파일은 100MB를 초과하고 거의 100개에 달하며 타임스탬프는 간단한 syslog 스타일 "MMM DD HH:MM:SS"입니다. 저는 단지 "이 두 시간 사이의 로그 항목을 표시합니다"라고 말하고 싶습니다.
옵션 #1은 "이를 수행하기 위한 프로그램 작성"이지만 이 휠이 여러 번 재창조되었다고 확신합니다. 여기에 또 다른 (보통) 휠을 추가하는 것이 어리석은 느낌일 것입니다.
옵션 #2는 파일 하나도 완성하지 못하고 30분 만에 포기했습니다. 본질적으로 나는 재사용이 가능하고 journalctl
대답의 좋은 부분처럼 보이는 빠른 일반 솔루션을 원합니다.
나는 이것이 journalctl
로그 파일의 단조롭게 증가하는 타임스탬프를 활용하고 이진 검색을 사용하여 주어진 시간 범위 내에서 레코드를 찾는다고 생각합니다. dateutils.dgrep
( ) 프로그램은 dategrep
그러한 가정을 허용하지 않으므로 1월 당밀보다 속도가 느려집니다.
편집 2:
입력 로그를 구문 분석하고, 로그 내보내기 형식으로 레코드를 내보내고, systemd-journal-remote를 사용하여 로그 파일을 생성하는 짧은 스크립트를 작성하는 것처럼 보입니다.
journalctl -n 10 -o export > journal.txt
/lib/systemd/systemd-journal-remote -o test.journal journal.txt
journalctl --file=test.journal -S "yyyy-mm-dd hh:mm:ss" -U "yyyy-mm-dd hh:mm:ss"
(log entries for time range shown)
journalctl --verify --file=test.journal
PASS: test.journal
처음에는 이 줄에 봉인 체크섬이 포함될 수 있다고 생각했지만 __CURSOR
, 이를 제거해도 눈에 띄는 효과는 없습니다. Ubuntu 20.04에서는 순방향 보안 봉인이 기본적으로 활성화되어 있지 않은 것으로 보이지만, Journalctl은 로그 항목이 단조롭게 증가하지 않는지 감지합니다.
rm -f test.journal
/lib/systemd/systemd-journal-remote -o test.journal journal.txt
/lib/systemd/systemd-journal-remote -o test.journal journal.txt
journalctl --verify --file=test.journal
3947a0: Entry timestamp out of synchronization
File corruption detected at test.journal:3947a0 (of 8388608 bytes, 44%).
FAIL: test.journal (Bad message)
임의의 로그 파일을 저널 형식으로 가져와서 Journalctl을 사용하여 액세스하는 것은 상당히 쉬운 것 같습니다.
답변1
옵션 1 - 시간별로 로그 파일 필터링(로그 변환 건너뛰기)
systemd-journald에 전송되지 않은 수십 개의 로그 파일을 검색하려고 하는데, Journalctl의 -S(since) 및 -U(until)와 같이 시간별로 결과를 필터링하고 싶습니다.
특정 날짜 시간 범위에 대한 syslog 스타일 로그 파일만 보려면 다음을 시도하십시오.super-speedy-syslog-searcher
. 이는 super-speedy-syslog-searcher
systemd 로깅 서비스의 기능을 사용하고 사용을 건너뜁니다.
당신이 가지고 있다고 가정러스트 설치됨, 달리기
$ cargo install super_speedy_syslog_searcher
그런 다음 s4
로그 파일이 포함된 디렉터리에서 실행합니다.
$ s4 /logs
특정 날짜/시간 범위로 제한하려면 -a
및 -b
옵션을 전달하여 날짜/시간별로 필터링하세요. 날짜/시간 필터링을 사용한 로그 파일 처리 예
$ cat /tmp/logs/kernel.log
<6>Jan 1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
<6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
$ cat /tmp/logs/syslog.1
<29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
<86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received
$ s4 -a "2023-01-02T00:00:00Z" -b "2023-01-03T00:00:00Z" /tmp/logs/
<6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
옵션 2 - 로그 파일을 로그 파일로 변환
항목을 시간별로 필터링할 수 있도록 syslog 스타일 로그 파일을 로그 파일로 변환할 수 있는 도구가 있습니까?
개요
시스템 로그를 변환하는 일련의 작업은 다음과 같습니다.
- 사용
super-speedy-syslog-searcher
특별히 형식이 지정된 날짜 및 시간을 사용하여 로그를 다시 인쇄합니다. - 사용
journalctl
각 syslog 메시지를 라인 기반 기본 로거 메시지로 변환저널 내보내기 형식 - 사용
systemd-journal-remote
메시지 가져오기
1. super-speedy-syslog-searcher
로그 파일을 다시 인쇄하는 데 사용됩니다.
/tmp/logs/syslog.1
syslog 스타일 메시지가 포함된 로그 파일 제공
<29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
<86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received
super-speedy-syslog-searcher
( s4
)를 사용하면 -n
UTC 시간대( )에서 파일 이름( )과 선행 날짜-시간이 Unix epoch( )(마이크로초)로 표시되는 행을 다시 인쇄합니다.-d '%s000000'
-u
$ s4 -n -u -d '%s000000' /tmp/logs/syslog.1
syslog.1:1672610305000000:<29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
syslog.1:1672786836000000:<86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received
2. journalctl
syslog 메시지를 저널 형식 메시지로 변환하는 데 사용됩니다.
다음은 다음 명령어를 사용하여 최소 디자인 로그 형식의 로그 메시지를 생성하는 예입니다 logger
.
$ echo "SYSLOG_IDENTIFIER=logger
MESSAGE=one journal logger message
MESSAGE_ID=$(uuidgen)" | logger --journald -s
$ journalctl -n1 -t logger
Feb 03 00:48:01 HOST logger[445736]: one journal logger message
다음으로 내보낸 메시지입니다.저널 내보내기 형식
$ journalctl -n1 --identifier=logger --output=export
__CURSOR=s=4a35367b4dd3403b948f1a5ff2fb3515;i=474833;b=5285cccfe2f9481ca12589f5511b8c57;m=dd9ee>
__REALTIME_TIMESTAMP=1675414081923660
__MONOTONIC_TIMESTAMP=951851827460
_BOOT_ID=5286cccfe2f9481ca1ea8cf5221b8c5e
_UID=0
_GID=0
_MACHINE_ID=333fa82c526bba518cdc8c2262e6d480
_HOSTNAME=HOST
_TRANSPORT=journal
SYSLOG_IDENTIFIER=logger
MESSAGE=one journal logger message
MESSAGE_ID=4ebd2168-30bf-4258-bf0f-54b5811674e1
_PID=445736
_COMM=logger
_SOURCE_REALTIME_TIMESTAMP=1675414081923606
3. systemd-journal-remote
로그 로그 메시지를 가져오는 데 사용됩니다.
인공 메시지를 가져오려면 유사한 데이터를 로그 서비스로 재전송을 사용하세요 systemd-journal-remote
.
로그 메시지의 경우 각각의 새 로그 항목에는 MESSAGE_ID
, MESSAGE
, _TRANSPORT
, __REALTIME_TIMESTAMP
, 매개변수만 필요합니다 _SOURCE_REALTIME_TIMESTAMP
. 설정. 값을 _TRANSPORT
재정의 하고 Unix 시대 이후 마이크로초 단위의 날짜/시간 스탬프를 사용합니다. ~을 위한syslog
__REALTIME_TIMESTAMP
_SOURCE_REALTIME_TIMESTAMP
2023년 1월 1일 15:00:36 PST, 값은1672614036000000.
$ echo "\
__REALTIME_TIMESTAMP=1672614036000000
_TRANSPORT=syslog
MESSAGE_ID=4ebd2168-30bf-4258-bf0f-54b5811674e1
MESSAGE=one journal logger message
SYSLOG_IDENTIFIER=logger
_SOURCE_REALTIME_TIMESTAMP=1672614036000000
" | /usr/lib/systemd/systemd-journal-remote --output=/tmp/tmp.journal -
$ journalctl --output=short-full --file=/tmp/tmp.journal
Sun 2023-01-01 15:00:36 PST logger: one journal logger message
1., 2., 3.을 합치세요.
이 모든 콘텐츠를 로그 파일 디렉터리 /tmp/logs
를 /tmp/logsj
.
syslog 스타일 로그 파일이 주어지면:
$ cat /tmp/logs/kernel.log
<6>Jan 1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
<6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
$ cat /tmp/logs/syslog.1
<29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
<86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received
kernel.log
다음 방법을 사용하여 파일을 다시 인쇄하십시오 s4
.
$ s4 --color=never -n -u -d '%s000000' /tmp/logs/kernel.log | tail -n1
kernel.log:1672689660000000:<6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
:
앞에 추가된 필드는 (기본값)으로 구분됩니다.
path 아래의 각 syslog 스타일 로그 파일을 /tmp/logs
path 아래의 해당 로그 파일로 처리합니다 /tmp/logsj
. SYSLOG_IDENTIFIER
파일 확장자를 제외한 파일 이름으로 설정됩니다 . 생성된 로그 파일은 소스 파일 이름에 .journal
.
#!/usr/bin/env bash
mkdir /tmp/logsj
while read line; do
echo "line is '${line}'"
name=$(echo -n "${line}" | cut -f1 -d:)
ts=$(echo -n "${line}" | cut -f2 -d:)
mesg=$(echo -n "${line}" | cut -f3- -d:)
jmesg="\
__REALTIME_TIMESTAMP=${ts}
_TRANSPORT=syslog
MESSAGE_ID=$(uuidgen)
MESSAGE=${mesg}
SYSLOG_TIMESTAMP=${ts}
SYSLOG_IDENTIFIER=${name%%.*}
_SOURCE_REALTIME_TIMESTAMP=${ts}
"
echo "${jmesg}" | /usr/lib/systemd/systemd-journal-remote "--output=/tmp/logsj/${name}.journal" -
done <<< $(s4 --color=never -n -u -d '%s000000' /tmp/logs/)
새 로그 파일을 봅니다.
$ ls -l /tmp/logsj/
-rw-r----- 1 root root 8388608 Feb 3 14:36 kernel.log.journal
-rw-r----- 1 root root 8388608 Feb 3 14:36 syslog.1.journal
$ PAGER= journalctl --utc --output=short-full --directory=/tmp/logsj/
Sun 2023-01-01 21:58:25 UTC kernel: <6>Jan 1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
Sun 2023-01-01 21:58:25 UTC syslog: <29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
Mon 2023-01-02 20:01:00 UTC kernel: <6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
Tue 2023-01-03 23:00:36 UTC syslog: <86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received
journalctl
날짜/시간 조각에서 작동합니다.
$ PAGER= journalctl --utc --output=short-full --until "2023-01-01 23:00:00 UTC" --directory=/tmp
/logsj/
Sun 2023-01-01 21:58:25 UTC kernel: <6>Jan 1 13:58:25 HOST kernel: [44033.150723] eth0: link up (100Mbps/Full duplex)
Sun 2023-01-01 21:58:25 UTC syslog: <29>Jan 1 13:58:25 HOST netifd: Network device 'eth0' link is up
$ PAGER= journalctl --utc --output=short-full --since "2023-01-01 23:00:00 UTC" --directory=/tmp
/logsj/
Mon 2023-01-02 20:01:00 UTC kernel: <6>Jan 2 12:01:00 HOST kernel: [194033.150723] loop7: detected capacity change from 0 to 113888
Tue 2023-01-03 23:00:36 UTC syslog: <86>Jan 3 15:00:36 HOST dropbear[23732]: Exit (root): Disconnect received