Одна из вещей, которая делает GNU/Linux отличной операционной системой - то, что все происходящее в ней может быть сохранено в логи тем или иным способом. Данные логов неоценимы для получения информации о системе, и они должны быть проанализированы в первую очередь для устранения проблем с самой операционной системой и с её приложениями. Логи могут рассказать Вам почти все для принятия решения, что надо делать с первую очередь.
Логи Ubuntu обычно сохраняются в виде простого текста ASCII, в стандартном для Linux формате, и большинство таких логов находятся по традиции в папке /var/log. Многие записи лога генерируются специальным сервисом syslogd (system log daemon) от имени самой системы и определенных приложений, хотя некоторые приложения генерируют свои собственные логи путем прямой записи в файлы, находящиеся в папке /var/log.
В этом руководстве (перевод документации [1]) объясняется, как читать и использовать эти системные лог-файлы, как использовать и конфигурировать syslogd, и как работает ротация лога. Для дополнительной информации см. ссылки на различные ресурсы в конце статьи. Руководство покажется Вам достаточно простым, если у Вас есть базовые навыки работы с консолью команд Linux и редактирования текстовых файлов в любом текстовом редакторе. В конце этого документа приведено несколько важных команд, которые помогут Вам лучше ориентироваться в использовании командной строки.
[Системные логи]
Системные логи (system logs) имеют дело главным образом с функционированием системы Ubuntu, не обязательно с дополнительными приложениями, которые добавлены пользователями. Примеры таких областей системного лога - механизмы авторизации, системные службы (system daemons), системные сообщения (system messages) и всеобъемлющая системная регистрация - системный журнал (syslog).
Authorization Log. Лог авторизации отслеживает системы авторизации, механизмы авторизации пользователей с запросом ввода пароля, такие как система Pluggable Authentication Module (PAM), команда sudo, установка рабочего сеанса (remote login) через сеть по протоколу SSH (служба sshd) и так далее. Файл лога авторизации находится в файле /var/log/auth.log. Этот полезен для изучения, как логинятся пользователи и как они используют команду sudo.
Daemon Log. "Демон" (daemon) это специальная сервисная программа (в терминологии Windows это служба), которая работает как фоновый процесс, главным образом почти без вмешательства пользователя, выполняя какие-то важные операции, необходимые для правильной работы системы Linux. Лог демона пишется в файл /var/log/daemon.log, и в нем содержится информация о работе системы и демонах приложений, таких как демон Gnome Display Manager (gdm), демон Bluetooth HCI (hcid) или демон базы данных MySQL (mysqld). Исследование daemon.log может помочь в устранении проблем в работе какого-то определенного демона.
Debug Log. Лог отладки находится в файле /var/log/debug, и он предоставляет подробные отладочные сообщения системы Ubuntu и которые используют syslogd на уровне вывода сообщений DEBUG.
Kernel Log. Лог ядра находится в /var/log/kern.log, он предоставляет подробные сообщения ядра системы (Ubuntu Linux kernel). Эти сообщения могут помочь, например в решении проблем, связанных с новым ядром, или ядром, которое пересобрал пользователь. Отобразить в реальном времени конец лога ядра удобно следующей командой:
$ sudo tail -f /var/log/kern.log
Kernel Ring Buffer. Кольцевой буфер ядра (kernel ring buffer) в сущности это не лог-файл, а специальная область в работающем ядре, которую Вы можете опросить для получения сообщений загрузки ядра (kernel bootup messages) с помощью утилиты dmesg. Для просмотра этих сообщений введите команду:
$ dmesg | less
Пример поиска сообщений dmesg, связанных с системой Plug & Play, с использованием grep:
$ dmesg | grep pnp | less
Можно просматривать лог системы в реальном времени с помощью опции -w, например:
$ sudo dmesg -w
Также можно применить утилиту watch, пример просмотра последних 50 строк сообщений dmesg:
$ watch 'dmesg | tail -50'
То же самое с наложением фильтра grep:
$ watch 'dmesg | grep sdb | tail -50'
Лог загрузки системы. По умолчанию скрипт инициализации системы /etc/init.d/bootmisc.sh также отправляет все сообщения загрузки (bootup messages) в файл /var/log/dmesg. Вы можете обычным способом просмотреть этот файл и осуществить поиск по его содержимому, чтобы понять, что происходило в момент загрузки системы.
System Log. Системный лог (System Log) обычно по умолчанию содержит самое большое количество информации по Вашей системе Ubuntu. Этот лог находится в файле /var/log/syslog, и в нем может содержаться информация других логов. Проанализируйте системный лог, если Вы не можете найти желаемую информацию в другом логе. Системный лог также содержит все, что раньше было в /var/log/messages.
[Логи приложений]
Многие приложения также создают логи в папке /var/log. Если Вы откроете содержимое папки /var/log, то увидите говорящие имена, такие как /var/log/apache2, где хранится лог веб-сервера Apache 2, или /var/log/samba, где содержатся записи лога сервера Samba. Эта секция предоставит специфические примеры логов приложения и информации, которая в них содержится.
Логи Apache HTTP Server. Инсталляция по умолчанию сервера Apache2 на Ubuntu создает поддиректорию для лога: /var/log/apache2. В этой поддиректории есть два лог-файла, каждый из которых служит своей собственной цели:
/var/log/apache2/access.log - сюда записывается каждая обслуженная веб-страничка и каждый файл, загруженный веб-сервером. /var/log/apache2/error.log - записи всех случаев ошибок, о которых сообщает сервер HTTP.
По умолчанию каждое событие доступа к файлу или страничке приводит к записи в лог IP-адреса, с которого произошел доступ, времени и даты, строки идентификации браузера, код результата HTTP и текст реального запроса (это обычно запрос GET для просмотра определенной страницы веб-сайта). Для полного описания логов см. документацию Apache. Для просмотра и анализа логов Apache часто используют специальные инструменты.
Также всякий раз, когда происходит любая ошибка, Apache добавляет строку в error log. Если Вы запустили PHP с запрещенными сообщениями ошибок и предупреждений (error, warning messages), то только этот способ может обеспечить идентификацию багов.
CUPS Print System Logs. Система общей печати Unix (Common Unix Printing System, CUPS) использует файл лога по умолчанию /var/log/cups/error_log для сохранения информации сообщений об ошибках. Если нужно разобраться с ошибками печати на Ubuntu, то этот лог - хорошее место для начала анализа.
Rootkit Hunter Log. Утилита Rootkit Hunter (rkhunter, "охотник за руткитами") проверяет систему Ubuntu на наличие бэкдоров, сниферов и руткитов. Утилита rkhunter использует лог, размещенный в /var/log/rkhunter.log.
Логи сервера Samba (SMB Server). Сервер протокола Server Message Block (SMB) Samba популярно используется для обмена файлами по сети между Вашим компьютером Ubuntu и другими компьютерами, поддерживающими протокол SMB (обычно это компьютеры Windows). Samba использует 3 разных типа логов в подкаталоге /var/log/samba:
log.nmbd - сообщения, связанные с функционалом Samba NETBIOS over IP (передача информации по сети). log.smbd - сообщения, связанные с функционалом Samba SMB/CIFS (шаринг по сети файлов и принтеров). log.[IP_ADDRESS] - сообщения, связанные с запросами Samba-клиентов. К имени лога добавляется суффикс, обозначающий IP-адрес клиента (или его NETBIOS-имя), например log.192.168.0.102.
Лог X11 Server. По умолчанию сервером окон X11 (X11 Windowing Server) на Ubuntu служит Xorg X11. Подразумевается, что у Вашего компьютера определен только один дисплей, и его сообщения лога сохраняются в файле /var/log/Xorg.0.log. Этот лог полезен для диагностики проблем с рабочим окружением X11.
[Двоичные логи]
Некоторые файлы, находящиеся в подкаталоге /var/log, были разработаны для чтения через специальные приложения, т. е. их нельзя прочитать как обычный текст (not human-readable). Ниже описаны некоторые примеры таких логов.
Login Failures Log. Информация об ошибочных попытка логина находится в логе /var/log/faillog. Этот лог разработан для парсинга и отображения через команду faillog. Например, чтобы вывести последние неудачные попытки аутентификации, используйте команду:
$ faillog
Last Logins Log. Лог последних заходов в систему (login) находится в файле /var/log/lastlog, и он предназначен для чтения только через команду lastlog. Например, чтобы посмотреть список логинов командой lastlog с возможностью постраничного чтения списка командой less, используйте следующую команду:
$ lastlog | less
Login Records Log. Файл /var/log/wtmp содержит записи текущих активных пользователей в системе (login records). Этот файл предназначен для чтения специальными утилитами, такими как команда who. Команда покажет всех пользователей, которые в настоящий момент работают на компьютере Ubuntu:
$ who
[System Logging Daemon (syslogd)]
Демон системного лога syslogd, также известный как sysklogd, ожидает сообщений для записи в лог от многих источников, и направляет эти сообщения в определенный файл или место назначения в сети. Сообщения, записываемые демоном syslogd, в дополнение к записываемой информации обычно содержат общие элементы наподобие имен хостов систем и меток времени.
Конфигурация syslogd. Конфигурационный файл демона syslogd - файл /etc/syslog.conf. Каждая запись в этом файле состоит из двух полей - селектора (selector) и действия (action). Поле селектора выбирает, какая функция будет записываться в лог (например auth facility, работающая с авторизацией и уровень приоритета сообщения, такой как info или warning). Поле действия содержит цель (target) для лога информации, такую как стандартный лог-файл (например /var/log/syslog), или имя хоста компьютера в сети, куда посылается информация лога.
Передача эхо-сообщения в syslogd с помощью Logger. Есть интересная утилита logger, которая позволяет помещать произвольные сообщения в System Log (т. е. в лог /var/log/syslog). Для примера предположим, что у Вас имя пользователя buddha, и Вы хотите отправить в лог сообщение об особенно вкусной пицце, которую едите. Для этой цели Вы могли бы ввести в терминале следующую команду:
$ logger This Pizza from Vinnys Gourmet Rocks
В результате выполнения этой команды в файл /var/log/syslog добавится строка наподобие следующей:
Jan 12 23:34:45 localhost buddha: This Pizza from Vinnys Gourmet Rocks
Вы даже можете указать тег, обозначающий источник сообщения, и также перенаправить вывод стандартных ошибок.
#
# Пример перенаправления ошибок jive через logger
#
logmsg="/usr/bin/logger -s -t MyScript "
# Объявление для лога, что это за скрипт:
$logmsg"Directory Checker FooScript Jive 1.0"
# Проверка, есть ли домашняя пользователя fred на этой машине:
if[ -d /home/fred ]; then$logmsg"I. Fred's Home Directory Found"
else$logmsg"E. Fred's Home Directory was NOT Found. Boo Hoo."exit 1
fi
Запуск этого скрипта как chkdir.sh на машине, где у пользователя fred нет домашнего каталога /home/fred, приведет к следующим результатам:
bumpy@butters:~$ ./chkdir.sh
MyScript: Directory Checker FooScript Jive 1.0
MyScript: E. Fred's Home Directory was NOT Found. Boo Hoo.
bumpy@butters:~$tail -n 2 /var/log/syslog
Jan 12 23:23:11 localhost MyScript: Directory Checker FooScript Jive 1.0
Jan 12 23:23:11 localhost MyScript: E. Fred's Home Directory was NOT Found. Boo Hoo.
Как Вы можете видеть, мы получаем эти сообщения как сообщения стандартной ошибки (standard error) в приглашении терминала, и они также появятся в нашем syslog.
Ротация лога. При просмотре содержимого директории /var/log или её подкаталогов Вы можете столкнуться с лог-файлами с такими именами, как daemon.log.0, daemon.log.1.gz, и т. д. Это так называемые файлы ротации логов (rotated log). Таким образом, текущий лог автоматически переименовывается после истечения определенного окна времени, и запускается формирование нового файла лога с оригинальным именем. После некоторого времени переименованные файлы сжимаются утилитой gzip, так что получаются файлы архива, например daemon.log.1.gz. Назначение ротации логов - архивировать и сжимать старые логи для экономии места на диске, чтобы они все еще были доступны для инспекции при необходимости.
Функционалом ротации управляет команда logrotate. Обычно logrotate вызывается из системного cron-скрипта /etc/cron.daily/logrotate, и конфигурация определяется файлом /etc/logrotate.conf. Могут быть добавлены отдельные файлы конфигурации в /etc/logrotate.d (например, там сохранены конфигурации ротации логов apache2 и mysql).
В этом руководстве не описываются многочисленные способы конфигурирования logrotate для настройки автоматической ротации любого лог-файла в системе Ubuntu. Если нужны подробности, то изучайте man logrotate, или см. статью [2].
Замечание: вместо утилиты logrotate Вы также можете организовать ротацию системных лог-файлов через скрипт cron.daily, находящийся в папке /etc/cron.daily/sysklogd. В действительности утилита savelog может давать непредсказуемые результаты при ротации логов, на что конфигурирование logrotate скорее всего никак не влияет. В таких случаях следует проверить sysklogd-скрипт cron.daily в каталоге /etc/cron.daily/sysklogd, и прочитать страничку руководства man savelog, чтобы увидеть, не делает ли savelog ротацию способом, отличающимся от того, что Вы задали с logrotate.
[Важные команды]
Если Вы новичок в работе с консолью и командной строкой Linux, то эти команды дадут Вам некую начальную точку, с которой можно начать работать с лог-файлами на базовом уровне.
Смена текущего каталога. Чтобы поменять текущую директорию на директорию, где находятся логи, используйте команду cd. Переход в каталог логов избавит Вас от ввода лишних символов полного пути до файлов в каждой последующей команде:
$ cd /var/log
Редактирование файлов. Если Вы не гуру, который предпочитает текстовый редактор vim, то можете просматривать и редактировать файлы редактором текста GEdit или Kate. Это простые текстовые редакторы, которые поставляются вместе с системами Ubuntu и Kubuntu соответственно. Однако даже они могут оказаться слишком мощным инструментом, когда все что Вам нужно - просто посмотреть содержимое файла и внести простые изменения. Самый простой редактор текста, который можно использовать в консоли, это nano. Он не слишком мощный, но зато не чрезмерно сложный в отличие от vim или emacs. Пример команды для редактирования файла /var/log/example.log с помощью nano:
$ nano example.log
Для выхода из редактора нажмите комбинацию клавиш Ctrl+X. Если в файл были внесены изменения, то редактор nano перед выходом спросит Вас, надо ли сохранять эти изменения. Имейте в виду, что для изменения и сохранения некоторых файлов требуются права администратора, поэтому редактор nano надо запускать через команду sudo:
Какой редактор текста лучше - одна из любимых тем холивара. Кто-то предпочитает vim, кто-то gedit. Мне нравится mcedit, который устанавливается вместе с пакетом Midnight Commander. Команду его установки я уже выучил наизусть:
$ sudo apt-get install mc
Просмотр файлов. Чтобы просто просмотреть содержимое файла, редактор текста не нужен. Конечно, никто не запрещает им пользоваться, но есть риск случайно повредить просматриваемые файлы. Поэтому для просмотра файлов используйте команду less или more. Это позволит Вам пролистать содержимое файла (клавишами со стрелками вверх, вниз, Page Up и Page Down), если строки файла не помещаются на одном экране:
$ less example.log
Чтобы просмотреть содержимое файла, обычно команда sudo не требуется. Когда Вы находитесь в режиме просмотра файла в утилите less, то можете нажать клавишу h для подсказки или q для выхода. Клавиши курсора и клавиши Page Up / Page Down будут работать, как обычно, и клавиша слэша ("/") позволит выполнить поиск, чувствительный к регистру символов (case-sensitive search); клавиша n осуществляет продолжение последней заданной фразы поиска.
Просмотр начала файлов. Чтобы увидеть первые 10 строк файла, используйте команду head:
$ head example.log
Чтобы увидеть другое количество строк от начала файла, используйте опцию -n:
$ head -n 20 example.log
Просмотр хвоста файла. Чтобы увидеть последние 10 строк файла, есть аналогичная команда tail:
$ tail example.log
У этой команды также есть опция -n, которая дает возможность указать другое количество просматриваемых строк:
$ tail -n 20 example.log
Отслеживание изменений файла. У команды tail есть полезная опция -f (от слова "follow", т. е. "следовать за"), которая запускает бесконечный цикл, котором утилита tail будет показывать в реальном времени добавление в файл символов и строк. Это полезно для мониторинга активности лога:
$ tail -f example.log
Для выхода из этого режима утилиты tail нажмите комбинацию клавиш Ctrl+C.
Поиск нужных строк в файле. Поскольку файлы лога могут быть большими и громоздкими, то очень полезно просматривать не весь файл, а только те строки, где встречается интересующее слово или фраза. В этом может помочь утилита grep, позволяющая осуществить фильтрацию содержимого файла по ключевой фразе. Например, чтобы просмотреть все строки файла, где есть слово "system", выполните команду:
$ grep "system" example.log
Чтобы найти все строки, в которых "system" находится в начале строки, используйте команду:
$ grep "^system" example.log
Обратите внимание, что здесь использовался символ регулярного выражения ^, который задает совпадение только с началом строки. Это не слишком полезно для стандартных лог-файлов, в которых строка всегда начинается с даты и времени, но в других случаях может пригодиться. Не все файлы имеют стандартный формат.
Если результат фильтрации grep слишком большой, то все еще можно воспользоваться утилитой less, если воспользоваться стандартной функцией перенаправления вывода в операционной системе Linux:
$ grep "system" example.log | less
[Получение справки по командам]
Дополнительную информацию по логам системы, логам приложений и по демону syslogd можно получить с помощью стандартной команды man. Краткая подсказка по использованию команды выводится с помощью опции --help.
Краткая справка
Подробная справка
Описание
dmesg --help
man dmesg
Документация по утилите кольцевого системного буфера ядра dmesg.
faillog --help
man faillog
Документация по команде faillog (и также можно получить информацию по конфигурационному файлу faillog командой man 5 faillog).
grep --help
man grep
Документация по команде grep, осуществляющей поиск в файле по заданному шаблону.
head --help
man head
Документация по утилите head, которая выводит кусок начала файла.
klogd --help
man klogd
Документация по демону лога ядра (kernel log daemon, klogd).
last --help
man last
Документация по команде last, которая покажет последних залогинившихся пользователей.
less --help
man less
Документация по утилите less, отображающей файл по одной странице.
logger --help
man logger
Документация по интерфейсу командной строки утилиты системного лога logger.
logrotate --help
man logrotate
Документация по утилите logrotate, осуществляющей ротацию логов.
savelog --help
man savelog
Документация по утилите savelog, используемой для сохранения фалов лога.
syslogd --help
man syslogd
Документация по демону лога системы (system log daemon, syslogd).
syslog.conf --help
man syslog.conf
Документация по файлу конфигурации syslogd.
tail --help
man tail
Документация по утилите tail, отображающей строки в конце файла.