summaryrefslogtreecommitdiff
path: root/LINUX/Логи в Linux.md
blob: 6357dc57e3538947d6e58392b07706d8017027a7 (plain)
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# Как разбирать: journalctl, grep, awk и sed

Каждый админ хотя бы раз сталкивался с ситуацией, когда сервер внезапно начинает тупить: подвисают процессы, появляются странные задержки, что‑то перестаёт работать. И первая остановка в таком случае — это журналы событий. В Linux системные логи хранятся в **systemd‑journald**, а его главный инструмент для работы — `journalctl`. Но просто читать логи — это скучно. Разберем, **как фильтровать, искать ошибки, анализировать данные и автоматизировать разбор логов** с помощью `grep`, `awk`, `sed` и других утилит.

#### Работа с journalctl

Самый простой способ заглянуть в системные журналы — просто вызвать `journalctl`:

```
journalctl
```

Но если сервер работает долго, логов там будет много. Выведем их без постраничного режима:

```
journalctl --no-pager
```

Если команда зависает, скорее всего, журнал слишком большой. Ограничим его по времени, например, **выведем логи за последний час**:

```
journalctl --since "1 hour ago"
```

Теперь можно быстро отследить недавние события.

#### Как понять, что произошло после перезагрузки?

Если сервер неожиданно перезагрузился, полезно посмотреть, что записалось в логи **после старта**:

```
journalctl -b
```

Если система несколько раз перезагружалась, можно посмотреть события после конкретного запуска, например, **минус первый перезапуск**:

```
journalctl -b -1
```

Это поможет понять, что произошло перед падением системы.

#### Фильтрация по сервису

Чтобы разобраться в проблемах конкретного сервиса, например, `nginx`, используем флаг `-u`:

```
journalctl -u nginx.service --no-pager
```

Пример вывода:

```
Feb 02 10:15:00 myserver nginx[1234]: Starting nginx: [OK]
Feb 02 10:16:00 myserver nginx[1234]: 502 Bad Gateway
```

Можно дополнительно **сортировать логи от новых к старым**:

```
journalctl -u nginx.service --reverse
```

#### grep для поиска ошибок

Журналы бывают огромными, но нам нужны только ошибки. Отфильтруем их с помощью `grep`:

```
journalctl -u nginx.service | grep "error"
```

Пример вывода:

```
Feb 02 11:20:00 myserver nginx[5678]: error: failed to bind socket
Feb 02 11:22:00 myserver nginx[5678]: error: no permission to access /var/www/html
```

Чтобы **не зависеть от регистра**, используем `-i`:

```
journalctl -u nginx.service | grep -i "error"
```

Теперь `ERROR`, `Error` и `error` будут найдены.

Иногда важно видеть не только саму ошибку, но и контекст вокруг. Например, **две строки до и после найденного слова**:

```
journalctl -u nginx.service | grep -A 2 -B 2 "error"
```

Так можно увидеть, что происходило **до и после ошибки**.

#### Выбираем нужные данные с awk

Журналы содержат много лишней информации. Например, оставим **только дату, время и сообщение**:

```
journalctl -u nginx.service | awk '{print $1, $2, $3, $6}'
```

Вывод:

```
Feb 02 12:00:00 Starting
Feb 02 12:05:00 error:
Feb 02 12:10:00 Listening
```

Если сообщения длинные, можно **обрезать текст**:

```
journalctl -u nginx.service | awk '{print substr($0, index($0,$6))}'
```

Это оставит только само сообщение без метаданных.

#### Очистка логов с sed

Некоторые логи содержат ненужные теги или мусорные символы. Например, уберём всё, что находится в квадратных скобках `[INFO]`:

```
journalctl -u nginx.service | sed 's/\[.*\]//g'
```

Исходный лог:

```
Feb 02 13:30:00 myserver nginx[1234]: [INFO] Server started
```

После обработки:

```
Feb 02 13:30:00 myserver nginx[1234]: Server started
```

Также можно **заменить текст**, например, заменить `error` на `!!!ERROR!!!` для выделения:

```
journalctl -u nginx.service | sed 's/error/!!!ERROR!!!/g'
```

#### Автоматический сбор ошибок

Допустим, мы нужно **каждый день автоматически собирать ошибки Nginx** и записывать их в файл. Используем **crontab** и скрипт:

```
journalctl -u nginx.service --since "1 day ago" | grep -i "error" | awk '{print $1, $2, $3, $6, $7, $8}' > /var/log/nginx_errors.log
```

Этот код:

1. Берёт логи Nginx за последние 24 часа.
2. Ищет строки с `"error"`.
3. Оставляет только дату, время и сообщение.
4. Записывает результат в `/var/log/nginx_errors.log`.
#### Вывод логов в реальном времени

А если хочется **смотреть логи в реальном времени**, то спользуйте флаг `-f`:

```
journalctl -u nginx.service -f=
```

Это как `tail -f`, но для journalctl — вы сразу увидите, если сервис упадёт.

=====================================
## Расположение логов по умолчанию

Большинство файлов логов Linux находятся в папке **/var/log/** вы можете список файлов логов для вашей системы с помощью команды ls:

 `ls -l /var/log/`

Ниже мы рассмотрим 20 различных файлов логов Linux, размещенных в каталоге **/var/log/**. Некоторые из этих логов встречаются только в определенных дистрибутивах.

- **/var/log/messages** - содержит глобальные системные логи Linux, в том числе те, которые регистрируются при запуске системы. В этот лог записываются несколько типов сообщений: это почта, cron, различные сервисы, ядро, аутентификация и другие.
- **/var/log/dmesg** - содержит сообщения, полученные от ядра. Регистрирует много сообщений еще на этапе загрузки, в них отображается информация об аппаратных устройствах, которые инициализируются в процессе загрузки. Можно сказать это еще один лог системы Linux. Количество сообщений в логе ограничено, и когда файл будет переполнен, с каждым новым сообщением старые будут перезаписаны. Вы также можете посмотреть сообщения из этого лога с помощью команды dmseg.
- **/var/log/auth.log** - содержит информацию об авторизации пользователей в системе, включая пользовательские логины и механизмы аутентификации, которые были использованы.
- **/var/log/boot.log** - Содержит информацию, которая регистрируется при загрузке системы.
- **/var/log/daemon.log** - Включает сообщения от различных фоновых демонов
- **/var/log/kern.log** - Тоже содержит сообщения от ядра, полезны при устранении ошибок пользовательских модулей, встроенных в ядро.
- **/var/log/lastlog** - Отображает информацию о последней сессии всех пользователей. Это нетекстовый файл, для его просмотра необходимо использовать команду lastlog.
- **/var/log/maillog /var/log/mail.log** - журналы сервера электронной почты, запущенного в системе.
- **/var/log/user.log** - Информация из всех журналов на уровне пользователей.
- **/var/log/Xorg.x.log** - Лог сообщений Х сервера.
- **/var/log/alternatives.log** - Информация о работе программы update-alternatives. Это символические ссылки на команды или библиотеки по умолчанию.
- **/var/log/btmp** - лог файл Linux содержит информацию о неудачных попытках входа. Для просмотра файла удобно использовать команду last -f /var/log/btmp
- **/var/log/cups** - Все сообщения, связанные с печатью и принтерами.
- **/var/log/anaconda.log** - все сообщения, зарегистрированные при установке сохраняются в этом файле
- **/var/log/yum.log** - регистрирует всю информацию об установке пакетов с помощью Yum.
- **/var/log/cron** - Всякий раз когда демон Cron запускает выполнения программы, он записывает отчет и сообщения самой программы в этом файле.
- **/var/log/secure** - содержит информацию, относящуюся к аутентификации и авторизации. Например, SSHd регистрирует здесь все, в том числе неудачные попытки входа в систему.
- **/var/log/wtmp или /var/log/utmp -** системные логи Linux**,** содержат журнал входов пользователей в систему. С помощью команды wtmp вы можете узнать кто и когда вошел в систему.
- **/var/log/faillog** - лог системы linux, содержит неудачные попытки входа в систему. Используйте команду faillog, чтобы отобразить содержимое этого файла.
- **/var/log/mysqld.log** - файлы логов Linux от сервера баз данных MySQL.
- **/var/log/httpd/ или /var/log/apache2** - лог файлы linux11 веб-сервера Apache. Логи доступа находятся в файле access_log, а ошибок в error_log
- **/var/log/lighttpd/** - логи linux веб-сервера lighttpd
- **/var/log/conman/** - файлы логов клиента ConMan,
- **/var/log/mail/** - в этом каталоге содержатся дополнительные логи почтового сервера
- **/var/log/prelink/** - Программа Prelink связывает библиотеки и исполняемые файлы, чтобы ускорить процесс их загрузки. /var/log/prelink/prelink.log содержит информацию о .so файлах, которые были изменены программой.
- **/var/log/audit/**- Содержит информацию, созданную демоном аудита auditd.
- **/var/log/setroubleshoot/ -** SE Linux использует демон setroubleshootd (SE Trouble Shoot Daemon) для уведомления о проблемах с безопасностью. В этом журнале находятся сообщения этой программы.
- **/var/log/samba/** - содержит информацию и журналы файлового сервера Samba, который используется для подключения к общим папкам Windows.
- **/var/log/sa/** - Содержит .cap файлы, собранные пакетом Sysstat.
- **/var/log/sssd/** - Используется системным демоном безопасности, который управляет удаленным доступом к каталогам и механизмами аутентификации.

## Просмотр логов в Linux

Смотрим лог **/var/log/dmesg**, с возможностью прокрутки:
 `less /var/log/dmesg`

Просмотр логов Linux, в реальном времени:
 `tail -f /var/log/dmesg`

Открываем лог файл dmesg:
 `cat /var/log/dmesg`

Первые строки dmesg:
 `head /var/log/dmesg`

Выводим только ошибки из /var/log/messages:
 `grep -i error /var/log/dmesg`
 
=====================================