Краткое описание моей настройки: у меня есть 11 контейнеров Docker в конфигурации с одним сервером Docker Compose. Некоторые из этих контейнеров создают журналы, которые я записываю (в основном на отдельные) тома хоста. В результате получается восемь файлов журнала, которые совместно используются контейнером Rsyslog, опять же через тома Docker. Наконец, этот контейнер пересылает журналы в Papertrail, облачное приложение-агрегатор журналов.
Все это работает: я могу видеть журналы Mongo, журналы Apache и различные журналы уровня приложений почти в реальном времени. Однако я понимаю, что, когда я перезапускаю контейнер регистратора, Rsyslog потеряет все записи о том, какие журналы он отправил, и поэтому снова отправит всю партию. Papertrail, вероятно, самостоятельно выполняет дедупликацию, но, тем не менее, было бы неплохо удалить это дублирование.
Я собираюсь добавить еще один том на хосте, чтобы это состояние было постоянным, даже если контейнер регистратора будет уничтожен и воссоздан. Однако, только что проверив промежуточный экземпляр, каталог состояний /var/spool/rsyslog
кажется пустым. Таким образом, я хочу убедиться, что Rsyslog действительно записывает файлы состояния, прежде чем я выполню эту работу.
Прав ли я, думая, что этот каталог установлен $WorkDirectory
директива?
Вот слегка отредактированный фрагмент моего файла конфигурации:
# Load Modules
module(load="imfile")
# If we don't use this, we'll get the hostname of the Logger container
$LocalHostName missive-test
# See https://help.papertrailapp.com/kb/configuration/advanced-unix-logging-tips#rsyslog-2
$ActionResumeInterval 10
$ActionQueueSize 100000
$ActionQueueDiscardMark 97500
$ActionQueueHighWaterMark 80000
$ActionQueueType LinkedList
$ActionQueueFileName papertrailqueue
$ActionQueueCheckpointInterval 100
$ActionQueueMaxDiskSpace 2g
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
$ActionQueueTimeoutEnqueue 2
$ActionQueueDiscardSeverity 0
# My own addition
$WorkDirectory /var/spool/rsyslog
# See https://help.papertrailapp.com/kb/configuration/encrypting-remote-syslog-with-tls-ssl/#download-root-certificates
$DefaultNetstreamDriverCAFile /etc/papertrail-bundle.pem # trust these CAs
$ActionSendStreamDriver gtls # use gtls netstream driver
$ActionSendStreamDriverMode 1 # require TLS
$ActionSendStreamDriverAuthMode x509/name # authenticate by hostname
$ActionSendStreamDriverPermittedPeer *.papertrailapp.com
# Slightly edited to obfuscate exact URL
*.* @@logs0.papertrailapp.com:00000
# Use http://www.rsyslog.com/rsyslog-configuration-builder/ to generate new
# log file watchers.
input(type="imfile"
File="/var/log/missive/controller/socket-listener.log"
Tag="socket"
Facility="local0")
Последний input
Директива является примером, их восемь, все очень похожи.
Могу ли я ошибаться в расположении государственных данных? Недавно я сделал несколько перезапусков, и каждый раз Papertrail действительно получал 25 тысяч новых записей. Итак, либо это состояние записи, в котором я его не вижу, либо вообще не пишу. Мне не хватает директивы?
Я пробовал это на Rsyslog 8.26.0 и 8.31.0 и получил то же самое с обеими версиями.
Что может помочь, так это просмотр журналов самого Rsyslog. Однако я зарегистрировался /var/log
, и там нет колбасы (кроме томов журналов на хосте, которые я нажимаю). Это нужно включать явно?
После публикации я нашел команду для проверки файла конфигурации, и она выглядит нормально - ничего, что могло бы остановить работу файлов состояния.
/var # rsyslogd -N1
rsyslogd: version 8.26.0, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.
Я сейчас добавил -dn
(отладка и передний план) переключается на Rsyslog, и теперь я создаю (очень подробные) файлы журнала. Среди 300 тысяч других строк я нашел это:
2227.959643591:main thread : action 0 queue: starting queue
2227.959648334:main thread : action 0 queue: is disk-assisted, disk will be used on demand
2227.959656291:main thread : action 0 queue: params: type 1, enq-only 0, disk assisted 1, spoolDir '/var/spool/rsyslog', maxFileSz 1048576, maxQSize 100000, lqsize 0, pqsize 0, child 0, full delay 40000, light delay 70000, deq batch si
ze 16, high wtrmrk 80000, low wtrmrk 70000, discardmrk 97500, max wrkr 1, min msgs f. wrkr 100000
2227.959661911:main thread : action 0 queue:Reg: finalizing construction of worker thread pool (numworkerThreads 1)
2227.959666678:main thread : action 0 queue:Reg/w0: finalizing construction of worker instance data (for 1 actions)
2227.959671472:main thread : action 0 queue:DAwpool: finalizing construction of worker thread pool (numworkerThreads 1)
2227.959675830:main thread : action 0 queue:DAwpool/w0: finalizing construction of worker instance data (for 1 actions)
2227.959682905:main thread : action 0 queue[DA]: starting queue
2227.959687826:main thread : action 0 queue[DA]: .qi file name is '/var/spool/rsyslog/papertrailqueue.qi', len 37
2227.959691356:main thread : action 0 queue[DA]: I am a child
2227.959702371:main thread : action 0 queue[DA]: clean startup, no .qi file found
2227.959706512:main thread : action 0 queue[DA]: state -2040 reading .qi file - can not read persisted info (if any)
2227.959711817:main thread : file stream N/A params: flush interval 0, async write 0
2227.959719817:main thread : file stream N/A params: flush interval 0, async write 0
2227.959724086:main thread : file stream N/A params: flush interval 0, async write 0
2227.959734668:main thread : action 0 queue[DA]: params: type 2, enq-only 0, disk assisted 0, spoolDir '/var/spool/rsyslog', maxFileSz 1048576, maxQSize 0, lqsize 0, pqsize 0, child 1, full delay -1, light delay -1, deq batch size 8, h
igh wtrmrk 0, low wtrmrk 1, discardmrk 0, max wrkr 1, min msgs f. wrkr 0
2227.959739181:main thread : action 0 queue[DA]:Reg: finalizing construction of worker thread pool (numworkerThreads 1)
2227.959743488:main thread : action 0 queue[DA]:Reg/w0: finalizing construction of worker instance data (for 1 actions)
2227.959747045:main thread : action 0 queue[DA]: queue finished initialization
2227.959753324:main thread : action 0 queue: DA queue initialized, disk queue 0x5630e6079ea0
2227.959756804:main thread : action 0 queue: queue finished initialization
2227.959762404:main thread : Action builtin:omfwd[0x5630e605cd60]: queue 0x5630e605d1e0 started
2227.959766212:main thread : Activating Ruleset Queue[0] for Ruleset RSYSLOG_DefaultRuleset
2227.959769728:main thread : activateMainQueue: mainq cnf obj ptr is 0
2227.959773846:main thread : main Q: starting queue
2227.959781585:main thread : main Q: is NOT disk-assisted
2227.959789199:main thread : main Q: params: type 0, enq-only 0, disk assisted 0, spoolDir '/var/spool/rsyslog', maxFileSz 1048576, maxQSize 100000, lqsize 0, pqsize 0, child 0, full delay 97000, light delay 70000, deq batch size 256,
high wtrmrk 80000, low wtrmrk 20000, discardmrk 98000, max wrkr 2, min msgs f. wrkr 40000
2227.959793605:main thread : main Q:Reg: finalizing construction of worker thread pool (numworkerThreads 2)
2227.959797797:main thread : main Q:Reg/w0: finalizing construction of worker instance data (for 1 actions)
2227.959807534:main thread : main Q:Reg/w1: finalizing construction of worker instance data (for 1 actions)
2227.959813976:main thread : main Q: queue finished initialization
2227.959819101:main thread : Main processing queue is initialized and running
2227.959823416:main thread : running module imfile with config 0x5630e605bda0, term mode: cooperative/SIGTTIN
2227.959847971:main thread : configuration 0x5630e6047ae0 activated
2227.959891721:main thread : rsyslog/glbl: using '127.0.0.1' as localhost IP
2227.959897527:main thread : signaling new internal message via SIGTTOU
2227.959907993:main thread : rsyslogd: writing pidfile '/var/run/rsyslogd.pid.tmp'.
2227.960012480:main thread : rsyslogd: initialization completed, transitioning to regular run mode
Это упоминает /var/spool/rsyslog
пару раз, так что похоже, что конфигурация действительно настроена правильно. Однако я до сих пор не нахожу ничего, что могло бы объяснить, почему файлы состояний не остаются после нажатия на Papertrail.
Я продолжу просматривать журналы, чтобы увидеть, не выскакивает ли еще что-нибудь. Комментарии по этому поводу пока приветствуются.
Ага, я нашел эти строчки:
/ # grep -C 1 "NO state file" /var/log/rsyslog.log
2227.960253654:imfile.c : imfile: trying to open state for '/var/log/missive/controller/socket-listener.log', state file 'imfile-state:-var-log-missive-controller-socket-listener.log'
2227.960264463:imfile.c : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-controller-socket-listener.log) exists for '/var/log/missive/controller/socket-listener.log'
2227.960268423:imfile.c : imfile: clean startup withOUT state file for '/var/log/missive/controller/socket-listener.log'
--
2227.971282226:imfile.c : imfile: trying to open state for '/var/log/missive/transmitter/queue.log', state file 'imfile-state:-var-log-missive-transmitter-queue.log'
2227.971298328:imfile.c : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-transmitter-queue.log) exists for '/var/log/missive/transmitter/queue.log'
2227.971302589:imfile.c : imfile: clean startup withOUT state file for '/var/log/missive/transmitter/queue.log'
--
2228.510460963:imfile.c : imfile: trying to open state for '/var/log/missive/transmitter/worker-manager.log', state file 'imfile-state:-var-log-missive-transmitter-worker-manager.log'
2228.510480060:imfile.c : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-transmitter-worker-manager.log) exists for '/var/log/missive/transmitter/worker-manager.log'
2228.510484619:imfile.c : imfile: clean startup withOUT state file for '/var/log/missive/transmitter/worker-manager.log'
--
2228.774990028:imfile.c : imfile: trying to open state for '/var/log/missive/storage/storage-server.log', state file 'imfile-state:-var-log-missive-storage-storage-server.log'
2228.775007074:imfile.c : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-storage-storage-server.log) exists for '/var/log/missive/storage/storage-server.log'
2228.775011149:imfile.c : imfile: clean startup withOUT state file for '/var/log/missive/storage/storage-server.log'
--
2228.797432870:imfile.c : imfile: trying to open state for '/var/log/missive/outtray/outtray-server.log', state file 'imfile-state:-var-log-missive-outtray-outtray-server.log'
2228.797447810:imfile.c : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-outtray-outtray-server.log) exists for '/var/log/missive/outtray/outtray-server.log'
2228.797452333:imfile.c : imfile: clean startup withOUT state file for '/var/log/missive/outtray/outtray-server.log'
--
2228.798755146:imfile.c : imfile: trying to open state for '/var/log/missive/interface/access.log', state file 'imfile-state:-var-log-missive-interface-access.log'
2228.798767248:imfile.c : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-interface-access.log) exists for '/var/log/missive/interface/access.log'
2228.798771170:imfile.c : imfile: clean startup withOUT state file for '/var/log/missive/interface/access.log'
--
2228.802581105:imfile.c : imfile: trying to open state for '/var/log/missive/interface/error.log', state file 'imfile-state:-var-log-missive-interface-error.log'
2228.802592195:imfile.c : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-interface-error.log) exists for '/var/log/missive/interface/error.log'
2228.802595916:imfile.c : imfile: clean startup withOUT state file for '/var/log/missive/interface/error.log'
--
2228.818228008:imfile.c : imfile: trying to open state for '/var/log/missive/mongo/mongodb.log', state file 'imfile-state:-var-log-missive-mongo-mongodb.log'
2228.818241043:imfile.c : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-mongo-mongodb.log) exists for '/var/log/missive/mongo/mongodb.log'
2228.818244939:imfile.c : imfile: clean startup withOUT state file for '/var/log/missive/mongo/mongodb.log'
--
2228.826921335:imfile.c : imfile: trying to open state for '/var/log/missive/traffic/traefik.log', state file 'imfile-state:-var-log-missive-traffic-traefik.log'
2228.826933834:imfile.c : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-traffic-traefik.log) exists for '/var/log/missive/traffic/traefik.log'
2228.826937674:imfile.c : imfile: clean startup withOUT state file for '/var/log/missive/traffic/traefik.log'
Это можно было бы ожидать при первом запуске, но, конечно, можно было бы ожидать, что файлы состояния останутся позади, чтобы журналы не отправлялись снова. Я буду искать эти строки ошибок в случае, если это поможет, и я буду следить за журналами, чтобы увидеть, есть ли что-нибудь ближе к концу, что препятствует записи конечного состояния.
Я пытался добавить это после моего input()
определения, тоже безрезультатно:
$InputFilePersistStateInterval 100
$InputRunFileMonitor
Это потому что в руководстве говорится, второго параметра:
Это активирует текущий монитор. У него нет параметров. Если вы забудете эту директиву, мониторинг файлов выполняться не будет.
Однако я думаю, что это относится к журналу устаревшего стиля, который объявлен $
команды, а не в новом стиле input()
синтаксис.
Мне пришло в голову, что моя конфигурация выше, которая перезаписывает конфигурация Rsyslog по умолчанию, возможно, удаляет что-то критическое. Поэтому я изменил соответствующие COPY
так что по умолчанию rsyslogd.conf
сохраняется, и моя конфигурация становится дополнительной к этому.
Таким образом, новые директивы (которые не закомментированы):
# rsyslog v5: load input modules
# If you do not load inputs, nothing happens!
# You may need to set the module load path if modules are not found.
$ModLoad immark.so # provides --MARK-- message capability
$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command)
$ModLoad imklog.so # kernel logging (formerly provided by rklogd)
# default permissions for all log files.
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
# Include configuration files from directory
$IncludeConfig /etc/rsyslog.d/*
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none -/var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* -/var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit -/var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
Мои журналы по-прежнему отправляются в Papertrail, и по-прежнему файлы спула не созданы.
У меня возникло искушение подумать, что это может быть проблема с разрешением, но Rsyslog работает как root
в Alpine, и я считаю, что очереди реализованы как потоки в основном процессе. Таким образом, они будут работать как root
тоже, и не должно быть проблем с написанием /var/spool/rsyslog/*
.
Я попросил читателей системы отслеживания ошибок Rsyslog может ли это быть ошибкой, возможно, потому, что я использую Docker.
Некоторые очень полезные инженеры, которые следят за списком проблем Rsyslog, придумали достаточно хорошее исправление. Похоже, что по умолчанию файлы состояния записываются для каждого журнала только при выходе из Rsyslog, поэтому они не появляются сразу.
Кроме того, было высказано предположение, что процесс остановки / уничтожения Docker происходит до того, как Rsyslog получит возможность записать файлы состояния. Один участник говорит, что Rsyslog может потребоваться до 90 секунд после SIGTERM
для записи файлов состояния, и я понимаю, что Docker обычно не будет ждать так долго (по умолчанию он ждет 10 секунд перед отправкой SIGKILL
).
Как ни странно, в моем случае Rsyslog ожидает только ~ 2 секунды (значительно меньше 10-секундного ограничения по умолчанию), что говорит мне о том, что он выходит чисто, несмотря на то, что не написал никаких файлов состояния. В настоящее время я не знаю, почему это происходит.
Исправление заключается в следующем. В каждом объявлении журнала директива PersistStateInterval
может быть добавлен, чтобы указать, как часто должен записываться файл состояния (в обрабатываемых строках журнала). По умолчанию это 0
, что дает поведение «запись при выходе».
Например:
input(type="imfile"
File="/var/log/missive/controller/socket-listener.log"
Tag="socket"
PersistStateInterval="10"
Facility="local0")
Я буду использовать стратегию использования низкого значения (например, 20) для медленных файлов журнала и более высокого (например, 100) для быстро движущихся файлов. Я думаю, что мне больше нравится довольно частая запись таким образом, так как это защитит от сбоя питания или сбоя контейнера.
Я считаю, что это исправление не идеально, поскольку при завершении работы контейнера все равно не удастся обновить точное положение отправленных журналов. Однако результатом этого является то, что Rsyslog отправит несколько повторяющихся журналов, которые должны быть дедуплицированы целью агрегатора (интервал X приведет к максимальному дублированию строк журнала X-1, что не страшно).