Инструменты пользователя

Инструменты сайта


linux:overall:logs

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
linux:overall:logs [2022/07/10 15:56]
admin
linux:overall:logs [2023/05/22 08:04] (текущий)
admin
Строка 17: Строка 17:
   * **-p** - приоритет.   * **-p** - приоритет.
      
-   
-====Горячие клавиши====   
-  * **Пробел (b)** - на одну страницу вниз (вверх). 
-  * **g (G)** - первая (последняя) строка. 
-  * **/ (n, N)** - поиск (следующее, предыдущее вхождение).  
- 
- 
 ==== Управление файлами ==== ==== Управление файлами ====
 Задается максимальное доступное место на диске, по достижении, сообщения удаляются с конца.\\ Задается максимальное доступное место на диске, по достижении, сообщения удаляются с конца.\\
Строка 29: Строка 22:
  
  
-===== syslogd ===== +<details> 
-Раньше была доминирующей подсистемой, сейчас преобладает **systemd и journald** в частности.\\ +<summary> :!: Последняя загрузка системы/перезапуск </summary> 
-Хранит журналы в обычных файлах, в папке **/var/log**, программы отправляют свои логи на псевдоустройство **/dev/log**, там их принимает и обрабатывает данная подсистема. Способ распределения сообщений описан в файле **/etc/rsyslog.d/50-default.conf**\\ +Перезагрузка считается инициированной входом в нее псевдопользователя "reboot"\\ 
-Имеется несколько "тематических" файлов журнала: auth.log, boot.log, dmesg, dpkg.log, kern.log, syslog (сборка из всех журналов), wtmp (отслеживание сеансов пользователей).\\ +<code bash> 
-Уровни приоритетов+  # Врмя последней загрузки 
-  * **debug** - полезно при отладке. +who -b  
-  **info** - информационный. + 
-  * **notice** - нормальное состояние+  # История логинов 
-  * **warn** - предупреждение. +last [имя пользователя] 
-  * **err** - ошибка. + 
-  * **crit** - критический уровень. +  # Так к вопросу о перезагрузке 
-  * **alert** - требуется немедленное вмешательство+last -x | head | tac 
-  * **emerg** - систему нельзя использовать.+или  
 +last reboot 
 + 
 +  # (подвопросом) Список зарегистрированных загрузок системы 
 +journalctl --list-boots 
 +  # более подробная инфа 
 +journalctl -b {num} -n  
 +</code> 
 +</details> 
 + 
 + 
 +===== Rsyslog ===== 
 +[[https://www.rsyslog.com/|Оф сайт]]\\ 
 +[[https://rsyslog.readthedocs.io/en/latest/configuration/modules/index.html|Тут тоже неплохая дока]] 
 +[[https://www.k-max.name/linux/rsyslog-na-debian-nastrojka-servera/|Rsyslog на Debian, настройка сервера сбора логов]]\\ 
 +[[https://selivan.github.io/2017/02/07/rsyslog-log-forward-save-filename-handle-multi-line-failover.html|Конфигурация Rsyslog]]\\ 
 +[[http://devel.aanet.ru/rsyslog-v5/property_replacer.html|Заменитель свойств]]\\ 
 + 
 +Замена старой **syslog**, принимает и обрабатывает лог-записи, есть несколько вариантов входа, в основном псевдоустройство **/dev/log**, так же может брать из файлов, сети и т.д., регулируется подключаемыми модулями\\ 
 + 
 +Конфигурация в файле **/etc/rsyslog.conf**, либо "/etc/rsyslog.d/50-default.conf", так же подтягиваются файлы *.conf из папки **/etc/rsyslog.d**, для пользовательской конфигурации.\\ 
 +При сетевой передаче рекомендуется использовать протокол **Relp**, специальный для этой утилиты, более надежный в сравнении с **tcp**.\\ 
 + 
 +Формат **RainerScript** позволяет задавать С-подобные правила обработки сообщений. **Со старыми директивами** могут быть проблемы, поэтому **не следует использовать его с устаревшими директивами**\\ 
 + 
 +Обработка происходит в блоках **RuleSet**, все что не входит в эти блоки, входит в блок по умолчанию.\\ 
 +Так же, поступающие сообщения **парсятся**, так же есть парсер по умолчанию, извлекает **части сообщения**, типа $msg, $rawmsg, $fromhost, $syslogtag, $programname и т.д.\\ 
 + 
 +Для остановки процесса после обработки команда **stop**\\ 
 +Некоторые модули для использования в действиях () 
 +  * omfile - вывод файла 
 +  * omfwd - сетевая переадресация по udp или tcp 
 +  * omrelp - сетевая переадресация по протоколу RELP 
 +  * onmysql , ompgsql , omoracle — вывод в базу данных 
 + 
 + 
 +<details> 
 +<summary> :!: Примеры </summary> 
 +Запишите все сообщения средств auth и authpriv в файл /var/log/auth.logи продолжите обработку этих сообщений: 
 +<code bash> 
 +# legacy 
 +auth,authpriv.*  /var/log/auth.log 
 +# modern 
 +if ( $syslogfacility-text == "auth" or $syslogfacility-text == "authpriv" ) then { 
 +    action(type="omfile" file="/var/log/auth.log") 
 +
 +</code> 
 + 
 + 
 +Записать все сообщения с именем программыначинающимся с «haproxy» в файл /var/log/haproxy.log, не сбрасывать буфер после каждого сообщения и прекратить дальнейшую обработку: 
 +<code bash> 
 +# legacy (note the minus sign in front of filename - it disables buffer flush) 
 +:programnamestartswith, "haproxy", -/var/log/haproxy.log 
 +& ~ 
 +# modern 
 +if $programname startswith "haproxy" ) then { 
 +    action(type="omfile" file="/var/log/haproxy.log" flushOnTXEnd="off"
 +    stop 
 +
 +# we can mix legacy and modern 
 +if $programname startswith "haproxy" then -/var/log/haproxy.log 
 +&~ 
 +</code> 
 + 
 + 
 +Простой вариант условия 
 +<code bash> 
 +if $syslogtag == 'example' then /var/log/test/out.log 
 + 
 +# Либо легаси подход 
 +:programname, contains, "MyProgram"   /var/log/MyProgram.log 
 +</code> 
 +</details> 
 + 
 + 
 +Для вывода сообщений можно использовать **шаблон**, задается директивой ([[http://devel.aanet.ru/rsyslog-v5/rsyslog_conf_templates.html|Тут есть описание]]) 
 +  * Старый формат - $template DynFile,"/var/log/system-%HOSTNAME%.log" 
 +  * Новый формат - template(name="myMsg" type="string" string="\n%msg%\n") - **Не работает внутри If'a** 
 + 
 + 
 +<details> 
 +<summary> :!: Имена файлов </summary> 
 + 
 +Вариант чтения всех файлов по маске и сохранения оригинального имени на выходе 
 +<code bash> 
 +input(type="imfile" File="/srv/myapp/logs/*.log" Tag="myapp__" Ruleset="myapp_logs" addMetadata="on") 
 + 
 +ruleset(name="myapp_logs") { 
 +    set $.suffix=re_extract($!metadata!filename, "(.*)/([^/]*)", 0, 2, "all.log"); 
 +    # Либо можно функцией field() 
 +    #set $.originfilename=field($!metadata!filename, 47, 7); 
 +    call sendToLogserver 
 +
 +</code> 
 + 
 +Динамические имена файлов на выходе 
 +<code bash> 
 +# Легаси подход 
 +$template DynFile, "/var/log/test/test-%syslogtag%.log" 
 +*.?DynFile;myTemlpate 
 + 
 +# Новый подход 
 +template (name="DynFile" type="string" string="/var/log/test/test-%syslogtag%.log"
 +action(type = "omfile" dynaFile="DynFile"  template="myTemlpate"
 +</code> 
 +</details> 
 + 
 + 
 +<details> 
 +<summary> :!: Еще пример </summary> 
 + 
 +Сервер 
 +<code bash> 
 +$MaxMessageSize 64k 
 +module(load = "imfile"  mode="inotify"
 +module(load = "omrelp"
 + 
 +# Вход из файлов, отмечаем его тегами 
 +input(type="imfile" File="/fold/BIN/Import/*/log/*.log" Tag="SendImport"
 +input(type="imfile" File="/fold/BIN/ErrImport/*/log/*.log" Tag="SendErrImport"
 + 
 +# Из метаданных файла берем имя файла и название папки оно же название импорта 
 +set $.filename=field($!metadata!filename, 47, 7); 
 +set $.importname=field($!metadata!filename, 47, 5); 
 + 
 +# Формат выходного сообщенияК sysтегу добавляем имя импорта и имя папки 
 +template(name="outFormatMessage" type="string" string="<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag%%$.importname%__%$.filen$ 
 + 
 +# Отправляем по сети 
 +if ($syslogtag == 'SendImport') then { 
 +        action(type="omrelp" Target="10.0.0.0" Port="20514" Template="outFormatMessage"
 +        stop 
 +
 + 
 +if ($syslogtag == 'SendErrImport') then { 
 +        action(type="omrelp" Target="10.0.0.0" Port="20515" Template="outFormatMessage"
 +        stop 
 +
 + 
 +</code> 
 + 
 +Клиент 
 +<code bash> 
 +$MaxMessageSize 64k 
 +module(load="imrelp"
 +input(type="imrelp" port="20514" ruleset="MImport"
 +input(type="imrelp" port="20515" ruleset="MErrImport"
 + 
 +# Формат выходного сообщения 
 +template(name="outFormatMessage" type="string" string="%msg%\n"
 + 
 +# Динамическое имя файла 
 +template(name="ImportFileName" type="string" string="/fold/ImportLogs/Import/%$.ffilename%"
 +template(name="ErrImportFileName" type="string" string="/fold/ImportLogs/ErrImport/%$.ffilename%"
 + 
 +ruleset(name="MImport") { 
 +        # Извлекаем из переданных данных имя файла и сервиса 
 +        set $.ffilename = replace($programname, "__", "/"); 
 +        set $.ffilename = replace($.ffilename, "SendImport", ""); 
 + 
 +        # Сохраняем в файл 
 +        action(type ="omfile" dynaFile="ImportFileName" template="outFormatMessage" 
 +                fileOwner="AppServer" fileGroup="AppServer" dirOwner="AppServer" dirGroup="AppServer" 
 +                dirCreateMode="0775" FileCreateMode="0664"
 +
 + 
 +ruleset(name="MErrImport") { 
 +        # Извлекаем из переданных данных имя файла и сервиса 
 +        set $.ffilename = replace($programname, "__", "/"); 
 +        set $.ffilename = replace($.ffilename, "SendErrImport", ""); 
 + 
 +        # Сохраняем в файл 
 +        action(type ="omfile" dynaFile="ErrImportFileName" template="outFormatMessage" 
 +                fileOwner="AppServer" fileGroup="AppServer" dirOwner="AppServer" dirGroup="AppServer" 
 +                dirCreateMode="0775" FileCreateMode="0664"
 +
 +</code> 
 +</details> 
 + 
  
  
 ===== Ротация файлов. Logrotate ===== ===== Ротация файлов. Logrotate =====
 [[https://www.opennet.ru/man.shtml?topic=logrotate&category=8&russian=0|Есть описание параметров]]\\ [[https://www.opennet.ru/man.shtml?topic=logrotate&category=8&russian=0|Есть описание параметров]]\\
 +[[https://mnorin.com/logrotate-nastrojka-rotatsii-logov.html|Гораздо более полный перечень параметров]]\\
 +
 +
 Утилита **Logrotate**, основная конфигурация **/etc/logrotate.conf**, в папке **/etc/logrotate.d/** отдельные конфиги\\ Утилита **Logrotate**, основная конфигурация **/etc/logrotate.conf**, в папке **/etc/logrotate.d/** отдельные конфиги\\
 Сама утилита запускается раз в день, в планировщике есть файл- **/etc/cron.daily/logrotate**\\ Сама утилита запускается раз в день, в планировщике есть файл- **/etc/cron.daily/logrotate**\\
-Поэтому **часовой интервал игнорируется**, для меньшего интервала нужно создать отдельный конфиг (в другом месте для того чтобы не пересекаться с ежедневным), смысл в том чтобы запускать ее через крон самостоятельно, для этого настроим задачу:\\+ 
 +Без порядковых номеров ротация перестает работать\\ 
 + 
 +Основной конфиг запускается раз в день, поэтому **часовой интервал игнорируется**, для часа можно поместить в **/etc/cron.hourly/**, для меньшего интервала нужно создать отдельный конфиг (в другом месте для того чтобы не пересекаться с ежедневным), смысл в том чтобы запускать ее через крон самостоятельно, для этого настроим задачу:\\ 
 <code bash> <code bash>
   # Создали файл конфига   # Создали файл конфига
Строка 54: Строка 233:
  
   # Запускаем вручную (-d для тестирования)   # Запускаем вручную (-d для тестирования)
-logrotate /home/sammy/logrotate.conf+logrotate /home/sammy/logrotate.conf [--verbose --force]
  
   # Добавляем в крон   # Добавляем в крон
 "15 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf" "15 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf"
 </code> </code>
 +
  
 Ротировать можно как регулярно (**по времени**) так и **по размеру** файла\\ Ротировать можно как регулярно (**по времени**) так и **по размеру** файла\\
 Можно выполнять скрипты до и после ротации\\ Можно выполнять скрипты до и после ротации\\
  
-Образец конфига:+Параметры:\\ 
 +  * **hourly/daily/weekly/monthly** - периоды 
 +  * **rotate 3** - хранить 3 последних файла 
 +  * **size** - планка размера для ротирования (size 100, size 100k, и size 100M) 
 +  * **compress** - сжимать 
 +  * **delaycompress** - кроме последнего и предпоследнего 
 +  * **dateext** - к имени архивного файла добавляется дата ротации в формате (%Y%m%d) вместо номера 
 +  * **copytruncate** - ротируется копия, оригинал урезается 
 +  * **create** - ротируется оригинал, рабочий создается новый 
 + 
 + 
 +<details> 
 +<summary> :!: Образец конфига </summary>
 <code bash> <code bash>
 /var/log/messages # файл для работы, можно указать маску /var/log/messages # файл для работы, можно указать маску
 { {
-daily  +  daily  
-rotate 3 # хранить 3 последних файла +  rotate 3 # хранить 3 последних файла 
-size 10M # при условии что файл не меньше 10мб +  compress # сжимать 
-compress # сжимать +  delaycompress # кроме последнего и предпоследнего 
-delaycompress # кроме последнего и предпоследнего+  dateext # к имени архивного файла добавляется дата ротации в формате (%Y%m%d) вместо номера 
 +
 +</code> 
 + 
 + 
 +Если переименовываем файл после ротации. **Его нужно перемещать** создавать копию, без номеров ротация перестает работать\\ 
 +<code bash> 
 +/usr/zxbcps/files/zx.tar 
 +
 + rotate 3 
 + sharedscripts # Для того чтобы скрипт выполнялся один раз 
 + postrotate 
 + mv /usr/zxbcps/files/zx.tar.1 /usr/zxbcps/files/zzx_$(date +%Y-%m-%d_%H:%M).tar 
 + endscript
 } }
 </code> </code>
 +</details>
  
  
-<code bash> </code> 
 <code bash> </code> <code bash> </code>
  
linux/overall/logs.1657468598.txt.gz · Последнее изменение: 2022/07/10 15:56 — admin