Любая диагностика или наблюдение за состоянием системы начинается с изучения логов. При этом бывают ситуации, когда логи хотелось бы видеть в режиме реального времени, что позволит лучше понять причинно-следственные связи и увидеть реакцию системы на выполняемые действия. То, о чем мы расскажем в данной заметке - известно многим, но, как показывает практика, многие начинающие не знают этих способов, поэтому не будет лишним в очередной раз обратиться к этой теме.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Linux
В Linux подавляющее большинство логов являются обычным текстом, что делает работу с ними возможной при помощи широкого спектра утилит. Одна из них - это tail (англ. хвост), по умолчанию она выводит 10 последних строк указанного текстового файла. А еще она умеет выводить на экран последние строки по мере их добавления. Это как раз то, что нам нужно. Допустим мы хотим видеть в реальном времени лог доступа к сайту:
tail -f /var/log/apache2/access.log
После чего вы сразу увидите на экране 10 последних строк лог-файла и все добавляемые позже в режиме реального времени.
Это удобно, теперь мы можем в одном окне выполнять какие-либо действия, а во втором сразу видеть реакцию на них.
Начинающим администраторам достаточно часто приходится обращаться за помощью к коллегам или на форумы и первое что от них попросят - это логи. Но взять и отправить файл лога целиком - это очень плохая идея, вряд ли кто-то захочет разбираться в чужих логах, да и вы тем самым покажете свое неуважение к тем, кто хотел бы вам помочь. Отправить случайный участок лога, в надежде что кто-то в нем разберется? Тоже нехорошо.
А тем временем сделать правильно очень просто. Достаточно использовать приведенную выше команду и направить ее вывод в файл:
tail -f /var/log/apache2/access.log > ~/my_log.log
На экране теперь строки лога появляться не будут, они будут записаны в файл my_log.log в домашней директории. После чего выполните с системой необходимые действия, результат которых должен попасть в лог, прервите действие команды по Ctrl+C и можете смело описывать проблему коллегам, не забыв приложить полученный файл.
Также вы можете использовать другие утилиты для обработки результатов вывода, допустим вам нужно убрать из лога сообщения, относящиеся к другим узлам сети и оставить только собственные. Так как в нашем логе фиксируется IP источника можно очень просто отфильтровать записи:
tail -f /var/log/apache2/access.log | grep 192.168.16.187 > ~/my_log.log
Здесь мы перенаправили выходной поток от tail на вход команды grep, которая выберет только те строки, в которых присутствует искомый адрес. Подобную конструкцию можно использовать и при интерактивном выводе на экран.
А если мы хотим одновременно видеть лог на экране и при этом записывать его в файл? Все просто, вместо перенаправления вывода передадим результат по конвейеру еще одной команде:
tail -f /var/log/apache2/access.log | grep 192.168.16.187 | tee ~/my_log.log
Здесь мы использовали команду tee (тройник), которая одновременно выводит переданный ей стандартный поток ввода на экран и записывает в указанный файл.
Windows
Системные логи Windows хранятся в Журналах событий, которые имеют специализированный формат и хранятся в файлах .evt и .evtx, которые просмотреть подобным образом не удастся, но логи многих системных служб и приложений используют простой текстовый формат, а следовательно дают возможность работать с ними интерактивно.
В качестве аналога команды tail используем один из командлетов PowerShell:
Get-Content C:\OpenVPN\log\openvpn.log -Wait
Данная команда выведет на экран весь лог и продолжит отображать новые строки. Если лог большой, то это может быть неудобно, поэтому добавим в команду еще один параметр, в котором укажем какое количество последних строк мы хотим видеть, допустим пять:
Get-Content C:\OpenVPN\log\openvpn.log -Wait -Tail 5
Точно также мы можем перенаправить вывод команды в файл:
Get-Content C:\OpenVPN\log\openvpn.log -Wait -Tail 5 > S:\my_log.log
Или выполнить отбор по интересующему нас вхождению используя возможности РowerShell, например отберем только события AUTH_FAILED, включив в отбор также последние сто строк лога:
Get-Content C:\OpenVPN\log\openvpn.log -Wait -Tail 100 | where { $_ -match "AUTH_FAILED"}
Точно также, как и в Linux мы можем одновременно просматривать и записывать логи, для этого используем аналогичную команду Tee-Object:
Get-Content C:\OpenVPN\log\openvpn.log -Wait -Tail 100 | where { $_ -match "AUTH_FAILED"} | Tee-Object -FilePath S:\my_log.log
В данной заметке мы не претендовали на всестороннее освещение затронутой темы, а всего лишь хотели напомнить о существовании удобных инструментов для интерактивной работы с текстовыми логами. Надеемся данный материал окажется вам полезен.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии