- Можно ли писать прямиком в syslog?
- 2 ответа 2
- Настройка rsyslog для хранения логов на удаленном сервере
- Подготовка сервера
- Время
- Брандмауэр
- SELinux
- Установка и запуск rsyslog
- Настройка сервера
- Настройка клиента
- Все логи
- Для определенных категорий
- Для определенного уровня
- Аудит определенного лог-файла
- Настройка клиента
- Настройка сервера (фильтрация сообщений)
- Лог определенного приложения
- Чтение логов на сервере
Можно ли писать прямиком в syslog?
Спасибо за ваш ответ. А если такая проблема: я цепляю к своей программе библиотеку, которая внутри считывает переменную окружения(путь до файла) и пишет в него. Мне надо писать в syslog внутри библиотеки используется write(), переписывать библиотеку не вариант.
Обычно /dev/log это симлинк на srw-rw-rw- 1 root root 0 Oct 8 23:26 /run/systemd/journal/dev-log= . Команда file /run/systemd/journal/dev-log= сообщает, что на самом деле это сокет, а fuser вместе с ps покажут, что данный сокет слушает демон /lib/systemd/systemd-journald . Т.о. для записи сообщений вам нужно использовать, например, echo «. » | netcat -Uu /dev/log
2 ответа 2
Мне надо писать в syslog внутри библиотеки используется write()
Это кто Вас надоумил так делать?! 🙂 Два момента. Первый:
$ ls -l /var/log/sys* -rw-r----- 1 syslog adm 20148 окт 8 09:05 /var/log/syslog -rw-r----- 1 syslog adm 380325 окт 8 08:22 /var/log/syslog.1 -rw-r----- 1 syslog adm 46102 окт 7 08:25 /var/log/syslog.2.gz -rw-r----- 1 syslog adm 51345 окт 4 08:26 /var/log/syslog.3.gz -rw-r----- 1 syslog adm 212595 окт 3 08:47 /var/log/syslog.4.gz -rw-r----- 1 syslog adm 71915 окт 1 08:28 /var/log/syslog.5.gz -rw-r----- 1 syslog adm 54724 сен 30 08:23 /var/log/syslog.6.gz -rw-r----- 1 syslog adm 82350 сен 27 08:29 /var/log/syslog.7.gz
Понимаете, что это означает? То, что писать в этот файл может только демон syslog, а читать — только он и члены группы adm. Так что, записать с помощью write() у Вас не получится никак. Без прав root.
Второе. Для того, что бы пользоваться услугами демона syslog существует набор стандартных системных функций:
void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, . ); void closelog(void);
А тех программистов, которые пишут свои собственные «лог-файлы» с использованием write() я считаю не очень уными людьми. Ведь достаточно просто выполнить команду
и можно посмотреть готовое решение проблемы. Особенно не люблю программёров, которые сообщения об ошибках и отладочные сообщения выдают с помощью printf(). Когда в службу поддержки обращается клиент и говорит, что у него ВЧЕРА было что-то непонятное с программой, то эти сообщения в ЕГО stderr исчезнувшие ещё вчера — представляют просто таки «бесценную» помощь для программиста сопровождения.
На самый крайний случай, если заменить write() на syslog() нет никакой возможности, рекомендую попробовать такой метод:
- С помощью inotify (man 7 inotify) устанавливает слежение за файлом, в который исходная программа пишет сообщения.
- Получив уведомление о записи в этот файл, программа считывает добавленный кусок текста. Это можно сделать, зная исходную и новую длину файла.
- Записывает полученный текст в системный лог, используя syslog().
Настройка rsyslog для хранения логов на удаленном сервере
Опубликовано: 19.07.2019
Rsyslog позволяет настроить отправку логов для определенного приложения на централизованный сервер. Это может значительно упростить процесс контроля за событиями на компьютерах в сети. Его настройка на различных системах на базе Linux, практически, не отличается. В данной инструкции мы рассмотрим процесс установки и настройки на примере CentOS и Ubuntu.
Подготовка сервера
На сервере нужно, предварительно, выполнить следующие настройки.
Время
Для правильной фиксации времени логов, необходимо настроить его синхронизацию.
Сначала задаем правильный часовой пояс:
\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
* в данном примере мы использовали московское время.
Затем устанавливаем и запускаем chrony.
а) на системе CentOS / Red Hat:
б) на системе Ubuntu / Debian:
Брандмауэр
Если используется брандмауэр, необходимо открыть порты TCP/UDP 514.
firewall-cmd —permanent —add-port=514/
iptables -A INPUT -p tcp —dport 514 -j ACCEPT
iptables -A INPUT -p udp —dport 514 -j ACCEPT
SELinux
Проверяем, работает ли в нашей системе SELinux:
. необходимо либо настроить SELinux:
semanage port -m -t syslogd_port_t -p tcp 514
semanage port -m -t syslogd_port_t -p udp 514
. либо отключить его командами:
sed -i ‘s/^SELINUX=.*/SELINUX=disabled/g’ /etc/selinux/config
Установка и запуск rsyslog
Установить rsyslog необходимо как на сервер, так и клиентские компьютеры. В зависимости от операционной системы сама установка будет выполняться одной из команд.
а) для систем на базе RPM (Red Hat / CentOS):
б) для систем на базе deb (Debian / Ubuntu):
После установки разрешаем автозапуск службы и стартуем ее:
Настройка сервера
Открываем конфигурационный файл:
Снимаем комментарии со следующих строк:
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
* в данном примере мы разрешили запуск сервера для соединений TCP и UDP на портах 514. На самом деле, можно оставить только один протокол, например, более безопасный и медленный TCP.
После добавляем в конфигурационный файл строки:
$template RemoteLogs,»/var/log/rsyslog/%HOSTNAME%/%PROGRAMNAME%.log»
*.* ?RemoteLogs
& ~
* в данном примере мы создаем шаблон с названием RemoteLogs, который принимает логи всех категорий, любого уровня (про категории и уровни читайте ниже); логи, полученный по данному шаблону будут сохраняться в каталоге по маске /var/log/rsyslog//.log; конструкция & ~ говорит о том, что после получения лога, необходимо остановить дальнейшую его обработку.
Перезапускаем службу логов:
systemctl restart rsyslog
Настройка клиента
Устанавливаем и запускаем rsyslog по инструкции, описанной выше. После приступаем к настройке клиента.
Все логи
Для начала можно настроить отправку всех логов на сервер. Создаем конфигурационный файл для rsyslog:
* где 192.168.0.15 — IP-адрес сервера логов. *.* — перенаправлять любой лог.
systemctl restart rsyslog
Для определенных категорий
Если необходимо отправлять только определенные категории логов, создаем конфигурационный файл для соответствующей, например:
Перезапускаем сервис логов:
systemctl restart rsyslog
Возможные категории для логов (facility):
№ | Категория | Описание |
---|---|---|
0 | kern | Сообщения, отправляемые ядром |
1 | user | Пользовательские программы |
2 | Почта | |
3 | daemon | Сервисы (демоны) |
4 | auth | Безопасность/вход в систему/аутентификация |
5 | syslog | Сообщения от syslog |
6 | lpr | Логи печати |
7 | news | Новостные группы (usenet) |
8 | uucp | Unix-to-Unix CoPy (копирование файлов между компьютерами) |
9 | cron | Планировщик заданий |
10 | authpriv | Безопасность/вход в систему/аутентификация — защищенный режим |
11 | ftp | Логи при передачи данных по FTP |
12 | ntp | Лог службы синхронизации времени (существует не везде) |
13 | security, log audit | Журнал аудита (существует не везде) |
14 | console, log alert | Сообщения, отправляемые в консоль (существует не везде) |
15 | solaris-cron, clock daemon | Cron в solaris (существует не везде) |
16-23 | local0 — local7 | Зарезервированы для локального использования. Уровень серьезности определяется числом от 0 до 7. |
Для определенного уровня
Если мы хотим передавать только сообщения об ошибках, добавляем строку в файл конфигурации rsyslog:
Перезапускаем сервис логов:
systemctl restart rsyslog
Возможные категории для логов (severity):
№ | Уровень | Расшифровка |
---|---|---|
0 | emerg | Система не работает (PANIC) |
1 | alert | Серьезная проблема, требующая внимания |
2 | crit | Критическая ошибка |
3 | err | Ошибка (ERROR) |
4 | warning | Предупреждение (WARN) |
5 | notice | Важное информационное сообщение |
6 | info | Информационное сообщение |
7 | debug | Отладочная информация |
Аудит определенного лог-файла
Мы можем настроить слежение за изменением определенного лога и передавать их на сервер. Для этого нужно настроить и сервер, и клиента.
Настройка клиента
Создаем новый конфигурационный файл:
$ModLoad imfile
$InputFileName /var/log/audit/audit.log
$InputFileTag tag_audit_log:
$InputFileStateFile audit_log
$InputFileSeverity info
$InputFileFacility local6
$InputRunFileMonitor
* в данном примере мы будем отслеживать изменения лог-файла /var/log/audit/audit.log; нас интересуют события от уровня info и выше; все события будет отмечены категорией local6 и переданы на сервер 192.168.0.15.
Перезапускаем сервис на клиенте:
systemctl restart rsyslog
Настройка сервера (фильтрация сообщений)
На сервере нам нужно фильтровать все сообщения категории local6 (такую категорию мы выбрали, когда настроили клиента) и перенаправлять их в нужных нам файл. Открываем на редактирование конфигурационный файл rsyslog:
Создаем новый шаблон для захвата логов:
$template HostAudit, «/var/log/rsyslog/%HOSTNAME%/audit.log»
local6.* ?HostAudit
* в данном примере мы создаем шаблон HostAudit; rsyslog будет принимать логи категории local6 и сохранять в файле /var/log/rsyslog//audit.log.
systemctl restart rsyslog
Лог определенного приложения
Некоторые приложения умеют отправлять лог напрямую на syslog. Например, nginx (начиная с версии 1.7.1). Для этого открываем конфигурационной файл (основной или конфиг виртуального домена):
Добавляем или редактируем соответствующие настройки для логов:
.
access_log syslog:server=192.168.0.15:514 info;
error_log syslog:server=192.168.0.15:514 warn;
error_log /var/log/nginx/error.log warn;
.
* в данном примере мы настроили хранение логов для nginx на сервере 192.168.0.15. Для ошибок также сохраняется локальный лог в файле /var/log/nginx/error.log.
Проверяем корректность конфигурационного файла nginx:
Чтение логов на сервере
В нашем примере сервер настроен на хранение логов по маске /var/log/rsyslog/%HOSTNAME%/%PROGRAMNAME%.log. Это значит, что в каталоге /var/log/rsyslog должны появляться папки с именами компьютеров, которые отправляют на сервер свои логи. Посмотреть список данных папок можно командой:
Чтение логов выполняется обычной командой cat или tail, например:
* здесь мы прочитаем лог для cron на компьютере comp1.