systemd stdout logging para linhas longas

4

systemd aparece para dividir linhas de log muito longas em várias mensagens de log:

$ 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

Agora, eu realmente não me importo, mas preciso juntar as mensagens de log separadas para recuperar o stdout original do meu processo. Eu pensei que poderia simplesmente vasculhar os logs para o pid e juntar as strings MESSAGE usando a saída journalctl json:

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"))

Infelizmente, o item acima não funciona porque o systemd também parece aparar o \ n à direita do stdout. Isso gera isso:

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

Agora, posso tentar adicionar um extra \ n para cada MESSAGE, mas isso gera isso:

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

Nenhum dos dois resultados acima é muito útil. Eu preciso disso:

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

E não vejo nada na saída do journalctl que me permita inferir que duas mensagens consecutivas estão vindo da mesma linha na saída stdout original. Alguma idéia que me permita reconstruir esses dados corretamente sem ter que gerar um arquivo de log separado para o stdout do meu programa?

    
por mathieu 12.11.2016 / 12:55

0 respostas