systemd stdout은 긴 줄을 기록합니다.

systemd stdout은 긴 줄을 기록합니다.

systemd는 매우 긴 로그 줄을 여러 로그 메시지로 분할하는 것 같습니다.

$ journalctl -u myunit
Nov 12 08:00:18 ovh7 uwsgi[32441]: SHORT LINE
Nov 12 08:00:18 ovh7 uwsgi[32441]: START of VERY VERY LONG LINE ON STDOUT
Nov 12 08:00:18 ovh7 uwsgi[32441]: CONTINUE VERY VERY LONG LINE
Nov 12 08:00:18 ovh7 uwsgi[32441]: SHORT LINE

이제 상관없습니다. 하지만 내 프로세스에서 원시 표준 출력을 가져오려면 별도의 로그 메시지를 포함해야 합니다. 나는 간단히 pid의 로그를 샅샅이 뒤지고 Journalctl의 json 출력을 사용하여 MESSAGE 문자열을 연결할 수 있다고 생각했습니다.

def main():
    import optparse, json, sys
    parser = optparse.OptionParser()
    parser.add_option('--pid')
    parser.add_option('-f', '--file')
    options, args = parser.parse_args()

    with open(options.file, 'r') as f:
        for line in f:
            d = json.loads(line)
            if d['_PID'] == options.pid:
                sys.stdout.write(d['MESSAGE'].encode("utf-8"))

불행히도 systemd도 stdout에서 후행 \n을 제거하는 것처럼 보이기 때문에 위의 방법은 작동하지 않습니다. 다음을 생성합니다.

SHORT LINE START of VERY VERY LONG LINE ON STDOUT CONTINUE VERY VERY LONG LINE SHORT LINE

이제 각 MESSAGE에 추가 ​​\n을 추가해 볼 수 있지만 이로 인해 다음이 생성됩니다.

SHORT LINE
START of VERY VERY LONG LINE ON STDOUT
CONTINUE VERY VERY LONG LINE
SHORT LINE

위의 결과 중 어느 것도 그다지 도움이 되지 않습니다. 나는 이것이 필요하다:

SHORT LINE
START of VERY VERY LONG LINE ON STDOUT CONTINUE VERY VERY LONG LINE
SHORT LINE

Journalctl의 출력에는 원래 stdout 출력의 동일한 줄에서 두 개의 연속 메시지가 나왔다고 추론할 수 있는 내용이 없습니다. 내 프로그램의 표준 출력에 대해 별도의 로그 파일을 생성하지 않고도 이 데이터를 올바르게 재구성할 수 있는 방법에 대한 아이디어가 있습니까?

답변1

systemd v235부터 systemd에는 기본적으로 48k로 설정되는 LineMax=지시어가 있습니다. journald.conf따라서 로그에서 매우 긴 줄을 지원하려는 경우 첫 번째 옵션은 더 큰 값으로 설정하는 것입니다.

json둘째, ( ) 와 같은 출력 형식을 사용하면 journalctl -o json줄 바꿈이 삽입되었는지 확인할 수 있습니다. JSON에는 다음과 같이 표시됩니다.

  _LINE_BREAK: "line-max"

이러한 상황이 발생하면 다음 레코드가 행의 연속이라는 것을 알 수 있습니다. 이 기능에 대한 자세한 내용은 다음 git 커밋을 확인하세요.

https://github.com/systemd/systemd/commit/ec20fe5ffb8a00469bab209fff6c069bb93c6db2

관련 정보