Логування повідомлень
Вступ
Система логування OpenWrt є важливим інструментом для діагностики та моніторингу.
Стандартна система логування реалізована через демон logd
, що входить до складу пакету ubox.
Вона використовує циклічний буфер із записами фіксованого розміру, що зберігаються в оперативній памʼяті (RAM).
Читати журнал можна:
- локально за допомогою команди `logread`;
- надсилати в файл;
- передавати на віддалений сервер через TCP/UDP сокет.
# Переглянути журнал logread # Записати повідомлення з міткою в журнал logger -t МІТКА ПОВІДОМЛЕННЯ # Фільтрувати журнал за міткою logread -e МІТКА
Використання: logger [ОПЦІЇ] [ПОВІДОМЛЕННЯ] Записати ПОВІДОМЛЕННЯ (або stdin) до системного журналу. -s Вивести також у stderr -t МІТКА Додати вказану мітку (типово — ім’я користувача) -p РІВЕНЬ Пріоритет (числове значення або пара facility.level)
Приклади використання пріоритету та мітки:
logger "приклад" logger -p notice -t мітка_приклад "помітка-повідомлення" logger -p err -t мітка_приклад "помилка-повідомлення" # Fri May 8 00:23:26 2020 user.notice root: приклад # Fri May 8 00:23:31 2020 user.notice мітка_приклад: помітка-повідомлення # Fri May 8 00:23:40 2020 user.err мітка_приклад: помилка-повідомлення
Утиліта logger
надається BusyBox, але її можна замінити повноцінною версією, встановивши пакет `logger` з пакету `linux-utils`.
Формат повідомлень
Формат повідомлення залежить від мети: локальний журнал (`logread`), файл чи сокет.
Загальний вигляд:
<мітка часу> <ім’я роутера> <підсистема/PID> <префікс>: <текст повідомлення>
* facility та priority відповідають syslog (див. `/usr/include/sys/syslog.h`). * `logread` показує facility.priority після мітки часу. * Передача на сокет виводить числове значення перед міткою часу.
Див. також: типові повідомлення журналу OpenWrt
— ця сторінка застаріла, але все ще корисна як орієнтир.
logd
logd
— це типовий демон логування в OpenWrt з пакету ubox.
* Слухає unix-сокет /dev/log
для запису повідомлень.
* Конфігурується у файлі /etc/config/system
.
* Після зміни конфігурації потрібно перезапустити:
service log restart service system restart
Журнал може записуватись до:
- RAM (циклічний буфер) — типово;
- локального файлу (persistent log);
- віддаленого сервера (TCP/UDP).
Повний список параметрів див. у: Системна конфігурація
Також logd надсилає повідомлення в UBUS — можна прослуховувати через:
ubus subscribe log
logread
Типова утиліта для читання логів. Надається пакетом ubox.
Файл виконання: /sbin/logread
. Виводить записи з кільцевого буфера в хронологічному порядку.
Щоб показати всі повідомлення, що містять певний текст (наприклад, ім’я демона), і слідкувати за ними в реальному часі (як `tail -f`):
logread -fe firewall
Параметри:
-s <шлях> Шлях до ubus-сокета -l <кількість> Вивести останні N повідомлень -e <шаблон> Фільтрувати повідомлення за регулярним виразом -r <сервер> <порт> Потік повідомлень на сервер -F <файл> Журнал у файл -S <байти> Розмір журналу -p <файл> PID-файл -h <хост> Додати імʼя хоста до повідомлення -P <префікс> Префікс до мережевих повідомлень -z <facility> приймати лише вказані facility (0–23), можна повторювати -Z <facility> ігнорувати facility (0–23), можна повторювати -f Слідкувати за журналом у реальному часі -u Використовувати UDP -t Додати додаткову мітку часу -0 Використовувати \0 замість \n (TCP)
logread
також можна використовувати для пересилання логів на сервер syslog.
Використовується всередині скрипта /etc/init.d/log
.
Налаштування передавання виконується у /etc/config/system
.
📌 Увага: якщо встановити syslog-ng, команда `logread` буде замінена на `/usr/sbin/logread`, яка має менше опцій.
Логування у локальний файл
Щоб зберігати журнал у локальний файл на роутері, потрібно вказати наступні параметри:
config system ... option log_file '/var/log/mylog' option log_remote '0'
Скрипт /etc/init.d/log
у цьому випадку додатково запускає команду:
/sbin/logread -f -F /var/log/mylog -p /var/run/log
Це дозволяє передавати повідомлення з кільцевого буфера у файл.
Логування в мережу
Для логування на віддалену машину, необхідно задати в /etc/config/system
:
config system ... option log_ip <IP-адреса одержувача> option log_port <порт> option log_proto <tcp або udp>
👉 Порада: - Для зчитування логів на віддаленій системі вручну (наприклад, через netcat), вибирайте високий порт (наприклад, 5555). - Якщо використовуєте сервер syslog, вкажіть порт, на якому він слухає (типово 514).
Дозвіл на передачу логів у LAN
Типово firewall3 дозволяє увесь трафік у LAN. Але якщо він блокує трафік із самого роутера, додайте наступне правило в /etc/config/firewall
:
config rule option target 'ACCEPT' option dest 'lan' option proto 'tcp udp' option dest_port '5555' option name 'ACCEPT-LOG-DEVICE-LAN'
Перезавантажте фаєрвол:
service firewall restart
Віддалене прослуховування логу
Один із найпростіших способів приймати логи з роутера — через `ncat`:
# TCP ncat -4 -l 5555 # UDP через ncat або Python ncat -u -4 -l 5555 # Python python3 -c "import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('0.0.0.0', 5141)) while True: print(s.recvfrom(4096)[0].decode('utf-8'))"
Повідомлення логів мають формат RFC 3164 / 5424: починаються з числа у кутових дужках (наприклад, `<30>`) та не завершуються символом нового рядка.
❗️ Метод із netcat дає “сирий” вивід без форматування.
Python-читач краще обробляє рядки, але найчистіший варіант — надсилати логи безпосередньо на демон syslog віддаленої системи.
Інструкції: Receiving Messages from a Remote System (rsyslog)
✅ Перевага TCP — надійність: усі події будуть передані. ❗️ Недолік — підвищене навантаження, особливо при великому обсязі логів (наприклад, iptables-логи можуть викликати затримки).
Тестування підтримки логування у реальному часі
Щоб перевірити логування:
logger testLog "Blah1"
Перевірте, чи повідомлення з’явилось у призначеному місці (файл, logread, syslog тощо).
Якщо ні:
- переконайтесь, що
/sbin/logd
запущено з параметром-S <log_size>
, - перевірте конфігурацію в
/etc/config/system
, - перезапустіть:
service log restart
- перегляньте помилки у системному журналі.
Logrotate
Щоб автоматично керувати обʼємними логами — щоденними, щотижневими, щомісячними — використовуйте logrotate.
Приклад: логування на USB-накопичувач кожної ночі, зберігаючи логи за останній тиждень:
# Встановлення opkg update opkg install logrotate # Конфігурація логування uci set system.@system[0].log_file="/mnt/sda1/logs/system.log" uci set system.@system[0].log_remote="0" uci commit system service system restart # Конфігурація logrotate cat << "EOF" > /etc/logrotate.conf include /etc/logrotate.d /mnt/sda1/logs/system.log { daily rotate 1 missingok notifempty postrotate service log restart sleep 1 logger -p warn -s "Log rotation complete" endscript } EOF # Додавання до cron cat << "EOF" >> /etc/crontabs/root 58 23 * * * logrotate /etc/logrotate.conf EOF service cron restart # Налагодження logrotate --verbose --debug /etc/logrotate.conf