Надежный экспорт журналов журналов
Я ищу способ надежного экспорта журналов journalctl.
Я мог бы использовать --since=...
вариант, но это немного нечетко.
В моем случае скрипт будет вызывать journalctl --output=json
каждые десять минут
Я не хочу пропустить ни одной строки и (если возможно) я бы хотел избежать дублирования строк.
Через несколько дней после того, как я задал этот вопрос, я наткнулся на RELP: https://en.wikipedia.org/wiki/Reliable_Event_Logging_Protocol
5 ответов
Вы можете установить демон системного журнала, такой как 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
Вы можете создать скрипт Python для опроса journalctl с помощью query_unique
функция. Возможно, может помочь запуск в качестве службы, с возможностью перезапуска - чтобы ничего не пропустить.
https://www.freedesktop.org/software/systemd/python-systemd/journal.html
syslog-ng может читать из журнала и экспортировать в простые старые текстовые файлы. Вы также можете настроить syslog-ng для отправки данных в другие системы (включая asticsearch).