Системные администраторы, да и обычные пользователи Linux, часто должны смотреть лог файлы для устранения неполадок. На самом деле, это первое, что должен сделать любой сисадмин при возникновении любой ошибки в системе.
Сама операционная система Linux и работающие приложения генерируют различные типы сообщений, которые регистрируются в различных файлах журналов. В Linux используются специальное программное обеспечение, файлы и директории для хранения лог файлов. Знание в каких файлах находятся логи каких программ поможет вам сэкономить время и быстрее решить проблему. В этой статье мы рассмотрим основные части системы логирования в Linux, файлы логов, а также утилиты, с помощью которых можно посмотреть логи Linux.
Расположение логов по умолчанию
Большинство файлов логов Linux находятся в папке /var/log/ вы можете список файлов логов для вашей системы с помощью команды ls:
ls -l /var/log/
Ниже мы рассмотрим 20 различных файлов логов Linux, размещенных в каталоге /var/log/. Некоторые из этих логов встречаются только в определенных дистрибутивах, например, dpkg.log встречается только в системах, основанных на Debian.
- /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 удобно использовать несколько утилит командной строки Linux. Это может быть любой текстовый редактор, или специальная утилита. Скорее всего, вам понадобятся права суперпользователя для того чтобы посмотреть логи в Linux. Вот команды, которые чаще всего используются для этих целей:
- less;
- more;
- cat;
- head;
- grep;
- tail;
- zcat;
- zgrep;
- zmore;
- vi;
- nano.
Я не буду останавливаться подробно на каждой из этих команд, поскольку большинство из них уже подробно рассмотрены на нашем сайте. Но приведу несколько примеров. Просмотр логов 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
Кроме того, посмотреть логи на linux можно и с помощью графических утилит. Программа Журналы может быть использована для удобного просмотра и отслеживания системных журналов на ноутбуке или персональном компьютере с Linux.
Вы можете установить программу в любой системе с установленным X сервером. Также для просмотра логов может использоваться любой графический тестовый редактор.
Кроме того, у каждого сервиса есть свой лог файл, который можно посмотреть с помощью утилиты journalctl.
Выводы
В каталоге /var/log вы можете найти всю необходимую информацию о работе Linux. Из сегодняшней статьи вы достаточно узнали, чтобы знать где искать, и что искать. Теперь просмотр логов в Linux не вызовет у вас проблем. Если остались вопросы, задавайте в комментариях!
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Об авторе
Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.
|
Needs Expansion |
Contents
- Introduction
- Target Audience
-
System Logs
- Authorization Log
- Daemon Log
- Debug Log
- Kernel Log
- Kernel Ring Buffer
- System Log
-
Application Logs
- Apache HTTP Server Logs
- CUPS Print System Logs
- Rootkit Hunter Log
- Samba SMB Server Logs
- X11 Server Log
-
Non-Human-Readable Logs
- Login Failures Log
- Last Logins Log
- Login Records Log
-
System Logging Daemon (syslogd)
- Configuration of syslogd
- Echoing Messages to syslogd With Logger
- Log Rotation
-
Essential Commands
- Getting Started
- Editing Files
- Viewing Files
- Viewing the Beginning of Files
- Viewing the End of Files
- Watching a Changing File
- Searching Files
-
Resources
- Local System Resources
- WWW Resources
Introduction
One of the things which makes GNU/Linux a great operating system is that virtually anything and everything happening on and to the system may be logged in some manner. This information is invaluable for using the system in an informed manner, and should be one of the first resources you use to trouble-shoot system and application issues. The logs can tell you almost anything you need to know, as long as you have an idea where to look first.
Your Ubuntu system provides vital information using various system log files. These log files are typically plain ASCII text in a standard log file format, and most of them sit in the traditional system log subdirectory /var/log. Many are generated by the system log daemon, syslogd on behalf of the system and certain applications, while some applications generate their own logs by writing directly to files in /var/log.
This guide talks about how to read and use several of these system log files, how to use and configure the system logging daemon, syslogd, and how log rotation works. See the Resources section for additional information.
Target Audience
This guide will be simple enough to use if you have any experience using the console and editing text files using a text editor. See the end of this document for some essential commands that may help you find your way around these files if you’re relatively new to the command line.
System Logs
System logs deal primarily with the functioning of the Ubuntu system, not necessarily with additional applications added by users. Examples include authorization mechanisms, system daemons, system messages, and the all-encompassing system log itself, syslog.
The Authorization Log tracks usage of authorization systems, the mechanisms for authorizing users which prompt for user passwords, such as the Pluggable Authentication Module (PAM) system, the sudo command, remote logins to sshd and so on. The Authorization Log file may be accessed at /var/log/auth.log. This log is useful for learning about user logins and usage of the sudo command.
Use grep to cut down on the volume. For example, to see only information in the Authorization Log pertaining to sshd logins, use this:
grep sshd /var/log/auth.log | less
Daemon Log
A daemon is a program that runs in the background, generally without human intervention, performing some operation important to the proper running of your system. The daemon log at /var/log/daemon.log and contains information about running system and application daemons such as the Gnome Display Manager daemon gdm, the Bluetooth HCI daemon hcid, or the MySQL database daemon mysqld. This can help you trouble-shoot problems with a particular daemon.
Again, use grep to find specific information, plugging in the name of the daemon you’re interested in.
Debug Log
The debug log at /var/log/debug and provides detailed debug messages from the Ubuntu system and applications which log to syslogd at the DEBUG level.
Kernel Log
The kernel log at /var/log/kern.log provides a detailed log of messages from the Ubuntu Linux kernel. These messages may prove useful for trouble-shooting a new or custom-built kernel, for example.
Kernel Ring Buffer
The kernel ring buffer is not really a log file per se, but rather an area in the running kernel you can query for kernel bootup messages via the dmesg utility. To see the messages, use this:
dmesg | less
Or to search for lines that mention the Plug & Play system, for example, use grep like this:
dmesg | grep pnp | less
By default, the system initialization script /etc/init.d/bootmisc.sh sends all bootup messages to the file /var/log/dmesg as well. You can view and search this file the usual way.
System Log
The system log typically contains the greatest deal of information by default about your Ubuntu system. It is located at /var/log/syslog, and may contain information other logs do not. Consult the System Log when you can’t locate the desired log information in another log. It also contains everything that used to be in /var/log/messages.
Application Logs
Many applications also create logs in /var/log. If you list the contents of your /var/log subdirectory, you will see familiar names, such as /var/log/apache2 representing the logs for the Apache 2 web server, or /var/log/samba, which contains the logs for the Samba server. This section of the guide introduces some specific examples of application logs, and information contained within them.
Apache HTTP Server Logs
The default installation for Apache2 on Ubuntu creates a log subdirectory: /var/log/apache2. Within this subdirectory are two log files with two distinct purposes:
-
/var/log/apache2/access.log — records of every page served and every file loaded by the web server.
-
/var/log/apache2/error.log — records of all error conditions reported by the HTTP server
By default, every time Apache accesses a file or page, the access logs record the IP address, time and date, browser identification string, HTTP result code and the text of the actual query, which will generally be a GET for a page view. Look at the Apache documentation for a complete rundown; quite a lot can be gleaned from this file, and indeed many statistical packages exist that perform analyses of these logs.
Also, every time any error occurs, Apache adds a line to the error log. If you run PHP with error and warning messages disabled, this can be your only way to identify bugs.
CUPS Print System Logs
The Common Unix Printing System (CUPS) uses the default log file /var/log/cups/error_log to store informational and error messages. If you need to solve a printing issue in Ubuntu, this log may be a good place to start.
Rootkit Hunter Log
The Rootkit Hunter utility (rkhunter) checks your Ubuntu system for backdoors, sniffers and rootkits, which are all signs of compromise of your system. The log rkhunter uses is located at /var/log/rkhunter.log.
Samba SMB Server Logs
The Server Message Block Protocol (SMB) server, Samba is popularly used for sharing files between your Ubuntu computer and other computers which support the SMB protocol. Samba keeps three distinct types of logs in the subdirectory /var/log/samba:
-
log.nmbd — messages related to Samba’s NETBIOS over IP functionality (the network stuff)
-
log.smbd — messages related to Samba’s SMB/CIFS functionality (the file and print sharing stuff)
-
log.[IP_ADDRESS] — messages related to requests for services from the IP address contained in the log file name, for example, log.192.168.1.1.
X11 Server Log
The default X11 Windowing Server in use with Ubuntu is the Xorg X11 server, and assuming your computer has only one display defined, it stores log messages in the file /var/log/Xorg.0.log. This log is helpful for diagnosing issues with your X11 environment.
Non-Human-Readable Logs
Some log files found in the /var/log subdirectory are designed to be readable by applications, not necessarily by humans. Some examples of such log files which appear in /var/log follow.
Login Failures Log
The login failures log located at /var/log/faillog is actually designed to be parsed and displayed by the faillog command. For example, to print recent login failures, use this:
faillog
Last Logins Log
The last logins log at /var/log/lastlog should not typically be parsed and examined by humans, but rather should be used in conjunction with the lastlog command. For example to see a listing of logins with the lastlog command, displayed one page per screen with the less command, use the following command:
lastlog | less
Login Records Log
The file /var/log/wtmp contains login records, but unlike /var/log/lastlog above, /var/log/wtmp is not used to show a list of recent logins, but is instead used by other utilities such as the who command to present a listed of currently logged in users. This command will show the users currently logged in to your machine:
who
System Logging Daemon (syslogd)
The system logging daemon syslogd, also known as sysklogd, awaits logging messages from numerous sources and routes the messages to the appropriate file or network destination. Messages logged to syslogd usually contain common elements like system hostnames and time-stamps in addition to the specific log information.
Configuration of syslogd
The syslogd daemon’s configuration file is /etc/syslog.conf. Each entry in this file consists of two fields, the selector and the action. The selector field specifies a facility to be logged, such as for example the auth facility which deals with authorization, and a priority level to log such information at, such as info, or warning. The action field consists of a target for the log information, such as a standard log file (i.e. /var/log/syslog), or the hostname of a remote computer to send the log information to.
Echoing Messages to syslogd With Logger
A neat utility exists in the logger tool, which allows one to place messages into the System Log (i.e. /var/log/syslog) arbitrarily. For example, assume your user name is buddha, and you would like to enter a message into the syslog about a particularly delicious pizza you’re eating, you could use a command such as the following at a terminal prompt:
logger This Pizza from Vinnys Gourmet Rocks
and you would end up with a line in the /var/log/syslog file like this:
Jan 12 23:34:45 localhost buddha: This Pizza from Vinnys Gourmet Rocks
You can even specify a tag the messages come from, and redirect the output standard error too.
# # sample logger error jive # logmsg="/usr/bin/logger -s -t MyScript " # announce what this script is, even to the log $logmsg "Directory Checker FooScript Jive 1.0" # test for the existence of Fred's home dir on this machine 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
Executing this script as chkdir.sh on the machine butters where Fred does not have a home directory, /home/fred, gives the following results:
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.
So, as you can see, we received the messages both via standard error, at the terminal prompt, and they also appear in our syslog.
Log Rotation
When viewing directory listings in /var/log or any of its subdirectories, you may encounter log files with names such as daemon.log.0, daemon.log.1.gz, and so on. What are these log files? They are ‘rotated’ log files. That is, they have automatically been renamed after a predefined time-frame, and a new original log started. After even more time the log files are compressed with the gzip utility as in the case of the example daemon.log.1.gz. The purpose of log rotation is to archive and compress old logs so that they consume less disk space, but are still available for inspection as needed. What handles this functionality? Why, the logrotate command of course! Typically, logrotate is called from the system-wide cron script /etc/cron.daily/logrotate, and further defined by the configuration file /etc/logrotate.conf. Individual configuration files can be added into /etc/logrotate.d (where the apache2 and mysql configurations are stored for example).
This guide will not cover the myriad of ways logrotate may be configured to handle the automatic rotation of any log file on your Ubuntu system. For more detail, check the Resources section of this guide.
NOTE: You may also rotate system log files via the cron.daily script /etc/cron.daily/sysklogd instead of using logrotate. Actually, the utility savelog may produce unexpected results on log rotation which configuring logrotate seems to have no effect on. In those cases, you should check the cron.daily sysklogd script in /etc/cron.daily/sysklogd and read the savelog manual page to see if savelog is not in fact doing the rotation in a way that is not what you are specifying with logrotate.
Essential Commands
If you’re new to the console and the Linux command line, these commands will get you up and running to the point where you can work with log files at a basic level.
Getting Started
To change to the log directory, where most of these files sit, use the cd command. This saves having to type out a full path name for every subsequent command:
cd /var/log
Editing Files
You can view and edit files in GEdit or Kate, the simple text editors that come with Ubuntu and Kubuntu respectively, but these can be overkill when all you want to do is look at a file or make simple changes. The easiest editor to use from the console is nano, which is less powerful but also less complicated than vim or emacs. The command to edit a particular logfile /var/log/example.log using nano is:
nano example.log
Press Ctrl+X to exit. It will ask if you want to save your changes when you exit, but unless you run it with the sudo command the files won’t be writable. In general, you won’t want to save your changes to log files, of course.
Viewing Files
To simply look at a file, an editor is overkill. Use the less command, which pages through a file one screen at a time:
less example.log
You don’t need sudo to look at a file. Press h for help, or q to quit. The cursor keys and page up/down keys will work as expected, and the slash key («/») will do a case-sensitive search; the n key repeats the last search.
Viewing the Beginning of Files
To see the first ten lines of a file, use the head command:
head example.log
To see some other number of lines from the beginning of the file, add the -n switch, thus:
head -n 20 example.log
Viewing the End of Files
To see the final ten lines of a file, the analogous command is tail:
tail example.log
Again, the -n switch gives you control over how many lines it displays:
tail -n 20 example.log
Watching a Changing File
Also, the -f («follow») switch puts tail into a loop, constantly waiting for new additions to the file it’s displaying. This is useful for monitoring files that are being updated in real time:
tail -f example.log
Press Ctrl+C to quit the loop.
Searching Files
Because log files can be large and unwieldy, it helps to be able to focus. The grep command helps you strip out only the content you care about. To find all the lines in a file containing the word «system», for example, use this:
grep "system" example.log
To find all the lines containing «system» at the beginning of the line, use this:
grep "^system" example.log
Note the caret symbol, a regular expression that matches only the start of a line. This is less useful for standard log files, which always start with a date and time, but it can be handy otherwise. Not all files have a standard format.
Any time the result of a grep is still too long, you can pipe it through less:
grep "system" example.log | less
Resources
Additional information on system and application logs and syslogd is available via the following resources:
Local System Resources
man dmesg |
System manual page for the dmesg kernel ring buffer utility |
man faillog |
System manual page for the faillog command (and also the faillog configuration file via man 5 faillog) |
man grep |
System manual page for the grep pattern searching utility |
man head |
System manual page for the head utility |
man klogd |
System manual page for the kernel log daemon (klogd) |
man last |
System manual for the last command which shows last logged in users |
man less |
System manual page for the less paging utility |
man logger |
System manual page for the logger command-line interface to syslog utility |
man logrotate |
System manual page for the the logrotate utility |
man savelog |
System manual page for the savelog log file saving utility |
man syslogd |
System manual page for the system log daemon (syslogd) |
man syslog.conf |
System manual page for the syslogd configuration file |
man tail |
System manual page for the tail utility |
WWW Resources
Checking Your System Logs with awk
Syslog — Watching Your Logs
http://www.ibm.com/developerworks/linux/library/l-roadmap5/-Linux Logging
Sawing Linux Logs With Simple Tools
CategorySystem
Если вы столкнулись с проблемами в работе сервера, первое, что нужно сделать — посмотреть логи Linux. В системный журнал записываются диагностические сообщения, поступающие от различных компонентов операционной системы, таких как ядро или службы, поэтому с большой долей вероятности причина сбоев будет найдена.
Каждое сообщение генерируется в результате возникновения какого-либо события в операционной системе. Событием может быть остановка службы, авторизации пользователя в системе или неполадки в работе приложения. События имеют определенный приоритет, в зависимости от степени критичности. В Linux различают следующие типы событий:
- emerg — авария, наивысший приоритет;
- alert — тревога;
- crit — критическое событие;
- err — ошибка;
- warn — внимание;
- notice — уведомление;
- info — информационное сообщение;
- debug — отладочная информация;
На сегодняшний день в Linux основными службами сбора логов являются rsyslog и systemd-journald, они работают независимо друг от друга и входят в состав большинства современных дистрибутивов.
rsyslog
Журналы службы находятся в директории “/var/log/” в виде обычных текстовых файлов. В зависимости от типа события, сообщения записываются в разные файлы. Например файл “/var/log/auth.log” содержит информацию о входе пользователей в систему, а в файл “/var/log/kern.log” записываются сообщения ядра. В разных дистрибутивах названия файлов могут отличаться, поэтому для точного понимания куда именно происходит запись сообщений рассмотрим файл конфигурации “/etc/rsyslog.d/50-default.conf”.
Правила описывают место хранения логов в зависимости от типа сообщения. В левой части строки указан тип сообщения в формате “[Источник].[Приоритет]”, а в правой части имя файла журнала. При записи типа сообщения можно применять символ “*”, обозначающий любое значение или параметр “none”, обозначающий исключение из списка. Рассмотрим более подробно первые два правила.
“auth,authpriv.* /var/log/auth.log”
“*.*;auth,authpriv.none -/var/log/syslog”
Первое правило означает, что все сообщения принятые от механизма авторизации будут записаны в файл “/var/log/auth.log”. В этом файле будут зарегистрированы все попытки входа пользователей в систему, как удачные так и не удачные. Второе правило говорит о том, что все сообщения, кроме тех, которые связаны с авторизацией будут записаны в файл “/var/log/syslog”. Именно к этим файлам приходится обращаться наиболее часто. Следующие правила определяют место хранения журналов ядра “kern.*” и почтовой службы “mail.*”
Журналы логов можно открыть любой утилитой для просмотра текста, например less, cat, tail. Откроем файл “/var/log/auth.log”
less /var/log/auth.log
Каждая строка файла является отдельным сообщением, поступившим от приложения или службы. Все сообщения, независимо от источника имеют единый формат и состоят из пяти частей. Рассмотрим их на примере выделенного сообщения на скриншоте.
- Дата и время регистрации сообщения — “Feb 12 06:18:33”
- Имя компьютера, с которого пришло сообщение — “vds”
- Имя программы или службы, к которой относится сообщение — “sshd”
- Идентификатор процесса, отправившего сообщение — [653]
- Текст сообщения — “Accepted password for mihail from 188.19.42.165 port 2849 ssh2”
Это был пример успешного подключения по ssh.
А так выглядит неудачная попытка:
В этом файле также фиксируется выполнение команд с повышенными правами.
Откроем файл /var/log/syslog
На скриншоте выделено сообщение о выключении сетевого интерфейса.
Для поиска нужной информации в больших текстовых файлах можно использовать утилиту grep. Найдем все сообщения от службы pptpd в файле “/var/log/syslog”
grep 'pptpd' /var/log/syslog
Во время диагностики можно использовать утилиту tail, которая выводит последние строки в файле. Команда “tail -f /var/log/syslog” позволит наблюдать запись логов в реальном времени.
Служба rsyslog является очень гибкой, высокопроизводительной и может использоваться для сбора логов как на локальных системах, так и на уровне предприятия. Полную документацию можно найти на официальном сайте https://www.rsyslog.com/
Запись логов происходит непрерывно и размер файлов постоянно растет. Механизм ротации обеспечивает автоматическое архивирование старых журналов и создание новых. В зависимости от правил, обработка журналов может выполняться ежедневно, еженедельно, ежемесячно или при достижении файлом определенного размера. По мере создания новых архивов, старые могут быть просто удалены или предварительно отправлены по электронной почте. Ротация выполняется утилитой logrotate. Основная конфигурация находится в файле “/etc/logrotate.conf”, также обрабатывается содержимое файлов в директории “/etc/logrotate.d/”
Новые правила можно записывать в основной файл конфигурации, но более правильным будет создание отдельного файла в директории “/etc/logrotate.d/” По умолчанию в директории уже содержится несколько файлов.
Рассмотрим файл “/etc/logrotate.d/rsyslog”, который содержит правила ротации для журналов службы rsyslog.
В начале правила указывается путь к файлу журнала, затем в фигурных скобках перечисляются директивы.
- rotate 7 — необходимо постоянно хранить 7 файлов
- daily — ежедневно будет создаваться новый файл
- compress — старые файлы необходимо архивировать.
На скриншоте видно, что в каталоге “/var/log/” находится основной журнал “syslog” и семь архивов, что соответствует правилам ротации.
Более подробное описание по настройке утилиты logrotate можно найти в мануале, выполнив команду “man logrotate”
journald
Служба сбора логов systemd-journald является частью системы инициализации systemd. Файлы журнал хранятся в директории “/var/log/journal/” в специальном формате и могут быть открыты с помощью утилиты journalctl. Формат записей такой же как у службы rsyslog.
Команда journalctl без параметров выводит на экран все записи, но учитывая, что объем журнала может достигать нескольких гигабайт, такой способ просмотра не подходит для практического применения. Рассмотрим некоторые опции утилиты.
- вывод записей с момента последней загрузки
journalctl -b
- вывод записей за определенный период времени
journalctl -S "2020-02-17 12:00" -U "2020-02-17 12:10"
- вывод записей, принятых от определенной службы
journalctl -u pptpd
- вывод сообщений ядра
journalctl -k
- вывод сообщений с определенным приоритетом, в данном случае будут выведены ошибки и более высокие приоритеты(crit, alert, emerg).
journalctl -p err
- вывод сообщений в реальном времени
journalctl -f
Для более гибкого поиска опции можно совмещать. Выведем все ошибки службы pptpd
journalctl -u pptpd -p err
Если в качестве аргумента указать путь к исполняемому файлу, утилита выведет все сообщения, отправленные этим файлом. Выведем сообщения, отправленные файлом “/usr/bin/sudo” начиная с 04:15 18-го февраля 2020 года. Фактически будут выведены все команды, выполненные с повышенными правами.
journalctl -S "2020-02-18 04:15" /usr/bin/sudo
Для того, чтобы узнать сколько места на диске занимают файлы журнала, выполним команду
journalctl --disk-usage
Для ограничения объема журнала размером 1Gb выполним команду
journalctl --vacuum-size=1G
Открытие бинарных файлов
В заключении рассмотрим несколько специальных файлов в директории “/var/log/”, в которых регистрируются попытки входа пользователей в систему. Это бинарные файлы, которые могут быть открыты только специальными утилитами.
/var/log/wtmp — содержит информацию об успешном входе пользователей в систему, для открытия используется утилита last
/var/log/btmp — в файле регистрируются все неудачные попытки входа в систему, открывается командой lastb с повышенными правами. Параметр -n определяет количество выводимых строк начиная с конца файла.
/var/log/lastlog — содержит время последнего входа для каждой учетной записи, может быть открыт одноименной утилитой lastlog
ЧТЕНИЕ И НАСТРОЙКА ЛОГОВ LINUX В UBUNTU И CENTOS
Администраторам Linux часто нужно заглядывать в лог-файл для устранения неполадок. По сути, это действие первой необходимости для любого админа.
Система Linux и ее приложения могут создавать разные типы сообщений, которые записываются в различные журналы. Linux использует набор конфигурационных файлов, каталогов, программ, команд и демонов для создания, хранения и повторного использования таких сообщений. Поэтому зная, где система хранит свои журналы и как воспользоваться определенными командами, можно сэкономить драгоценное время во время устранения неполадок.
Данное руководство рассматривает различные части механизма журналирования Linux.
Примечание: Команды данного руководства были протестированы на простых установках CentOS 6.4, Ubuntu 12 и Debian 7.
Стандартные логи
По умолчанию журналы в Linux хранятся в /var/log.
Для просмотра списка журналов, находящихся в данном каталоге, используйте команду ls -l /var/log.
В системе CentOS это выглядит так:
[root@TestLinux ~]# ls -l /var/log
total 1472
-rw-------. 1 root root 4524 Nov 15 16:04 anaconda.ifcfg.log
-rw-------. 1 root root 59041 Nov 15 16:04 anaconda.log
-rw-------. 1 root root 42763 Nov 15 16:04 anaconda.program.log
-rw-------. 1 root root 299910 Nov 15 16:04 anaconda.storage.log
-rw-------. 1 root root 40669 Nov 15 16:04 anaconda.syslog
-rw-------. 1 root root 57061 Nov 15 16:04 anaconda.xlog
-rw-------. 1 root root 1829 Nov 15 16:04 anaconda.yum.log
drwxr-x---. 2 root root 4096 Nov 15 16:11 audit
-rw-r--r-- 1 root root 2252 Dec 9 10:27 boot.log
-rw------- 1 root utmp 384 Dec 9 10:31 btmp
-rw-------. 1 root utmp 1920 Nov 28 09:28 btmp-20131202
drwxr-xr-x 2 root root 4096 Nov 29 15:47 ConsoleKit
-rw------- 1 root root 2288 Dec 9 11:01 cron
-rw-------. 1 root root 8809 Dec 2 17:09 cron-20131202
-rw-r--r-- 1 root root 21510 Dec 9 10:27 dmesg
-rw-r--r-- 1 root root 21351 Dec 6 16:37 dmesg.old
-rw-r--r--. 1 root root 165665 Nov 15 16:04 dracut.log
-rw-r--r--. 1 root root 146876 Dec 9 10:44 lastlog
-rw------- 1 root root 950 Dec 9 10:27 maillog
-rw-------. 1 root root 4609 Dec 2 17:00 maillog-20131202
-rw------- 1 root root 123174 Dec 9 10:27 messages
-rw-------. 1 root root 458481 Dec 2 17:00 messages-20131202
-rw------- 1 root root 2644 Dec 9 10:44 secure
-rw-------. 1 root root 15984 Dec 2 17:00 secure-20131202
-rw------- 1 root root 0 Dec 2 17:09 spooler
-rw-------. 1 root root 0 Nov 15 16:02 spooler-20131202
-rw-------. 1 root root 0 Nov 15 16:02 tallylog
-rw-rw-r--. 1 root utmp 89856 Dec 9 10:44 wtmp
-rw------- 1 root root 3778 Dec 6 16:48 yum.log
Просмотр логов
В каталоге /var/log находится несколько общих журналов:
- wtmp
- utmp
- dmesg
- messages
- maillog или mail.log
- spooler
- auth.log или secure
Файлы wtmp и utmp отслеживают пользователей, вошедших и покинувших систему. Содержимое данных журналов нельзя читать с помощью простой команды «cat», для этого есть специальные команды, с которыми теперь нужно ознакомиться.
Чтобы узнать, кто в текущий момент находится на сервере Linux, нужно использовать команду «who». Она извлекает информацию из /var/run/utmp (в CentOS и Debian) или из /run/utmp (в Ubuntu).
Это пример ее работы в CentOS:
[root@TestLinux ~]# who
root tty1 2013-12-09 10:44
root pts/0 2013-12-09 10:29 (10.0.2.2)
sysadmin pts/1 2013-12-09 10:31 (10.0.2.2)
joeblog pts/2 2013-12-09 10:39 (10.0.2.2)
Команда «sysadmin» выводит историю входа пользователей:
[root@TestLinux ~]# last | grep sysadmin
sysadmin pts/1 10.0.2.2 Mon Dec 9 10:31 still logged in
sysadmin pts/0 10.0.2.2 Fri Nov 29 15:42 - crash (00:01)
sysadmin pts/0 10.0.2.2 Thu Nov 28 17:06 - 17:13 (00:06)
sysadmin pts/0 10.0.2.2 Thu Nov 28 16:17 - 17:05 (00:48)
sysadmin pts/0 10.0.2.2 Thu Nov 28 09:29 - crash (06:04)
sysadmin pts/0 10.0.2.2 Wed Nov 27 16:37 - down (00:29)
sysadmin tty1 Wed Nov 27 14:05 - down (00:36)
sysadmin tty1 Wed Nov 27 13:49 - 14:04 (00:15)
В данном примере нужно было получить историю входа пользователя sysadmin. Как можно видеть, было пару случаев, когда он приводил к сбою системы.
Чтобы узнать время последней перезагрузки системы, используйте следующую команду:
[root@TestLinux ~]# last reboot
Результат имеет примерно такой вид:
reboot system boot 2.6.32-358.el6.x Mon Dec 9 10:27 - 10:47 (00:19)
reboot system boot 2.6.32-358.el6.x Fri Dec 6 16:37 - 10:47 (2+18:10)
reboot system boot 2.6.32-358.el6.x Fri Dec 6 16:28 - 16:36 (00:08) reboot system boot 2.6.32-358.el6.x Fri Dec 6 11:06 - 16:36 (05:29)
reboot system boot 2.6.32-358.el6.x Mon Dec 2 17:00 - 16:36 (3+23:36)
reboot system boot 2.6.32-358.el6.x Fri Nov 29 16:01 - 16:36 (7+00:34)
reboot system boot 2.6.32-358.el6.x Fri Nov 29 15:43 - 16:36 (7+00:53)
...
...
wtmp begins Fri Nov 15 16:11:54 2013
Чтобы узнать время последнего входа в систему, используйте lastlog:
[root@TestLinux ~]# lastlog
Результат на CentOS выглядит примерно так:
Username Port From Latest
root tty1 Mon Dec 9 10:44:30 +1100 2013
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in**
shutdown **Never logged in**
halt **Never logged in**
mail **Never logged in**
uucp **Never logged in**
operator **Never logged in**
games **Never logged in**
gopher **Never logged in**
ftp **Never logged in**
nobody **Never logged in**
vcsa **Never logged in**
saslauth **Never logged in**
postfix **Never logged in**
sshd **Never logged in**
sysadmin pts/1 10.0.2.2 Mon Dec 9 10:31:50 +1100 2013
dbus **Never logged in**
joeblog pts/2 10.0.2.2 Mon Dec 9 10:39:24 +1100 2013
Для просмотра содержимого текстовых журналов можно использовать команды «cat», «head» или «tail».
В приведенном ниже примере просматриваются последние 10 строк журнала /var/log/messages на Debian:
debian@debian:~$ sudo tail /var/log/messages
Вывод:
Dec 16 01:21:08 debian kernel: [ 9.584074] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
Dec 16 01:21:08 debian kernel: [ 9.584074] Bluetooth: BNEP filters: protocol multicast
Dec 16 01:21:08 debian kernel: [ 9.648220] Bridge firewalling registered
Dec 16 01:21:08 debian kernel: [ 9.696728] Bluetooth: SCO (Voice Link) ver 0.6
Dec 16 01:21:08 debian kernel: [ 9.696728] Bluetooth: SCO socket layer initialized
Dec 16 01:21:08 debian kernel: [ 9.832215] lp: driver loaded but no devices found
Dec 16 01:21:08 debian kernel: [ 9.868897] ppdev: user-space parallel port driver
Dec 16 01:21:11 debian kernel: [ 12.748833] [drm] Initialized drm 1.1.0 20060810
Dec 16 01:21:11 debian kernel: [ 12.754412] pci 0000:00:02.0: PCI INT A -> Link[LNKB] -> GSI 11 (level, low) -> IRQ 11
Dec 16 01:21:11 debian kernel: [ 12.754412] [drm] Initialized vboxvideo 1.0.0 20090303 for 0000:00:02.0 on minor 0
Демон rsyslog
Центром механизма журналирования является демон rsyslog. Данный сервис отвечает за прослушивание зарегистрированных сообщений различных частей системы Linux и маршрутизацию сообщения к соответствующему журналу в каталоге /var/log. Он также может передавать зарегистрированные сообщения другому серверу Linux.
Конфигурационный файл rsyslog
Демон rsyslog получает конфигурации из файла «rsyslog.conf», который находится в каталоге /etc.
В основном, файл rsyslog.conf говорит демону, где хранить сообщения. Данная информация имеет вид серии строк, состоящих из двух частей.
Этот файл можно найти в rsyslog.d/50-default.conf в Ubuntu.
Под двумя частями строк подразумеваются селектор и действие (selector и action). Они разделяются пробельным символом.
Селектор указывает на источник и важность сообщения, а действие говорит, что нужно сделать с данным сообщением.
Сам селектор также разделен на 2 части символом точки (.). Часть перед символом точки называется объектом (источник сообщения), а часть за символом называется приоритетом (степень важности сообщения).
Комбинация объекта-приоритета и действия говорит rsyslog, что делать, если сообщение соответствует указанным параметрам.
Вот отрывок из файла rsyslog.conf на CentOS:
# rsyslog v5 configuration file
...
...
# Include all config files in /etc/rsyslog.d/
IncludeConfig /etc/rsyslog.d/*.conf
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg *
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
...
...
Чтобы понять, что все это значит, нужно рассмотреть типы объектов, которые распознает Linux:
- auth or authpriv: Сообщения, поступающие от сервисов авторизации и безопасности;
- kern: сообщения ядра Linux;
- mail: сообщения подсистемы почты;
- cron: сообщения демона Cron;
- daemon: сообщения от демонов;
- news: сообщения подсистемы новостей сети;
- lpr: сообщения, связанные с печатью;
- user: сообщения пользовательских программ;
- local0 до local7:Зарезервировано для локального использования.
Ниже приведен список приоритетов по возрастанию:
- Debug: Отладочная информация от программ;
- info: простое информационное сообщение – никакого вмешательства не требуется;
- notice: состояние, которое может потребовать внимания;
- warn: Предупреждение;
- err: ошибка;
- crit: критическое состояние;
- alert: состояние, требующее немедленного вмешательства;
- emerg: аварийное состояние.
Изучите следующую строку из файла:
cron.* /var/log/cron
Она говорит rsyslog сохранять все сообщения, приходящие от демона cron, в файле /var/log/cron. Звездочка (*) поле точки значит, что зарегистрированы будут сообщения всех приоритетов. Аналогичным образом, если объект был определен звездочкой, это объединяет все источники.
Объекты и приоритеты могут быть связаны в несколькими способами.
Вид по умолчанию, когда после точки указан только один приоритет, значит, что будут охвачены все сообщения с таким или высшим уровнем приоритета. Таким образом, данное указание регистрирует все сообщения, приходящие от почтовой подсистемы с приоритетом «warn» и выше в специальном файле в /var/log:
mail.warn /var/log/mail.warn
Такие параметры будут регистрировать все сообщения с таким же или высшим, чем warn, приоритетом и пропускать все остальное. То есть, сообщения с приоритетом err, crit, alert и emerg также будут внесены в файл.
Знак равности (=) после точки указывает регистрировать только сообщения с указанным приоритетом. То есть, если нужно регистрировать только сообщения от почтовой подсистемы с приоритетом info, указание будет таким:
mail.=info /var/log/mail.info
Опять же, если нужно регистрировать все сообщения почтовой подсистемы, кроме сообщений с приоритетом info, строка будет выглядеть так:
mail.!info /var/log/mail.info
или так:
mail.!=info /var/log/mail.info
В первом случае файл mail.info содержал бы все сообщения с приоритетом ниже info. Во втором случае он содержал бы все сообщения с приоритетом выше info.
Несколько объектов в одной строке нужно разделить запятой.
Несколько селекторов в одной строке также разделяются запятой.
Отмеченное звездочкой действие объединяет всех пользователей.
К примеру, об этом говорит запись в файле rsyslog.conf на CentOS:
# Everybody gets emergency messages *.emerg *
По возможности проверьте, что говорит rsyslog.conf на других системах Linux. Вот отрывок из Debian:
# /etc/rsyslog.conf Configuration file for rsyslog.
#
# For more information see
# /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html
...
...
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err
#
# Logging for INN news system.
#
news.crit /var/log/news/news.crit
news.err /var/log/news/news.err
news.notice -/var/log/news/news.notice
Как можно видеть, Debian сохраняет сообщения безопасности/авторизации всех уровней в /var/log/auth.log, в то время как CentOS делает это в /var/log/secure.
Конфигурации для rsyslog могут исходить также от других пользовательских файлов. Эти файлы пользовательских конфигураций, как правило, расположены в разных каталогах в /etc/rsyslog.d. Файл rsyslog.conf включает эти каталоги, используя директиву «$IncludeConfig».
Так это выглядит в Ubuntu:
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
....
....
$IncludeConfig /etc/rsyslog.d/*.conf
Содержимое каталога /etc/rsyslog.d выглядит так:
-rw-r--r-- 1 root root 311 Mar 17 2012 20-ufw.conf
-rw-r--r-- 1 root root 252 Apr 11 2012 21-cloudinit.conf
-rw-r--r-- 1 root root 1655 Mar 30 2012 50-default.conf
Теперь сохранять сообщение в журнал необязательно; сообщение можно переслать консоли пользователя. В таком случае, поле действия будет содержать имя пользователя. Если сообщение нужно отправить нескольким пользователям, их имена нужно разделить запятыми. Если же сообщение нужно распространить между всеми пользователями, в поле действия вносится символ *.
Будучи частью сетевой операционной системы, демон rsyslog может не только хранить зарегистрированные сообщения локально, но и передавать их на другие серверы Linux, а также действовать как репозиторий для других систем. Демон прослушивает сообщения через UDP-порт 514. В приведенном ниже примере он пересылает критические сообщения ядра на сервер под названием «texas»:
kern.crit @texas
Создание и тестирование сообщений
Теперь попробуйте сами создать сообщение.
Для этого нужно будет сделать следующее:
- Задать спецификацию в файле /etc/rsyslog.conf;
- Перезапустить демон rsyslog;
- Проверить конфигурацию с помощью утилиты «logger».
В следующем примере внесены две строки в файл rsyslog.conf на CentOS. Как видите, обе они исходят от объекта local4 и имеют разные приоритеты.
[root@TestLinux ~]# vi /etc/rsyslog.conf
....
....
# New lines added for testing log message generation
local4.crit /var/log/local4crit.log
local4.=info /var/log/local4info.log`
Затем нужно перезапустить сервис, чтобы обновить данные файла:
`[root@TestLinux ~]# /etc/init.d/rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
[root@TestLinux ~]#`
Теперь нужно вызвать приложение logger, чтобы создать сообщение:
`[root@TestLinux ~]# logger -p local4.info " This is a info message from local 4"`
Каталог /var/log показывает два новых сообщения:
`...
...
-rw------- 1 root root 0 Dec 9 11:21 local4crit.log
-rw------- 1 root root 72 Dec 9 11:22 local4info.log
Размер local4info.log не равен нулю, а это значит, что сообщение было записано:
[root@TestLinux ~]# cat /var/log/local4info.log
Dec 9 11:22:32 TestLinux root: This is a info message from local 4
Ротация лог-файлов
Со временем журналы становятся больше, поскольку в них появляется новая информация. Это создает потенциальную проблему производительности. Кроме того, управление файлами становится затруднительным.
Linux использует понятие «ротации» журналов вместо их очистки или удаления. При ротации создается новый каталог, а старый переименуется и при необходимости сжимается. Таким образом, журналы имеют несколько старых версий. Эти файлы будут возвращаться в течение определенного периода времени в виде так называемых backlog-ов. Как только будет получено определенное количество backlog-ов, новая ротация удалит самый старый журнал.
Ротация выполняется при помощи утилиты «logrotate».
Конфигурационный файл logrotate
Как и rsyslog, logrotate зависит от конфигурационного файла по имени logrotate.conf, который находится в /etc.
Вот что находится в данном файле на Debian:
debian@debian:~$ cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured here
По умолчанию журналы ротируются еженедельно, оставляя 4 backlog-а. При запуске программы создается новый пустой журнал, а старые при необходимости будут сжаты.
Файлы wtmp и btmp являются исключениями. wtmp отслеживает вход в систему, а btmp содержит информацию о неудавшихся попытках входа. Эти журнальные файлы ротируются каждый месяц, и ошибки не возвращаются, если можно найти один из предыдущих файлов wtmp или btmp.
Пользовательские конфигурации ротации журналов содержатся в каталоге «etc/logrotate.d». также они включены в logrotate.conf с помощью директивы include. К примеру, Debian показывает такое содержание данного каталога:
debian@debian:~$ ls -l /etc/logrotate.d
total 44
-rw-r--r-- 1 root root 173 Apr 15 2011 apt
-rw-r--r-- 1 root root 79 Aug 12 2011 aptitude
-rw-r--r-- 1 root root 135 Feb 24 2010 consolekit
-rw-r--r-- 1 root root 248 Nov 28 2011 cups
-rw-r--r-- 1 root root 232 Sep 19 2012 dpkg
-rw-r--r-- 1 root root 146 May 12 2011 exim4-base
-rw-r--r-- 1 root root 126 May 12 2011 exim4-paniclog
-rw-r--r-- 1 root root 157 Nov 16 2010 pm-utils
-rw-r--r-- 1 root root 94 Aug 8 2010 ppp
-rw-r--r-- 1 root root 515 Nov 30 2010 rsyslog
-rw-r--r-- 1 root root 114 Nov 26 2008 unattended-upgrades
Содержание rsyslog показывает, как вернуть логи в исходное состояние:
debian@debian:~$ cat /etc/logrotate.d/rsyslog
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
invoke-rc.d rsyslog reload > /dev/null
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
invoke-rc.d rsyslog reload > /dev/null
endscript
}
Как видите, файл «syslog» будет повторно инициализирован каждый день. Другие журнальные файлы ротируются каждую неделю.
Также стоит упомянуть директив postrotate. Она указывает действие, которое происходит после того, как ротация журналов завершена.
Тестирование ротации
Logrotate можно запустить вручную для ротации одного или нескольких файлов. Чтобы это сделать, нужно просто указать соответствующий конфигурационный файл как аргумент.
Чтобы продемонстрировать, как это работает, ниже приведен неполный список журнальных файлов в каталоге /var/log на CentOS:
[root@TestLinux ~]# ls -l /var/log
total 800
...
-rw------- 1 root root 359 Dec 17 18:25 maillog
-rw-------. 1 root root 1830 Dec 16 16:35 maillog-20131216
-rw------- 1 root root 30554 Dec 17 18:25 messages
-rw-------. 1 root root 180429 Dec 16 16:35 messages-20131216
-rw------- 1 root root 591 Dec 17 18:28 secure
-rw-------. 1 root root 4187 Dec 16 16:41 secure-20131216
...
...
Неполное содержимое файла logrotate.conf выглядит так:
[root@TestLinux ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
...
...
Затем запустите команду logrotate:
[root@TestLinux ~]# logrotate -fv /etc/logrotate.conf
Сообщения прокручиваются при создании новых файлов, обнаружении ошибок и т.д. Затем попробуйте проверить новые журнальные файлы почты, безопасности и сообщений:
[root@TestLinux ~]# ls -l /var/log/mail*
-rw------- 1 root root 0 Dec 17 18:34 /var/log/maillog
-rw-------. 1 root root 1830 Dec 16 16:35 /var/log/maillog-20131216
-rw------- 1 root root 359 Dec 17 18:25 /var/log/maillog-20131217
[root@TestLinux ~]# ls -l /var/log/messages*
-rw------- 1 root root 148 Dec 17 18:34 /var/log/messages
-rw-------. 1 root root 180429 Dec 16 16:35 /var/log/messages-20131216
-rw------- 1 root root 30554 Dec 17 18:25 /var/log/messages-20131217
[root@TestLinux ~]# ls -l /var/log/secure*
-rw------- 1 root root 0 Dec 17 18:34 /var/log/secure
-rw-------. 1 root root 4187 Dec 16 16:41 /var/log/secure-20131216
-rw------- 1 root root 591 Dec 17 18:28 /var/log/secure-20131217
[root@TestLinux ~]#
Как можно видеть, все три новых журнала были созданы. Почтовый журнал и журнал безопасности все еще пусты, но новый журнал сообщений уже содержит некоторые данные.
CentOS
логи
Ubuntu
logger
rsyslog
systemd has its own logging system called the journal; running a separate logging daemon is not required. To read the log, use journalctl(1).
In Arch Linux, the directory /var/log/journal/
is a part of the systemd package, and the journal (when Storage=
is set to auto
in /etc/systemd/journald.conf
) will write to /var/log/journal/
. If that directory is deleted, systemd will not recreate it automatically and instead will write its logs to /run/systemd/journal
in a nonpersistent way. However, the directory will be recreated if Storage=persistent
is added to journald.conf
and systemd-journald.service
is restarted (or the system is rebooted).
Systemd journal classifies messages by Priority level and Facility. Logging classification corresponds to classic Syslog protocol (RFC 5424).
Priority level
A syslog severity code (in systemd called priority) is used to mark the importance of a message RFC 5424 6.2.1.
Value | Severity | Keyword | Description | Examples |
---|---|---|---|---|
0 | Emergency | emerg | System is unusable | Severe Kernel BUG, systemd dumped core. This level should not be used by applications. |
1 | Alert | alert | Should be corrected immediately | Vital subsystem goes out of work. Data loss. kernel: BUG: unable to handle kernel paging request at ffffc90403238ffc .
|
2 | Critical | crit | Critical conditions | Crashes, coredumps. Like familiar flash:systemd-coredump[25319]: Process 25310 (plugin-containe) of user 1000 dumped core Failure in the system primary application, like X11. |
3 | Error | err | Error conditions | Non-fatal error reported:kernel: usb 1-3: 3:1: cannot get freq at ep 0x84 ,systemd[1]: Failed unmounting /var. ,libvirtd[1720]: internal error: Failed to initialize a valid firewall backend
|
4 | Warning | warning | May indicate that an error will occur if action is not taken | A non-root file system has only 1GB free.org.freedesktop. Notifications[1860]: (process:5999): Gtk-WARNING **: Locale not supported by C library. Using the fallback 'C' locale
|
5 | Notice | notice | Events that are unusual, but not error conditions | systemd[1]: var.mount: Directory /var to mount over is not empty, mounting anyway ,gcr-prompter[4997]: Gtk: GtkDialog mapped without a transient parent. This is discouraged
|
6 | Informational | info | Normal operational messages that require no action | lvm[585]: 7 logical volume(s) in volume group "archvg" now active
|
7 | Debug | debug | Messages which may need to be enabled first, only useful for debugging | kdeinit5[1900]: powerdevil: Scheduling inhibition from ":1.14" "firefox" with cookie 13 and reason "screen"
|
These rules are recommendations, and the priority level of a given error is at the application developer’s discretion. It is always possible that the error will be at a higher or lower level than expected.
Facility
A syslog facility code is used to specify the type of program that is logging the message RFC 5424 6.2.1.
Facility code | Keyword | Description | Info |
---|---|---|---|
0 | kern | Kernel messages | |
1 | user | User-level messages | |
2 | Mail system | Archaic POSIX still supported and sometimes used (for more mail(1)) | |
3 | daemon | System daemons | All daemons, including systemd and its subsystems |
4 | auth | Security/authorization messages | Also watch for different facility 10 |
5 | syslog | Messages generated internally by syslogd | For syslogd implementations (not used by systemd, see facility 3) |
6 | lpr | Line printer subsystem (archaic subsystem) | |
7 | news | Network news subsystem (archaic subsystem) | |
8 | uucp | UUCP subsystem (archaic subsystem) | |
9 | Clock daemon | systemd-timesyncd | |
10 | authpriv | Security/authorization messages | Also watch for different facility 4 |
11 | ftp | FTP daemon | |
12 | — | NTP subsystem | |
13 | — | Log audit | |
14 | — | Log alert | |
15 | cron | Scheduling daemon | |
16 | local0 | Local use 0 (local0) | |
17 | local1 | Local use 1 (local1) | |
18 | local2 | Local use 2 (local2) | |
19 | local3 | Local use 3 (local3) | |
20 | local4 | Local use 4 (local4) | |
21 | local5 | Local use 5 (local5) | |
22 | local6 | Local use 6 (local6) | |
23 | local7 | Local use 7 (local7) |
Useful facilities to watch: 0, 1, 3, 4, 9, 10, 15.
Filtering output
journalctl allows for the filtering of output by specific fields. If there are many messages to display, or if the filtering of large time spans has to be done, the output of this command can be extensively delayed.
Examples:
- Show all messages matching
PATTERN
:# journalctl --grep=PATTERN
- Show all messages from this boot:
# journalctl -b
However, often one is interested in messages not from the current, but from the previous boot (e.g. if an unrecoverable system crash happened). This is possible through optional offset parameter of the
-b
flag:journalctl -b -0
shows messages from the current boot,journalctl -b -1
from the previous boot,journalctl -b -2
from the second previous and so on – you can see the list of boots with their numbers by usingjournalctl --list-boots
. See journalctl(1) for a full description; the semantics are more powerful than indicated here. - Include explanations of log messages from the message catalog where available:
# journalctl -x
Note that this feature should not be used when attaching logs to bug reports and support threads, as to limit extraneous output. You can list all known catalog entries by running
journalctl --list-catalog
. - Show all messages from date (and optional time):
# journalctl --since="2012-10-30 18:17:16"
- Show all messages since 20 minutes ago:
# journalctl --since "20 min ago"
- Follow new messages:
# journalctl -f
- Show all messages by a specific executable:
# journalctl /usr/lib/systemd/systemd
- Show all messages by a specific process:
# journalctl _PID=1
- Show all messages by a specific unit:
# journalctl -u man-db.service
- Show all messages from user services by a specific unit:
$ journalctl --user -u dbus
- Show kernel ring buffer:
# journalctl -k
- Show only error, critical and alert priority messages:
# journalctl -p err..alert
You can use numeric log level too, like
journalctl -p 3..1
. If single number/log level is used,journalctl -p 3
, then all higher priority log levels are also included (i.e. 0 to 3 in this case). - Show auth.log equivalent by filtering on syslog facility:
# journalctl SYSLOG_FACILITY=10
- If the journal directory (by default located under
/var/log/journal
) contains a large amount of log data thenjournalctl
can take several minutes to filter output. It can be sped up significantly by using--file
option to forcejournalctl
to look only into most recent journal:# journalctl --file /var/log/journal/*/system.journal -f
See journalctl(1), systemd.journal-fields(7), or Lennart Poettering’s blog post for details.
Tip:
- By default, journalctl truncates lines longer than screen width, but in some cases, it may be better to enable wrapping instead of truncating. This can be controlled by the
SYSTEMD_LESS
environment variable, which contains options passed to less (the default pager) and defaults toFRSXMK
(see less(1) and journalctl(1) for details).
- By omitting the
S
option, the output will be wrapped instead of truncated. For example, start journalctl as follows:$ SYSTEMD_LESS=FRXMK journalctl
- To set this behaviour as default, export the variable from
~/.bashrc
or~/.zshrc
.
- While the journal is stored in a binary format, the content of stored messages is not modified. This means it is viewable with strings, for example for recovery in an environment which does not have systemd installed, e.g.:
$ strings /mnt/arch/var/log/journal/af4967d77fba44c6b093d0e9862f6ddd/system.journal | grep -i message
Journal size limit
If the journal is persistent (non-volatile), its size limit is set to a default value of 10% of the size of the underlying file system but capped at 4 GiB. For example, with /var/log/journal/
located on a 20 GiB partition, journal data may take up to 2 GiB. On a 50 GiB partition, it would max at 4 GiB. To confirm current limits on your system review systemd-journald
unit logs:
# journalctl -b -u systemd-journald
The maximum size of the persistent journal can be controlled by uncommenting and changing the following:
/etc/systemd/journald.conf
SystemMaxUse=50M
It is also possible to use the drop-in snippets configuration override mechanism rather than editing the global configuration file. In this case, place the overrides under the [Journal]
header:
/etc/systemd/journald.conf.d/00-journal-size.conf
[Journal] SystemMaxUse=50M
Restart the systemd-journald.service
after changing this setting to apply the new limit.
See journald.conf(5) for more info.
Per unit size limit by a journal namespace
Edit the unit file for the service you wish to configure (for example sshd) and add LogNamespace=ssh
in the [Service]
section.
Then create /etc/systemd/journald@ssh.conf
by copying /etc/systemd/journald.conf
. After that, edit journald@ssh.conf
and adjust SystemMaxUse
to your liking.
Restarting the service should automatically start the new journal service systemd-journald@ssh.service
. The logs from the namespaced service can be viewed with journalctl --namespace ssh
.
See systemd-journald.service(8) § JOURNAL NAMESPACES for details about journal namespaces.
Clean journal files manually
Journal files can be globally removed from /var/log/journal/
using e.g. rm
, or can be trimmed according to various criteria using journalctl
. For example:
- Remove archived journal files until the disk space they use falls below 100M:
# journalctl --vacuum-size=100M
- Make all journal files contain no data older than 2 weeks.
# journalctl --vacuum-time=2weeks
Journal files must have been rotated out and made inactive before they can be trimmed by vacuum commands. Rotation of journal files can be done by running journalctl --rotate
. The --rotate
argument can also be provided alongside one or more vacuum criteria arguments to perform rotation and then trim files in a single command.
See journalctl(1) for more info.
Journald in conjunction with syslog
Compatibility with a classic, non-journald aware syslog implementation can be provided by letting systemd forward all messages via the socket /run/systemd/journal/syslog
. To make the syslog daemon work with the journal, it has to bind to this socket instead of /dev/log
(official announcement).
The default journald.conf
for forwarding to the socket is ForwardToSyslog=no
to avoid system overhead, because rsyslog or syslog-ng pull the messages from the journal by itself.
See Syslog-ng#Overview and Syslog-ng#syslog-ng and systemd journal, or rsyslog respectively, for details on configuration.
Forward journald to /dev/tty12
Create a drop-in directory /etc/systemd/journald.conf.d
and create a fw-tty12.conf
file in it:
/etc/systemd/journald.conf.d/fw-tty12.conf
[Journal] ForwardToConsole=yes TTYPath=/dev/tty12 MaxLevelConsole=info
Then restart systemd-journald.service
.
Specify a different journal to view
There may be a need to check the logs of another system that is dead in the water, like booting from a live system to recover a production system. In such case, one can mount the disk in e.g. /mnt
, and specify the journal path via -D
/--directory
, like so:
# journalctl -D /mnt/var/log/journal -e
Journal access as user
By default, a regular user only has access to their own per-user journal. To grant read access for the system journal as a regular user, you can add that user to the systemd-journal
user group. Members of the adm
and wheel
groups are also given read access.
See journalctl(1) § DESCRIPTION and Users and groups#User groups for more information.
👨🏫️ Что такое логи?
Логи (журнал сервера, англ. server log) – это записываемые
фрагменты данных, описывающие то, что в конкретный момент времени делает сервер, ядро, службы и приложения. Вот пример лога SSH из /var/log/auth.log
:
May 5 08:57:27 ubuntu-bionic sshd[5544]: pam_unix(sshd:session): session opened for user vagrant by (uid=0)
Обратите внимание, что непосредственно
перед сообщением лог содержит несколько полей: метка времени, имя хоста, инициатор
события и идентификатор процесса.
Логи в Linux поступают
из разных источников. Ниже перечислены основные.
Подсистема systemd. Большинство дистрибутивов Linux для управления службами имеют в своём составе systemd. Подсистема инициализации и управления ловит
выходные данные служб и записывает их в журнал. Для работы с логами systemd
используется система журналирования journalctl (шпаргалка по работе с journalctl):
$ journalctl
...
May 05 08:57:27 ubuntu-bionic sshd[5544]: pam_unix(sshd:session): session opened for user vagrant by (uid=0)
...
Сообщения процессов по стандарту syslog. При отсутствии systemd
такие процессы, как SSH, могут записывать данные в UNIX-сокет
в формате syslog. Демон syslog, например, rsyslog, выбирает сообщение, анализирует и по умолчанию
записывает его в /var/log
.
Ядро Linux пишет собственные логи в особый буфер. Подсистемы systemd или syslog могут считывать
журналы из этого буфера, а затем записывать их в свои журналы или файлы – обычно /var/log/kern.log
. Чтобы посмотреть логи ядра, воспользуйтесь dmesg:
$ dmesg -T
...
[Tue May 5 08:41:31 2020] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
...
Audit logs. Особый случай сообщений ядра, предназначенных для аудита событий, таких как
доступ к файлам. Обычно для прослушивания таких журналов
безопасности, существует специальная служба, например, auditd, записывающая свои сообщения в /var/log/audit/audit.log
.
Журнал приложений.
Несистемные приложения имеют тенденцию записывать данные в /var/log
:
- Apache (httpd) обычно пишет в
/var/log/httpd
или/var/log/apache2
. Журналы HTTP-доступа находятся в файле/var/log/httpd/access.log
. - Логи MySQL обычно находятся в
/var/log/mysql.log
или/var/log/mysqld.log
. - Старые версии Linux могут записывать свои логи загрузки с помощью bootlogd в
/var/log/boot
или/var/log/boot.log
. В современных ОС об этом заботится systemd: вы можете просматривать связанные с загрузкой журналы с помощьюjournalctl -b
. Дистрибутивы без systemd снабжены syslog-демоном, считывающим данные из буфера ядра. Таким образом, вы можете найти свои boot/reboot-журналы в/var/log/messages
или/var/log/syslog
.
🔍 Если коротко: где искать логи?
Как правило, вы найдете
журналы пингвиньего сервера в каталоге /var/log
и подкаталогах. Это место, где
syslog
-демонам даны полные права на запись. Также это то место, которое у большинства
приложений (например, Apache) указано по умолчанию, как место хранения логов.
Для systemd
расположение по умолчанию – /var/log/journal
, но просматривать файлы
логов напрямую не получится – они хранятся в двоичном формате. Как же быть?
📰 Как анализировать журналы
Если ваш дистрибутив
Linux использует Systemd (как и большинство современных дистрибутивов), то все
ваши системные журналы находятся в специальной области journal. Просмотреть их можно
с помощью journalctl (наиболее важные команды
journalctl).
Если ваш дистрибутив использует syslog, для их просмотра используются стандартные инструменты: cat, less
или grep:
# grep "error" /var/log/syslog | tail
Mar 31 09:48:02 ubuntu-bionic rsyslogd: unexpected GnuTLS error -53 - this could be caused by a broken connection. GnuTLS reports: Error in the push function. [v8.2002.0 try https://www.rsyslog.com/e/2078 ]
...
Если для управления журналами вы используете auditd, всё найдётся в файле /var/log/audit.log
. В поиске и анализе поможет ausearch.
Заметим, что хорошим тоном
является хранение всех логов централизованно, в одном месте. Особенно если у
вас несколько серверов. Обсудим эту задачу подробнее.
Системные журналы могут
находиться в двух местах: в systemd
или в обычных текстовых файлах, записанных
демоном syslog
. В некоторых дистрибутивах, например, Ubuntu, есть и то, и
другое: journald настроен на пересылку в syslog
. Это осуществляется путем
установки ForwardToSyslog=Yes
в конфиге journald.conf
.
Централизация журналов с помощью Journald
Если в ваш дистрибутив включён systemd, для централизации журналов мы рекомендуем использовать
journal-upload.
Централизация журналов с помощью syslog
Существует несколько случаев,
в которых подойдет централизация с применением syslog
:
- Если в ваш дистрибутив не включён journald. Это означает, что системные журналы направляются непосредственно в syslog-демон.
- Когда необходимо собирать и анализировать журналы приложений. Например, в случае с журналами для Apache через rsyslog и Elasticsearch.
- Если вы хотите перенаправить записи –
ForwardToSyslog=Yes
. Для этого в качестве транспорта следует использовать syslog-протокол. Однако подход приведет к потере некоторых структурированных данных journald т. к. он пересылает только поляsyslog-specific
. - Когда вы настроили syslog-демон для чтения из журналов (как это делает journalctl). Такой подход не приводит к потере структурированных данных, но более чувствителен к ошибкам (например, в случае повреждения журнала) и увеличивает накладные расходы.
Во всех перечисленных ситуациях информация будут проходить через демон syslog
, а оттуда их можно
отправить в любое место и использовать на своё усмотрение.
Большинство
дистрибутивов Linux поставляются с rsyslog
. Чтобы пересылать
данные на другой сервер через TCP, добавьте следующую строку в
/etc/rsyslog.conf
:
*.* @@logsene-syslog-receiver.example.com
Эта строка будет заворачивать
данные на сервер example.com. Вы можете заменить logsene-syslog-receiver.[…..]
именем своего syslog-хоста.
Некоторые демоны могут
выводить данные в Elasticsearch через HTTP/HTTPS. Одним из них является наш rsyslog.
Например, если вы юзаете rsyslog на Ubuntu, сначала установите модуль
Elasticsearch:
sudo apt-get install rsyslog-elasticsearch
Затем в
конфигурационном файле вам потребуется поправить два элемента: шаблон JSON для Elasticsearch:
template(name="LogseneFormat" type="list" option.json="on") {
constant(value="{")
constant(value=""@timestamp":"")
property(name="timereported" dateFormat="rfc3339")
constant(value="","message":"")
property(name="msg")
constant(value="","host":"")
property(name="hostname")
constant(value="","severity":"")
property(name="syslogseverity-text")
constant(value="","facility":"")
property(name="syslogfacility-text")
constant(value="","syslog-tag":"")
property(name="syslogtag")
constant(value="","source":"")
property(name="programname")
constant(value=""}")
}
и action, который пересылает данные в Elasticsearch, используя указанный выше шаблон:
module(load="omelasticsearch")
action(type="omelasticsearch"
template="LogseneFormat" # шаблон,объявленный ранее
searchIndex="LOGSENE_APP_TOKEN_GOES_HERE"
server="logsene-receiver.example.com"
serverport="443"
usehttps="on"
bulkmode="on"
queue.dequeuebatchsize="100" # сколько сообщений отправлять за раз
action.resumeretrycount="-1") # буфер сообщений
В приведенном примере показано, как отправлять сообщения в API Elasticsearch на example.com. Настройте action на ваш локальный Elasticsearch:
searchIndex
– будет вашим алиасом;server
– имя хоста (ноды) Elasticsearch;serverport
может быть 9200 или кастомным, главное, чтобы на нем слушал Elasticsearch;usehttps= "off"
– отправление данных по http.
Независимо от того,
используете ли вы syslog-протокол или что-то еще, лучше перенаправлять данные непосредственно из демона, чем искать проблемы в отдельных файлах из /var/log
.
Это не значит, что
файлы в /var/log
бесполезны. Они пригодятся в следующих случаях:
- приложения пишут туда свои логи, например, HTTP, FTP, MySQL и т. д.,
- требуется обработать системные журналы, например, с помощью grep.
❗Важные файлы журналов для мониторинга
Здесь мы рассмотрим
ключевые файлы логов, какую информацию они хранят, как настраивается rsyslog
для записи и как посмотреть информацию с помощью journalctl
.
Журнал /var/log/syslog или /var/log/messages
Это «всеохватывающий» системный лог:
# logger "this is a test"
# tail -1 /var/log/syslog
May 7 15:33:11 ubuntu-bionic test-user: this is a test
Вы найдёте здесь все
сообщения: ошибки, информационные сообщения и все другие серьёзности. Исключением является stop action.
Если в /var/log/syslog
или /var/log/messages
пусто, скорее всего, journald не перенаправляет данные в
syslog. Все те же данные можно просмотреть, вызвав journalctl
без параметров.
# journalctl --no-pager | grep "this is a test"
May 07 15:33:11 ubuntu-bionic test-user[7526]: this is a test
Журналы /var/log/kern.log или /var/log/dmesg
Сюда по умолчанию
отправляются сообщения ядра:
Apr 17 16:47:28 ubuntu-bionic kernel: [ 0.004000] console [tty1] enabled
И снова, если у вас нет
syslog (или файл пустой/отсутствует) – используйте journalctl:
kern.* /var/log/kern.log
Журналы /var/log/auth.log или /var/log/secure
Здесь вы найдете
сообщения об аутентификации, генерируемые такими службами, как sshd
:
May 7 15:03:09 ubuntu-bionic sshd[1202]: pam_unix(sshd:session): session closed for user vagrant
Вот ещё один фильтр по значениям auth
и authpriv
:
auth,authpriv.* /var/log/auth.log
Вы можете использовать
такие фильтры в journalctl, используя числовые
уровни объектов:
# journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10
...
May 7 15:03:09 ubuntu-bionic sshd[1202]: pam_unix(sshd:session): session closed for user vagrant
...
Журнал /var/log/cron.log
Сюда отправляются ваши
cron-сообщения (jobs-ы, выполняемые регулярно):
May 06 08:19:01 localhost.localdomain anacron[1142]: Job `cron.daily' started
Пример фильтра:
cron.* /var/log/cron
С journalctl можно
сделать так:
# journalctl SYSLOG_FACILITY=9
Журнал /var/log/mail.log или /var/log/maillog
Практически все демоны
(такие как Postfix, cron и т. д.) обычно пишут свои логи в syslog. Затем rsyslog
раскладывает эти логи по файлам:
mail.* /var/log/mail.log
С помощью journald просматривать
журналы можно так:
# journalctl SYSLOG_FACILITY=2
📄 Подведём итоги
- Расположение и формат системных журналов Linux зависят от того, как настроен дистрибутив.
- Большинство дистрибутивов имеют systemd, и все логи «живут» там. Чтобы что-то просмотреть и найти, используйте journalctl.
- Некоторые дистрибутивы передают системные журналы в syslog, либо напрямую, либо через journal. В этом случае у вас, скорее всего, есть логи, записанные в отдельные файлы в
/var/log
. - Если вы управляете несколькими серверами, вам потребуется централизовать журналирование с помощью специального ПО или использовать собственный ELK-стек.
Логгирование
событий невероятно важная и серьёзная штука в любой сфере администрирования и
ОС. Рекомендуем отнестись ответственно к данной теме – она будет полезна
при дебагинге, разработке и просто в управлении инфраструктурой.
Функция системного журналирования (т.н. «логи» или логирование) — это основной источник информации о работе системы и ошибках. Журналирование может осуществляться на локальной системе, а так же сообщения журналирования могут пересылаться на удаленную систему, кроме того, в конфигурационном файле /etc/syslog.conf (в некоторых новых дистрибутивах заменен на /etc/rsyslog.conf) возможна тонкая регулировка уровня журналирования. Журналирование осуществляется при помощи демона syslogd (rsyslogd — в некоторых новых дистрибутивах), который обычно получает входную информацию при помощи сокета /dev/log (локально) или с udp-порта 514 (с удаленных машин).
В случае локального журналирования главным файлом — хранителем информации, обычно является /var/log/messages, но в большинстве инсталляций используются и многие другие файлы, которые могут быть тщательно настроены с помощью вышеуказанного конфигурационного файла. Например, может возникнуть необходимость выделить в отдельный лог сообщения, рождаемые демоном электронной почты.
Содержимое
-
1 Управление типом и подробностью журналируемой информации
- 1.1 Конфигурационный файл syslog.conf
- 2 Запуск демона syslogd
- 3 Автоматическая ротация (обновление заполненных файлов) и архивирование журналов
- 4 Изучение и мониторинг журналов
Управление типом и подробностью журналируемой информации
Конфигурационный файл syslog.conf
Файл syslog.conf является главным конфигурационным файлом для демона syslogd. Конфигурационный файл syslog.conf представляет собой набор правил. Каждое правило есть — строка, состоящая из селектора и действия, разделенных пробелом или табуляцией. Селектор представляет собой запись в виде источник.приоритет. (источник иногда именуют — категорией) Селектор может состоять из нескольких записей источник.приоритет, разделенных символом «;» . Можно указывать несколько источников в одном селекторе (через запятую). Поле действие — устанавливает журналируемое действие для селектора.
Получив сообщение для записи в журнал (от klogd, от локальной или удаленной программы), syslogd для каждого правила проверяет не подходит ли сообщение под шаблон, определяемый селектором. Если подходит, то выполняется указанное в правиле действие. Для одного сообщения м.б. выполнено произвольное количество действий (т.е. обработка сообщения не прекращается при первом успехе).
Сообщения с уровнем, равным или выше указанного в селекторе, и источником, равным указанному в селекторе, считается подходящим. Звездочка перед точкой соответствует любому источнику, после точки — любому уровню. Слово none после точки — никакому уровню для данного источника. Можно указывать несколько источников в одном селекторе (через запятую).
Источник (он же категория) может быть следующим:
- 0 — kern — Сообщения ядра
- 1 — user — Сообщения пользовательских программ
- 2 — mail — Сообщения от почтовой системы.
- 3 — daemon — Сообщения от тех системных демонов, которые в отличие от FTP или LPR не имеют выделенных специально для них категорий.
- 4 — auth — Все что связано с авторизацией пользователей, вроде login и su (безопасность/права доступа)
- 5 — syslog — Система протоколирования может протоколировать сообщения от самой себя.
- 6 — lpr — Сообщения от системы печати.
- 7 — news — Сообщения от сервера новостей. (в настоящее время не используется)
- 8 — uucp — Сообщения от UNIX-to-UNIX Copy Protocol. Это часть истории UNIX и вероятнее всего она вам никогда не понадобится (хотя до сих пор определенная часть почтовых сообщений доставляется через UUCP).
- 9 — cron — Сообщения от системного планировщика.
- 10 — authpriv — То же самое, что и auth, однако сообщения этой категории записываются в файл, который могут читать лишь некоторые пользователи (возможно, эта категория выделена потому, что принадлежащие ей сообщения могут содержать открытые пароли пользователей, которые не должны попадать на глаза посторонним людям, и следовательно файлы протоколов должны иметь соответствующие права доступа).
- 11 — ftp — При помощи этой категории вы сможете сконфигурировать ваш FTP сервер, что бы он записывал свои действия.
- 12 — NTP — сообщения сервера времени
- 13 — log audit
- 14 — log alert
- 15 — clock daemon — сообщения демона времени
- с 16 по 23 local0 — local7 Зарезервированные категории для использования администратором системы. Категория local7 обычно используется для сообщений, генерируемых на этапе загрузки системы.
- mark (не имеющая цифрового эквивалента) — присваивается отдельным сообщениям, формируемым самим демоном syslogd
Под приоритет (степени важности) сообщений заданы 8 уровней важности, которые кодируются числами от 0 до 7:
- 0 — emerg (старое название PANIC) — Чрезвычайная ситуация. Система неработоспособна.
- 1 — alert — Тревога! Требуется немедленное вмешательство.
- 2 — crit — Критическая ошибка (критическое состояние).
- 3 — err (старое название ERROR) — Сообщение об ошибке.
- 4 — warning (старое название WARN) — Предупреждение.
- 5 — notice — Информация о каком-то нормальном, но важном событии.
- 6 — info — Информационное сообщение.
- 7 — debug — Сообщения, формируемые в процессе отладки.
Согласно действию, указанному в правиле, сообщение может быть записано в следующие назначения:
Обычный файл
Задается полным путем, начиная со слеша (/). Поставьте перед ним дефис (-), чтобы отменить синхронизацию файла после каждой записи. Это может привести к потере информации, но повысить производительность.
Именованные каналы
Размещение перед именем файла символа канала (|) позволит использовать fifo (first in — first out, первый пришел — первый вышел) или именованный канал (named pipe) в качестве приемника для сообщений. Прежде чем запускать (или перезапускать) syslogd, необходимо создать fifo при помощи команды mkfifo. Иногда fifo используются для отладки.
Терминал и консоль
Терминал, такой как /dev/console.
Удаленная машина
Чтобы сообщения пересылались на другой хост, поместите перед именем хоста символ (@). Обратите внимание, что сообщения не пересылаются с принимающего хоста. (для работы данного назначения на клиенте и сервере в файле /etc/services должна быть прописана строчка syslog 514/udp, и открыт UTP-порт 514)
Список пользователей
Разделенный запятыми список пользователей, получающих сообщения (если пользователь зарегистрирован в системе). Сюда часто включается пользователь root.
Все зарегистрированные пользователи
Чтобы известить всех зарегистрированных пользователей при помощи команды wall, используйте символ звездочки (*).
Пример несложного syslog.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# Все сообщения ядра выдавать на консоль. #kern.* /dev/console # Все логи уровня info или выше, кроме сообщений электронной почты, а так же # не логировать сообщения аутентификации и сообщений демона cron! *.info;mail.none;authpriv.none;cron.none /var/log/messages # Записывать в отдельный файл сообщения, содержащие конфиденциальную # информацию аутентификации, независимо от их уровня. authpriv.* /var/log/secure # Все сообщения почтовой системы тоже записывать в отдельный файл. mail.* —/var/log/maillog # Логировать сообщения планировщика в файл /var/log/cron cron.* /var/log/cron # Сообщения о чрезвычайных ситуациях должны немедленно получить # все пользователи системы *.emerg * # Сохранять сообщения новостей уровня crit и выше в отдельный файл. uucp,news.crit /var/log/spooler # Сохранять сообщения загрузки в boot.log local7.* /var/log/boot.log |
Как и во многих конфигурационных файлах, синтаксис следующий:
- строки, начинающиеся с #, и пустые строки игнорируются.
- Символ * может использоваться для указания всех категорий или всех приоритетов.
- Специальное ключевое слово none указывает, что журналирование для этой категории не должно быть выполнено для этого действия.
- Дефис перед именем файла (как -/var/log/maillog в этом примере) указывает, что после каждой записи журнал не должен синхронизироваться. В случае аварии системы вы можете потерять информацию, но отключение синхронизации позволит повысить производительность.
В синтаксисе конфигурационного файла можно поставить перед приоритетом знак !, чтобы показать, что действие не должно применяться, начиная с этого уровня и выше. Подобным образом, перед приоритетом можно поставить знак =, чтобы показать, что правило применяется только к этому уровню, или !=, чтобы показать, что правило применяется ко всем уровням, кроме этого. Ниже показано несколько примеров (man syslog.conf можно найти множество других примеров):
# Посылать все сообщения ядра в /var/log/kernel. # Посылать все сообщения уровня critical и higher на удаленную машину sysloger и на консоль # Посылать все сообщения уровня info, notice и warning в /var/log/kernel-info # kern.* /var/log/kernel kern.crit @sysloger kern.crit /dev/console kern.info;kern.!err /var/log/kernel—info # Посылать все сообщения почтовой системы, кроме уровня info в /var/log/mail. mail.*;mail.!=info /var/log/mail |
Запуск демона syslogd
Запуск демона протоколирования запускаются на этапе инициализации системы посредством скрипта /etc/rc.d/init.d/syslog, однако для того, чтобы задать параметры запуска, нет необходимости корректировать этот скрипт — начиная с версии 7.2, опции запуска считываются из отдельного конфигурационного файла /etc/sysconfig/syslog (/etc/default/syslog в debian).
Вот некоторые возможные параметры запуска демона syslogd:
- -a /folder/socket — указание дополнительного слушающего сокета (не забудьте предварительно создать сокет)
- -d — отладочный режим. При этом демон не переходит в фоновый режим и выдает все сообщения на текущий терминал;
- -f имя-конфигурационного-файла. Задает имя альтернативного конфигурационного файла, который будет использоваться вместо заданного по умолчанию /etc/syslog.conf;
- -l список-хостов — задание списка хостов, имена которых не должны записываться с указанием полного доменного имени (FQDN — Full Qwalified Domain Name);
- -m минут — запущенный без этой опции sysklogd через каждые 20 минут записывает в протокол сообщения категории mark (временные отметки). С помощью опции -m можно либо изменить интервал между отметками, либо вовсе отменить выдачу таких сообщений;
- -p socket — задание альтернативного сокета UNIX (вместо прослушиваемого по умолчанию /dev/log);
- -r — разрешение принимать сообщения от удаленных хостов;
- -x — запрет определения имени хоста по его адресу для предотвращения зависания при работе на одном хосте с сервером DNS.
- -v — показать версию и закончить работу
После запуска демона syslogd создается файл статуса /var/lock/subsys/syslog нулевой длины, и файл с идентификационным номером процесса /var/run/syslogd.pid.
С помощью команды
kill -SIGNAL cat /var/run/syslogd.pid
можно послать демону syslogd один из следующих сигналов: SIGHUP — перезапуск демона; SIGTERM — завершение работы; SIGUSR1 — включить/выключить режим отладки.
Вообще-то в системе запускаются два демона протоколирования — syslogd и klogd. Оба демона входят в состав пакета sysklogd.
Демон klogd отвечает за журналирование событий, происходящих в ядре системы. Необходимость в отдельном демоне klogd объясняется тем, что ядро не может использовать стандартную функцию syslog. Дело в том, что стандартные библиотеки С (включая ту библиотеку, в которой находится функция syslog) предназначены для использования только обычными приложениями. Поскольку ядро тоже нуждается в функциях журналирования, в него включены свои библиотеки, недоступные приложениям. Поэтому ядро использует свой собственный механизм генерации сообщений.
Демон klogd предназначен для организации обработки этих сообщений. В принципе он может производить такую обработку полностью самостоятельно и независимо от syslogd, например, записывая эти сообщения в файл, но в большинстве случаев используется принятая по умолчанию настройка klogd, при которой все сообщения от ядра пересылаются тому же демону syslogd.
Автоматическая ротация (обновление заполненных файлов) и архивирование журналов
Со временем, файл журнала имеет свойство увеличиваться, особенно при интенсивной работе какого-либо сервиса. Соответственно, необходимо иметь возможность контролировать размер журналов. Это делается при помощи команды logrotate, которая обычно выполняется демоном cron. О работе cron я расскажу в следующих статьях. Главная цель команды logrotate состоит в том, чтобы периодически создавать резервные копии журналов и создавать новые чистые журналы. Сохраняется несколько поколений журналов и, когда завершается срок жизни журнала последнего поколения, он может быть заархивирован (сжат). Результат может быть отправлен по почте, например, ответственному за ведение архивов.
Для определения порядка ротации и архивирования журналов используется конфигурационный файл /etc/logrotate.conf. Для разных журналов можно задать разную периодичность, например, ежедневно, еженедельно или ежемесячно, кроме того, можно регулировать количество накапливаемых поколений, а также указать, будут ли копии архивов отправляться ответственному за ведение архивов и, если будут, когда. Ниже показан пример файла /etc/logrotate.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# сначала заданы параметры «по-умолчанию» (глобальные опции) # обновлять файлы журнала еженедельно weekly # хранить архив логов за 4 последние недели rotate 4 # создавать новый (пустой) файл после ротации (обновления) create # раскомментируйте, если желаете, чтобы сохраненные файлы сжимались #compress # включить настройки ротации из указанного каталога include /etc/logrotate.d # не хранить wtmp, или btmp — настройки ротации данных журналов следующие: /var/log/wtmp { missingok monthly create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly create 0664 root utmp rotate 1 } # специфичные системные журналы могут быть настроены ниже |
Глобальные опции размещаются в начале файла logrotate.conf. Они используются по умолчанию, если где-то в другом месте не задано ничего более определенного. В примере ротация журналов происходит еженедельно и резервные копии сохраняются в течение четырех недель. Как только производится ротация журнала, на месте старого журнала автоматически создается новый. Файл logrotate.conf может содержать спецификации из других файлов. Так, в него включаются все файлы из каталога /etc/logrotate.d.
В этом примере также содержатся специальные правила для /var/log/wtmp и /var/log/btmp (хранящие информацию о удачных и неудачных попытках входя в систему), ротация которых происходит ежемесячно. Если файлы отсутствуют, сообщение об ошибке не выдается. Создается новый файл и сохраняется только одна резервная копия.
В этом примере по достижении резервной копией последнего поколения она удаляется, поскольку не определено, что следует с ней делать.
Резервные копии журналов могут также создаваться, когда журналы достигают определенного размера, и могут быть созданы скрипты из наборов команд для выполнения до или после операции резервного копирования. Пример:
/var/log/messages { rotate 5 mail logadmin@sysloger size 100k postrotate /usr/bin/killall —HUP syslogd endscript } |
В этом примере ротация /var/log/messages производится по достижении им размера 100 КБ. Накапливается пять резервных копий, и когда истекает срок жизни самой старой резервной копии, она отсылается по почте на адрес logadmin@sysloger. Командное слово postrotate включает скрипт, перезапускающий демон syslogd после завершения ротации путем отправки сигнала HUP. Командное слово endscript необходимо для завершения скрипта, а также в случае, если имеется скрипт prerotate. Более полную информацию см. в страницах руководства man для logrotate.
Параметры, задаваемые в конфигурационном файле logrotate.conf:
- compress | nocompress (старые версии сжимаются или не сжимаются с помощью gzip)
- compresscmd (задает программу сжатия, по умолчанию — gzip)
- uncompresscmd (задает программу разжатия, по умолчанию — ungzip)
- compressext (задает суффикс для сжатых файлов)
- compressoptions (задает параметры программы сжатия; по умолчанию — «-9», т.е. максимальное сжатие для gzip)
- copytruncate | nocopytruncate (обычно старая версия переименовывается и создается новая версия журнала; при задании этого параметра logrotate копирует журнал в новый файл, а затем обрезает старый; используется, если программа, создающая журнал, не умеет его закрывать; теряются записи, сделанные в промежутке между копированием и обрезанием; а поможет ли, если создающая журнал программа вместо режима append просто пишет в файл, используя внутренний указатель?)
- create [права-доступа владелец группа] | nocreate (сразу после переименования старой версии журнала и до вызова postrotate создается новый журнал с указанными атрибутами — права доступа задаются в восьмеричном виде, как в chmod.2; если атрибуты не указаны, то берутся от старого журнала)
- daily (смена версий в серии происходит ежедневно)
- delaycompress | nodelaycompress (некоторые программы не сразу закрывают журнал, в этом случае сжатие надо отложить до следующего цикла)
- errors email (кому направлять сообщения об ошибках)
- extension суффикс (задается суффикс, добавляемый к именам файлов при ротации перед суффиксом сжатия)
- ifempty | notifempty (смена версий даже если файл пуст; действует по умолчанию)
- include имя-файла | имя-директории (текстуально подставить файл или все файлы из указанной директории; не включаются поддиректории, специальные файлы и файлы с суффиксами из списка исключений; нельзя использовать внутри секции)
- mail адрес | nomail (когда смена версий приводит к необходимости удалить старый журнал, то послать его по указанному адресу)
- mailfirst (посылать не удаляемую версию журнала, а первую)
- maillast (посылать удаляемую версию журнала; действует по умолчанию)
- missingok | nomissingok (не посылать сообщения об ошибке, если журнал отсутствует)
- monthly (смена версий происходит ежемесячно)
- olddir директория | noolddir (во время смены версий журнал перемещается в указанную директорию; д.б. на том же физическом устройстве)
- postrotate (все дальнейшие строчки до строки endscript исполняются как команды shell после процесса смены версии)
- prerotate (все дальнейшие строчки до строки endscript исполняются перед процессом смены версии)
- rotate число (сколько старых версий хранить; если 0, то ни одной)
- size байт (смена версии происходит, если размер журнала превысил указанное число; можно использовать суффиксы «k» — килобайт — и «M» — мегабайт)
- sharedscripts | nosharedscripts (выполнять команды prerotate и postrotate только один раз для всех файлов, описанных в секции)
- tabooext [+] список-суффиксов (задание списка суффиксов-исключений для include; если указан знак «плюс», то дополнение, иначе замена; по умолчанию: .rpmorig, .rpmsave, .rpmnew, «,v», .swp и «~»)
- weekly (смена версий происходит еженедельно)
Изучение и мониторинг журналов
Записи в журналах обычно содержат метку времени, имя хоста, на котором выполняется описываемый процесс, и имя процесса. Просматривать журналы можно при помощи программы постраничного вывода, например, less, искать определенные записи (например, сообщения ядра от определенного демона) можно при помощи команды grep:
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@syslog—server ~]# less /var/log/messages [root@syslog—server ~]# grep «ppp» /var/log/messages | tail Dec 17 16:34:25 proxy pppd[7843]: Connection terminated. Dec 17 16:34:25 proxy pppd[7843]: Exit. Dec 17 16:35:57 proxy pppd[11345]: LCP terminated by peer (^P]kV^@<M—Mt^@^@^@^@) Dec 17 16:35:57 proxy pppd[11345]: pptpd—logwtmp.so ip—down ppp2 Dec 17 16:35:57 proxy pppd[11345]: Connect time 14.8 minutes. Dec 17 16:35:57 proxy pppd[11345]: Sent 130192 bytes, received 53946 bytes. Dec 17 16:35:57 proxy pppd[11345]: Modem hangup Dec 17 16:35:57 proxy pppd[11345]: Connection terminated. Dec 17 16:35:57 proxy pppd[11345]: Script /etc/ppp/ip—down finished (pid 12084), status = 0x1 Dec 17 16:35:57 proxy pppd[11345]: Exit. |
Компьютер может работать не постоянно и выключаться, допустим на ночь. Поэтому в /var/log/messages записи хранятся циклически от запуска компьютера к выключению, это можно заметить по сообщениям:
Дек 17 08:32:56 syslog—server syslogd 1.4—0: restart. Дек 17 08:32:56 syslog—server syslog: запуск syslogd succeeded Дек 17 08:32:56 syslog—server kernel: klogd 1.4—0, log source = /proc/kmsg started. Дек 17 08:32:56 syslog—server syslog: запуск klogd succeeded |
Далее в файле протокола можно обнаружить версию ядра, параметры его запуска, информацию о типе процессора и объеме ОЗУ:
Dec 17 08:32:56 syslog—server kernel: Kernel command line: auto BOOT_IMAGE=linux ro root=303 BOOT_FILE=/boot/vmlinuz—2.4.2—2 Dec 17 08:32:56 syslog—server kernel: Memory: 125652k/130560k available (1365k kernel code, 4200k reserved, 92k data, 236k init, 0k highmem) Dec 17 08:32:56 syslog—server kernel: CPU: Intel(R) Pentium(R) 4 CPU 1.60GHz stepping 02 |
Так же, в этом файле можно найти информацию о дисковой памяти (включая информацию о геометрии диска, структуре разделов и используемых прерываниях), информацию о периферийных устройствах, о запуске отдельных служб и сервисов, информацию о подключении файловых систем и сообщения о входе пользователей в систему, а также сообщения об ошибках.
Иногда может возникать необходимость мониторинга системных журналов с целью поиска текущих событий. Например, можно попробовать поймать редко случающееся событие в тот момент, когда оно произошло. В таком случае можно использовать команду tail с опцией -f для отслеживания содержимого системного журнала. Пример:
[root@syslog—server~]# tail -f /var/log/messages | grep syslog-server Dec 17 16:46:09 syslog—server pppd[12548]: pptpd—logwtmp.so ip—up ppp0 maikop 94.77.0.150 Dec 17 16:46:09 syslog—server pppd[12548]: Script /etc/ppp/ip—up finished (pid 12552), status = 0x0 Dec 17 16:46:49 syslog—server pptpd[12581]: CTRL: Client 85.175.197.65 control connection started Dec 17 16:46:49 syslog—server pptpd[12581]: CTRL: Starting call (launching pppd, opening GRE) Dec 17 16:46:49 syslog—server pppd[12582]: Plugin /usr/lib/pptpd/pptpd—logwtmp.so loaded. |
Кроме файлов-журналов, указанных в /etc/syslog.conf, существуют так же и другие файлы, например файл /var/log/dmesg, который хранит информацию о процессе загрузки системы до запуска syslogd, а так же файлы /var/log/lastlog, /var/log/wtmp, /var/log/btmp, имеющие двоичный формат и и хранящие информацию о последнем входе пользователя в систему, о всех удачных входах пользователей в систему и о всех неудачных входах пользователей в систему соответственно. Так же в каталоге /var/log/ могут находится лог-файлы таких демонов как веб-сервер или прокси-сервер. Формат данных файлов аналогичен журналам syslogd.
На последок, хотелось бы сделать акцент на том, что данный протокол очень не защищен, т.к. syslog не содержит никаких средств защиты от подделок сообщений. Хуже того, использование протокола UDP позволяет злоумышленникам посылать сообщения от имени любого хоста. Ваша локальная сеть должна быть защищена экраном от приема пакетов с поддельными локальными адресами (хотя это не помешает посылать поддельные сообщения изнутри локальной сети) и от приема пакетов снаружи на порт 514/udp. Известны случаи переполнения диска ложными сообщениями.
Протокол syslog и UDP не обеспечивают гарантированной доставки (сообщения могут быть потеряны при перегрузке сети или перехвачены, поврежденные сообщения удаляются без предупреждения), правильной последовательности доставки (сообщение о завершении процесса может придти раньше сообщения о его запуске), приоритетной доставки.
Конфиденциальность сообщений не обеспечивается, так как они передаются открытым текстом.
Если при настройке генератора сообщений указать неправильный адрес коллектора или релея, то никаких сообщений об ошибке не будет — сообщения будут удаляться (или записываться в чужой журнал).
Были предложены несколько проектов улучшения протокола syslog. Например, документ RFC 3195 предлагает систему протоколирования (syslog-conn), основанную на TCP, обеспечивающую гарантированную доставку сообщений в правильной последовательности. Проект syslog-sign предлагает обеспечить аутентификацию, упорядоченность, целостность сообщений и обнаружение пропавших сообщений за счет генерации специальных сообщений, содержащих цифровую подпись (signature) блока предыдущих сообщений с сохранением стандартного протокола и формата syslog и использованием UDP.
Подведем небольшой итог:
В линукс есть единый демон, отвечающий за журналирование событий локальной системы и удаленных систем. Все события собираются из сокета /dev/log, порта UDP — 514, а так же от «помощника» — демона klogd, который присылает сообщения от ядра. Все собранные сообщения фильтруются демоном syslogd через правила в файле /etc/syslog.conf и в соответствии с правилами распределяются по соответствующим местам назначения. Файлы логов периодически «обрезаются». Периодичность определяет файл logrotate.conf и команда logrotate, которая запускается системным планировщиком — cron.
На сегодня это все. Надеюсь описал все максимально понятно. Со временем буду дополнять статью!