# Как разбирать: journalctl, grep, awk и sed Каждый админ хотя бы раз сталкивался с ситуацией, когда сервер внезапно начинает тупить: подвисают процессы, появляются странные задержки, что‑то перестаёт работать. И первая остановка в таком случае — это журналы событий. В Linux системные логи хранятся в **systemd‑journald**, а его главный инструмент для работы — `journalctl`. Но просто читать логи — это скучно. Разберем, **как фильтровать, искать ошибки, анализировать данные и автоматизировать разбор логов** с помощью `grep`, `awk`, `sed` и других утилит. #### Работа с journalctl Самый простой способ заглянуть в системные журналы — просто вызвать `journalctl`: ``` journalctl ``` Но если сервер работает долго, логов там будет много. Выведем их без постраничного режима: ``` journalctl --no-pager ``` Если команда зависает, скорее всего, журнал слишком большой. Ограничим его по времени, например, **выведем логи за последний час**: ``` journalctl --since "1 hour ago" ``` Теперь можно быстро отследить недавние события. #### Как понять, что произошло после перезагрузки? Если сервер неожиданно перезагрузился, полезно посмотреть, что записалось в логи **после старта**: ``` journalctl -b ``` Если система несколько раз перезагружалась, можно посмотреть события после конкретного запуска, например, **минус первый перезапуск**: ``` journalctl -b -1 ``` Это поможет понять, что произошло перед падением системы. #### Фильтрация по сервису Чтобы разобраться в проблемах конкретного сервиса, например, `nginx`, используем флаг `-u`: ``` journalctl -u nginx.service --no-pager ``` Пример вывода: ``` Feb 02 10:15:00 myserver nginx[1234]: Starting nginx: [OK] Feb 02 10:16:00 myserver nginx[1234]: 502 Bad Gateway ``` Можно дополнительно **сортировать логи от новых к старым**: ``` journalctl -u nginx.service --reverse ``` #### grep для поиска ошибок Журналы бывают огромными, но нам нужны только ошибки. Отфильтруем их с помощью `grep`: ``` journalctl -u nginx.service | grep "error" ``` Пример вывода: ``` Feb 02 11:20:00 myserver nginx[5678]: error: failed to bind socket Feb 02 11:22:00 myserver nginx[5678]: error: no permission to access /var/www/html ``` Чтобы **не зависеть от регистра**, используем `-i`: ``` journalctl -u nginx.service | grep -i "error" ``` Теперь `ERROR`, `Error` и `error` будут найдены. Иногда важно видеть не только саму ошибку, но и контекст вокруг. Например, **две строки до и после найденного слова**: ``` journalctl -u nginx.service | grep -A 2 -B 2 "error" ``` Так можно увидеть, что происходило **до и после ошибки**. #### Выбираем нужные данные с awk Журналы содержат много лишней информации. Например, оставим **только дату, время и сообщение**: ``` journalctl -u nginx.service | awk '{print $1, $2, $3, $6}' ``` Вывод: ``` Feb 02 12:00:00 Starting Feb 02 12:05:00 error: Feb 02 12:10:00 Listening ``` Если сообщения длинные, можно **обрезать текст**: ``` journalctl -u nginx.service | awk '{print substr($0, index($0,$6))}' ``` Это оставит только само сообщение без метаданных. #### Очистка логов с sed Некоторые логи содержат ненужные теги или мусорные символы. Например, уберём всё, что находится в квадратных скобках `[INFO]`: ``` journalctl -u nginx.service | sed 's/\[.*\]//g' ``` Исходный лог: ``` Feb 02 13:30:00 myserver nginx[1234]: [INFO] Server started ``` После обработки: ``` Feb 02 13:30:00 myserver nginx[1234]: Server started ``` Также можно **заменить текст**, например, заменить `error` на `!!!ERROR!!!` для выделения: ``` journalctl -u nginx.service | sed 's/error/!!!ERROR!!!/g' ``` #### Автоматический сбор ошибок Допустим, мы нужно **каждый день автоматически собирать ошибки Nginx** и записывать их в файл. Используем **crontab** и скрипт: ``` journalctl -u nginx.service --since "1 day ago" | grep -i "error" | awk '{print $1, $2, $3, $6, $7, $8}' > /var/log/nginx_errors.log ``` Этот код: 1. Берёт логи Nginx за последние 24 часа. 2. Ищет строки с `"error"`. 3. Оставляет только дату, время и сообщение. 4. Записывает результат в `/var/log/nginx_errors.log`. #### Вывод логов в реальном времени А если хочется **смотреть логи в реальном времени**, то спользуйте флаг `-f`: ``` journalctl -u nginx.service -f= ``` Это как `tail -f`, но для journalctl — вы сразу увидите, если сервис упадёт. ===================================== ## Расположение логов по умолчанию Большинство файлов логов Linux находятся в папке **/var/log/** вы можете список файлов логов для вашей системы с помощью команды ls:  `ls -l /var/log/` Ниже мы рассмотрим 20 различных файлов логов Linux, размещенных в каталоге **/var/log/**. Некоторые из этих логов встречаются только в определенных дистрибутивах. - **/var/log/messages** - содержит глобальные системные логи Linux, в том числе те, которые регистрируются при запуске системы. В этот лог записываются несколько типов сообщений: это почта, cron, различные сервисы, ядро, аутентификация и другие. - **/var/log/dmesg** - содержит сообщения, полученные от ядра. Регистрирует много сообщений еще на этапе загрузки, в них отображается информация об аппаратных устройствах, которые инициализируются в процессе загрузки. Можно сказать это еще один лог системы Linux. Количество сообщений в логе ограничено, и когда файл будет переполнен, с каждым новым сообщением старые будут перезаписаны. Вы также можете посмотреть сообщения из этого лога с помощью команды dmseg. - **/var/log/auth.log** - содержит информацию об авторизации пользователей в системе, включая пользовательские логины и механизмы аутентификации, которые были использованы. - **/var/log/boot.log** - Содержит информацию, которая регистрируется при загрузке системы. - **/var/log/daemon.log** - Включает сообщения от различных фоновых демонов - **/var/log/kern.log** - Тоже содержит сообщения от ядра, полезны при устранении ошибок пользовательских модулей, встроенных в ядро. - **/var/log/lastlog** - Отображает информацию о последней сессии всех пользователей. Это нетекстовый файл, для его просмотра необходимо использовать команду lastlog. - **/var/log/maillog /var/log/mail.log** - журналы сервера электронной почты, запущенного в системе. - **/var/log/user.log** - Информация из всех журналов на уровне пользователей. - **/var/log/Xorg.x.log** - Лог сообщений Х сервера. - **/var/log/alternatives.log** - Информация о работе программы update-alternatives. Это символические ссылки на команды или библиотеки по умолчанию. - **/var/log/btmp** - лог файл Linux содержит информацию о неудачных попытках входа. Для просмотра файла удобно использовать команду last -f /var/log/btmp - **/var/log/cups** - Все сообщения, связанные с печатью и принтерами. - **/var/log/anaconda.log** - все сообщения, зарегистрированные при установке сохраняются в этом файле - **/var/log/yum.log** - регистрирует всю информацию об установке пакетов с помощью Yum. - **/var/log/cron** - Всякий раз когда демон Cron запускает выполнения программы, он записывает отчет и сообщения самой программы в этом файле. - **/var/log/secure** - содержит информацию, относящуюся к аутентификации и авторизации. Например, SSHd регистрирует здесь все, в том числе неудачные попытки входа в систему. - **/var/log/wtmp или /var/log/utmp -** системные логи Linux**,** содержат журнал входов пользователей в систему. С помощью команды wtmp вы можете узнать кто и когда вошел в систему. - **/var/log/faillog** - лог системы linux, содержит неудачные попытки входа в систему. Используйте команду faillog, чтобы отобразить содержимое этого файла. - **/var/log/mysqld.log** - файлы логов Linux от сервера баз данных MySQL. - **/var/log/httpd/ или /var/log/apache2** - лог файлы linux11 веб-сервера Apache. Логи доступа находятся в файле access_log, а ошибок в error_log - **/var/log/lighttpd/** - логи linux веб-сервера lighttpd - **/var/log/conman/** - файлы логов клиента ConMan, - **/var/log/mail/** - в этом каталоге содержатся дополнительные логи почтового сервера - **/var/log/prelink/** - Программа Prelink связывает библиотеки и исполняемые файлы, чтобы ускорить процесс их загрузки. /var/log/prelink/prelink.log содержит информацию о .so файлах, которые были изменены программой. - **/var/log/audit/**- Содержит информацию, созданную демоном аудита auditd. - **/var/log/setroubleshoot/ -** SE Linux использует демон setroubleshootd (SE Trouble Shoot Daemon) для уведомления о проблемах с безопасностью. В этом журнале находятся сообщения этой программы. - **/var/log/samba/** - содержит информацию и журналы файлового сервера Samba, который используется для подключения к общим папкам Windows. - **/var/log/sa/** - Содержит .cap файлы, собранные пакетом Sysstat. - **/var/log/sssd/** - Используется системным демоном безопасности, который управляет удаленным доступом к каталогам и механизмами аутентификации. ## Просмотр логов в Linux Смотрим лог **/var/log/dmesg**, с возможностью прокрутки:  `less /var/log/dmesg` Просмотр логов Linux, в реальном времени:  `tail -f /var/log/dmesg` Открываем лог файл dmesg:  `cat /var/log/dmesg` Первые строки dmesg:  `head /var/log/dmesg` Выводим только ошибки из /var/log/messages:  `grep -i error /var/log/dmesg`   =====================================