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

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

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

Типова утиліта для читання логів. Надається пакетом 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.

Приклад: логування на 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.

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

  • syslog-ng — популярний вибір, за замовчуванням використовується в Turris.
  • rsyslog — інша потужна альтернатива з підтримкою великої кількості джерел.
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2025/05/30 13:59
  • by vazaz