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出力の同じ行から2つの連続したメッセージが出たと推論できる内容はありません。私のプログラムの標準出力用に別々のログファイルを生成せずにこのデータを正しく再構成する方法についてのアイデアはありますか?

答え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

関連情報