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