exportação confiável de logs journalctl

2

Eu procuro um caminho para uma exportação confiável de logs journalctl.

Eu poderia usar a opção --since=... , mas isso é um pouco confuso.

No meu caso, um script chamaria journalctl --output=json a cada dez minutos.

Eu não quero perder uma única linha e (se possível) eu gostaria de evitar linhas duplicadas.

Alguns dias depois de fazer essa pergunta, deparei com o RELP: link

    
por guettli 30.11.2017 / 15:37

5 respostas

5

Você pode instalar um daemon syslog, como rsyslog (o padrão nos sistemas derivados da Red Hat). Isso registrará todas as entradas de diário de uma maneira compatível com versões anteriores e, é claro, você poderá especificar um log personalizado para o que desejar.

Se você não precisa de registros exportados em tempo real, você pode usar journalctl --since como algumas pessoas mencionaram. Você pode executá-lo diariamente à meia-noite com o especificador de tempo yesterday para obter exatamente 24 horas de registros.

Se você realmente precisa obter logs em intervalos curtos e não quer perder uma única entrada, então você precisa aprender sobre o cursor . Para cada entrada de log, o journalctl fornecerá um cursor que pode ser usado para pular exatamente para essa entrada de log com --cursor , ou a entrada de log imediatamente seguinte com --after-cursor . Considere o seguinte exemplo de JSON:

{
    "__CURSOR" : "s=6ad7dcf190f3409c8bf8086fec22888c;i=286c44;b=6b134acc25e94d69b4713422b7c773be;m=46f7a97d25;t=55f5e93131a32;x=aecce3d8b96df5dc",
    "__REALTIME_TIMESTAMP" : "1512234682620466",
    "__MONOTONIC_TIMESTAMP" : "304802790693",
    "_BOOT_ID" : "6b134acc25e94d69b4713422b7c773be",
    "PRIORITY" : "6",
    "_MACHINE_ID" : "770056613d554df2abcb7757ba2e6270",
    "_HOSTNAME" : "dalaran.example.us",
    "_PID" : "1",
    "_UID" : "0",
    "_SELINUX_CONTEXT" : "system_u:system_r:init_t:s0",
    "_GID" : "0",
    "_CAP_EFFECTIVE" : "3fffffffff",
    "SYSLOG_FACILITY" : "3",
    "SYSLOG_IDENTIFIER" : "systemd",
    "_TRANSPORT" : "journal",
    "_COMM" : "systemd",
    "_EXE" : "/usr/lib/systemd/systemd",
    "_CMDLINE" : "/usr/lib/systemd/systemd --switched-root --system --deserialize 25",
    "_SYSTEMD_CGROUP" : "/init.scope",
    "_SYSTEMD_UNIT" : "init.scope",
    "_SYSTEMD_SLICE" : "-.slice",
    "CODE_FILE" : "../src/core/unit.c",
    "CODE_LINE" : "1505",
    "CODE_FUNC" : "unit_status_log_starting_stopping_reloading",
    "MESSAGE_ID" : "de5b426a63be47a7b6ac3eaac82e2f6f",
    "MESSAGE" : "Stopping OpenSSH server daemon...",
    "UNIT" : "sshd.service",
    "_SOURCE_REALTIME_TIMESTAMP" : "1512234682615526"
}

Para seus objetivos, o __CURSOR é um blob opaco. Basta capturar o valor da entrada de log last que você recebe em uma chamada para journalctl e alimentá-lo para a chamada seguinte :

journalctl --output=json --after-cursor="s=6ad7dcf190f3409c8bf8086fec22888c;i=286c44;b=6b134acc25e94d69b4713422b7c773be;m=46f7a97d25;t=55f5e93131a32;x=aecce3d8b96df5dc" ...
    
por 06.12.2017 / 00:05
1

Use a opção --since. Para obter registros dos últimos 10 minutos, use:

--since -10m

Isso lhe dará registros 10 minutos antes da hora atual. Veja a página man link e esta página sobre especificações de tempo para systemd link

    
por 04.12.2017 / 18:12
0

uma maneira de fazer isso (não muito confiável, mas pode funcionar):

$ crontab -l | tail -1
*/10 * * * * journalctl --output=json --since -10m >> journalctl.json
$ 

maneira alternativa de fazê-lo; (supondo que você precisa importar a saída do json em elasticsearch ):

por 05.12.2017 / 22:25
0

O syslog-ng pode ler o diário e exportar para arquivos de texto antigos. Você também pode configurar o syslog-ng para enviar dados para outros sistemas (incluindo o elasticsearch).

    
por 05.12.2017 / 22:28
0

você pode criar um script python para pesquisar o journalctl usando a função query_unique . Provavelmente a execução como um serviço poderia ajudar também, com a opção de reinicialização - para não perder nada.

link

    
por 11.12.2017 / 23:29