Table of Contents

Логування повідомлень

Вступ

Система логування OpenWrt є важливим інструментом для діагностики та моніторингу.

Стандартна система логування реалізована через демон logd, що входить до складу пакету ubox. Вона використовує циклічний буфер із записами фіксованого розміру, що зберігаються в оперативній памʼяті (RAM).

Читати журнал можна:

# Переглянути журнал
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 FIXME — ця сторінка застаріла, але все ще корисна як орієнтир.

logd

logd — це типовий демон логування в OpenWrt з пакету ubox.

* Слухає unix-сокет /dev/log для запису повідомлень. * Конфігурується у файлі /etc/config/system. * Після зміни конфігурації потрібно перезапустити:

service log restart
service system restart

Журнал може записуватись до:

  1. RAM (циклічний буфер) — типово;
  2. локального файлу (persistent log);
  3. віддаленого сервера (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 тощо).

Якщо ні:

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

Альтернативні реалізації

OpenWrt за замовчуванням використовує logd.

Проте доступні інші системи логування: