Назад | Перейти на главную страницу

надежный экспорт журналов journalctl

Я ищу способ надежного экспорта журналов journalctl.

Я мог бы использовать --since=... вариант, но это немного нечетко.

В моем случае сценарий вызовет journalctl --output=json каждые десять минут.

Я не хочу пропустить ни одной строки и (если возможно) я хотел бы избежать дублирования строк.

Через несколько дней после того, как я задал этот вопрос, я наткнулся на RELP: https://en.wikipedia.org/wiki/Reliable_Event_Logging_Protocol

Вы можете установить демон syslog, такой как rsyslog (по умолчанию в системах, производных от Red Hat). Это будет регистрировать все записи журнала в более обратной совместимости, и, конечно, вы можете указать собственный журнал для чего угодно.

Если вам не нужно экспортировать журналы в реальном времени, вы можете использовать journalctl --since как уже упоминали некоторые люди. Вы можете запускать его ежедневно в полночь с указателем времени yesterday чтобы получить ровно 24 часа логов.


Если вам действительно нужно получать журналы через короткие промежутки времени и вы не хотите пропустить ни одной записи, то вам нужно узнать о курсор. Для каждой записи журнала journalctl предоставит курсор, который можно использовать для перехода именно к этой записи журнала с помощью --cursor, или следующую запись журнала с --after-cursor. Рассмотрим следующий пример 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"
}

Для ваших целей __CURSOR непрозрачная капля. Просто зафиксируйте ценность последний запись в журнале, которую вы получаете при одном звонке journalctl и скормить его следующий вызов:

journalctl --output=json --after-cursor="s=6ad7dcf190f3409c8bf8086fec22888c;i=286c44;b=6b134acc25e94d69b4713422b7c773be;m=46f7a97d25;t=55f5e93131a32;x=aecce3d8b96df5dc" ...

один из способов сделать это (не очень надежный, но может работать):

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

альтернативный способ сделать это; (при условии, что вам нужно импортировать вывод json в elasticsearch):

Используйте параметр --since. Чтобы получить журналы за последние 10 минут, просто используйте:

--since -10m

Это даст вам журналы на 10 минут раньше текущего времени. См. Страницу руководства https://www.freedesktop.org/software/systemd/man/journalctl.html и эта страница о спецификациях времени для systemd https://www.freedesktop.org/software/systemd/man/systemd.time.html#

syslog-ng может читать из журнала и экспортировать в простые старые текстовые файлы. Вы также можете настроить syslog-ng для отправки данных в другие системы (включая elasticsearch).

вы можете создать скрипт Python для опроса journalctl с помощью query_unique функция. Возможно, поможет и запуск в качестве службы, с возможностью перезапуска - чтобы ничего не пропустить.

https://www.freedesktop.org/software/systemd/python-systemd/journal.html