Linux send log to syslog

Можно ли писать прямиком в 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 исчезнувшие ещё вчера — представляют просто таки «бесценную» помощь для программиста сопровождения.

Читайте также:  Iptv просмотр на linux

На самый крайний случай, если заменить write() на syslog() нет никакой возможности, рекомендую попробовать такой метод:

  1. С помощью inotify (man 7 inotify) устанавливает слежение за файлом, в который исходная программа пишет сообщения.
  2. Получив уведомление о записи в этот файл, программа считывает добавленный кусок текста. Это можно сделать, зная исходную и новую длину файла.
  3. Записывает полученный текст в системный лог, используя 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):

Читайте также:  Удаление лишних ядер astra linux

б) для систем на базе 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 mail Почта
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:

Читайте также:  Команда установки пакета linux

Перезапускаем сервис логов:

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.

Источник

Оцените статью
Adblock
detector