나는 내 journalctl
.conky
journalctl
journalctl -u PROCESS -n 5 --no-pager -l
DATE TIME HOSTNAME PROCESS: MESSAGE
그냥 인쇄하고 싶은데 TIME MESSAGE
어떻게 해야 하나요?
맨페이지에는 인수가 있다고 나와 있지만 -o
내 필요에 맞는 미리 정의된 형식이 없습니다. 을 추가하려고 시도했지만 --output-fields=__REALTIME_TIMESTAMP,MESSAGE
(타임스탬프/메시지 대신) 기본 출력만 표시됩니다. 주장에서는 특정 형식만 영향을 받는다고 주장하여 이를 시도했지만 --output-fields=__REALTIME_TIMESTAMP,MESSAGE -o verbose
정상적인 장황한 출력만 제공되었습니다. 또한 항상 인쇄되는 필드가 4개 있는데 이는 이미 나에게 너무 많은 것입니다. 나는 단지 2개만 원한다: 간결한 타임스탬프와 메시지.
bash 마법이나 Python 스크립트를 사용하여 정리할 수 있지만 너무 과도한 것 같습니다. 물론 Journalctl에게 타임스탬프와 메시지만 요청하는 방법이 있을까요?
답변1
journalctl --output cat
cat
generates a very terse output, only showing the actual message of each journal entry with no metadata, not even a timestamp. If combined with the --output-fields= option will output the listed fields for each log
record, instead of the message.
답변2
journalctl
타임스탬프와 메시지만 제공하도록 요구하는 방법이 있습니까 ?
캔트. 현재(2023년 11월) 기준으로는 journalctl
후처리 없이 시간과 메시지만 출력하는 것은 불가능합니다 . 당신이 원하는 것에 가장 가까운 것은
journalctl --no-hostname -o short-full
이것이 충분하지 않은 경우 DATE TIME PROCESS: MESSAGE
유일한 옵션은 다른 도구를 사용하여 해당 데이터를 추출/형식화하는 것입니다. 사용자와 마찬가지로 이들 모드 중 하나를 사용 하거나 출력 모드를 사용하여 타임스탬프와 메시지만 추출
할 수 있습니다 (타임스탬프만 시간으로 변환).journalctl
json
export
딘 레진 여기에 표시통과하다 jq
.
또한 사용 가능한 바인딩 중 하나를 사용 systemd
하고 사용자가 제안한 대로 해당 데이터를 가져오는 도구를 직접 작성할 수도 있습니다.막시코댓글(예:python systemd.journal
)
마지막으로 메시지를 실시간으로 표시하려면 모드 journalctl
에서 사용하고 다음 과 follow
같이 줄이 인쇄될 때마다 타임스탬프를 앞에 추가할 수 있습니다 .ts
moreutils
journalctl -f -o cat | ts '%H:%M:%S'
이제 --output-fields=__REALTIME_TIMESTAMP,MESSAGE
이 두 필드를 인쇄하면 안되는 이유는 다음과 같습니다.
이것현재 매뉴얼 페이지journalctl
, "출력 옵션" 섹션에는 다음과 같이 명시되어 있습니다.
--output-fields=
출력에 포함되어야 하는 쉼표로 구분된 필드 목록입니다.이는 출력에만 영향을 미칩니다. 일반적으로 스키마에는 모든 필드가 표시됩니다.(verbose, 내보내기, json, json-pretty, json-sse 및 json-seq),그리고 고양이에게도. ~을 위한 이전의 것"__CURSOR", "__REALTIME_TIMESTAMP",
"__MONOTONIC_TIMESTAMP" 및 "_BOOT_ID"필드는 항상 인쇄됩니다..
--output-fields
버전 236에 추가되었지만 다음을 사용할 때 필드 필터링을 지원합니다.-o cat
나중에 버전 246에 추가됨:
Journalctl의 "-o cat" 출력 모드는 이제 무조건적인 MESSAGE= 대신 --output-fields=로 지정된 로그 필드를 표시합니다. 이는 수정 없이 매우 구체적인 필드 집합을 검색하는 데 유용합니다.
위의 내용을 바탕으로,다음 네 필드는 다음을 사용하지 않는 한 항상 인쇄됩니다. -o cat
. 어떤 사람들은 생각할 것이다
journalctl -o cat --output-fields=__REALTIME_TIMESTAMP,MESSAGE
작동해야 하지만 인쇄해 보세요.
Failed to get data: Invalid argument
왜 그런 겁니까?
로그 필드는 매뉴얼 페이지에 설명되어 있습니다.systemd.journal-fields
. 메시지에는 _SOURCE_REALTIME_TIMESTAMP
, __REALTIME_TIMESTAMP
및 3개의 타임스탬프 필드가 있습니다 __MONOTONIC_TIMESTAMP
(마지막 2개는 2개의 밑줄로 시작합니다). 이들 모두는 마이크로초 단위이며 10진수 문자열 형식이므로 요구 사항( HH:MM:SS
형식)과 일치하는 항목은 없습니다. 또한 동일한 매뉴얼 페이지에 따르면 마지막 두 타임스탬프는 특수 주소 지정 필드입니다(항목 필터링을 위한 일치 항목으로 사용할 수 없음).
저널 내보내기 형식이나 저널 JSON 형식과 같은 외부 형식으로 직렬화하는 동안일기장 주소 이중 밑줄 접두사가 붙은 필드로 직렬화됩니다. 알아채다 이는 로그에 저장될 때 올바른 필드가 아니지만 항목 주소 지정을 위한 메타데이터. 다음과 같은 호출을
sd_journal_send(3)
통해 구조화된 로그 항목의 일부로 기록될 수 없습니다.그들은 아마도 또한 일치 항목으로 사용할 수 없습니다.sd_journal_add_match(3)
.
마지막 문장이 지적한다sd_journal_add_match(3)
매뉴얼 페이지에는 다음과 같이 명시되어 있습니다.
sd_journal_add_match()
로그 파일 항목을 필터링하기 위해 일치 항목을 추가합니다. 이 호출에 적용된 일치 항목은sd_journal_next(3)
및 등의 호출을 통해 로그 파일에서 반복하고 읽을 수 있는 항목을 필터링합니다sd_journal_get_data(3)
. 매개변수 데이터는 "FIELD=value" 형식이어야 합니다.대지부분은 0-9, A-Z 및 밑줄만 포함하는 짧은 대문자 문자열입니다.그것 두 개의 밑줄로 시작할 수 없습니다또는 빈 문자열입니다.
따라서 오류: __REALTIME_TIMESTAMP
Not a valid field name sd_journal_get_data(3)
.
요약하자면: --output-fields
with를 사용하면 허용되는 유일한 타임스탬프가 있어도 출력은 원하는 것과는 거리가 멀습니다.-o cat
_SOURCE_REALTIME_TIMESTAMP
journalctl -o cat --output-fields=_SOURCE_REALTIME_TIMESTAMP,MESSAGE
인쇄
1699815974366491
Supervising 9 threads of 6 processes of 1 users.
1699815968034836
[system] Successfully activated service 'org.kde.powerdevil.backlighthelper'
답변3
답변4
journalctl
--output
나는 just , and 를 사용하는 것이 당신이 원하는 것을 정확하게 할 것이라고 믿지 않습니다 --output-fields
.
--output=json
옵션을 사용한 journalctl
다음 jq
.
jq
Linux json 프로세서입니다. 당신은 그것을 사용할 수 있습니다 sudo apt install jq
.
옵션에 사용 가능한 필드는 --output-fields
문서화되어 있지 않습니다. 다음 방법으로 사용 가능한 모든 필드를 가져올 수 있습니다.
journalctl -n1 --output=json | jq 'keys'
.
타임스탬프와 메시지만 얻을 수 있습니다.
journalctl --output=json | jq '.__REALTIME_TIMESTAMP, .MESSAGE'
여기에서 원하는 방식으로 추가 형식화/처리할 수 있습니다. 에 대한 jq
설명서를 확인하는 것이 좋습니다 man jq
.
예를 들어 사람이 읽을 수 있는 타임스탬프를 얻으려면 다음을 수행하세요.
journalctl --output=json | jq '(.__REALTIME_TIMESTAMP | tonumber/1000000 | strflocaltime("%Y-%m-%d %H:%M:%S")), .MESSAGE'
또한 json의 형식을 제거하고 모든 것을 한 줄(예: Journalctl)에 넣으려면...
journalctl --output=json | jq -r '[(.__REALTIME_TIMESTAMP | tonumber/1000000 | strflocaltime("%Y-%m-%d %H:%M:%S")), .MESSAGE] | @tsv'