Daily MaverickKrakow mass shooting assailant dies in hospital, Polish police sayThe Jerusalem PostIran defends two-day peace proposal as 'most reasonable,' slamming Rubio's remarks as unjustifiedInquirerPoa: Too early to discuss calling VP Duterte as witness in impeachmentPunchUK to stop schools from starting GCSE teaching in Year 7Inquirer EntertainmentCristy Fermin, Romel Chika face NBI over Barretto’s cyberlibel rapZDF heuteAktuelle Pressemitteilungen des ZDFGolem.deAnzeige: Kabelloses Gaming-Headset für unter 50 Euro bei AmazonMalay MailThree Singaporeans injured in Taiwan crash after car hits taxi head-onAnadolu AjansıABD'de Temsilciler Meclisi Azınlık Lideri Jeffries'ten, Hegseth'in görevden azledilmesine destekRTL BoulevardTopman Nvidia lag in bed met vermeende spion: 'Dit is een beetje James Bond'Screen RantThe Legend Of Zelda Officially Returns To The Wilds Era On December 4The South AfricanWhat you can and cannot bring into Kruger National Park
The Daily Newsstand · Free, Always
Monday, November 9, 2026

Linux: Логи. Что это такое и справочник по базовым утилитам

Translate

Введение

Эта статья — справочник по утилитам, которые помогают читать логи и быстро находить в них причину проблем. Для одного сервера или домашней лаборатории (homelab) этого набора хватает в большинстве случаев.

  • journalctl — чтение журнала systemd, главный инструмент;

  • dmesg — сообщения ядра;

  • tail — конец файла и слежение за логом в реальном времени;

  • less — постраничный просмотр больших логов;

  • grep — поиск по шаблону;

  • zgrep — поиск по сжатым, уже ротированным логам;

  • last, lastb, lastlog — бинарные журналы входов в систему.

Для каждой утилиты вы найдёте, для чего она нужна, и таблицу со всеми ключами.

Примеры выполнены на Ubuntu. Команды, начинающиеся с sudo, требуют прав администратора. На своём сервере они вам понадобятся, на чужом сначала убедитесь, что вам можно.

Базовая информация

Что такое логи

Лог (log) — журнал событий: запись о том, что произошло, с временем и источником. Зачем они нужны? Ну, например, для того, чтобы посмотреть, почему N-й сервис не работает. Если вы обращаетесь, к примеру, за помощью в тематический чат с вопросом «у меня не работает nginx, помогите», вам в большинстве случаев скажут смотреть или прислать логи. Большая часть текстовых логов находится в каталоге /var/log:

Файл

Что внутри

/var/log/syslog

Общий системный журнал: сообщения служб, ядра, планировщика

/var/log/auth.log

Входы в систему, sudo, SSH, неудачные попытки авторизации

/var/log/kern.log

Сообщения ядра

/var/log/dpkg.log

Что и когда ставилось и удалялось

/var/log/btmp, wtmp, lastlog

Бинарные журналы входов, читаются командами lastb, last, lastlog

Часть файлов, возможно, вы не найдёте в своей системе, поскольку на разных дистрибутивах логи пишут сразу два механизма: journald и rsyslog.

journald — служба журналирования из состава systemd. Она перехватывает вывод всех служб и ядра, начиная с самой ранней стадии загрузки, и хранит его в бинарном индексированном виде. Читается командой journalctl.

rsyslog — демон (daemon, фоновая программа), который раскладывает сообщения по текстовым файлам в /var/log.

Так вот, на некоторых сборках или минимальных установках rsyslog может отсутствовать, тогда /var/log/syslog и /var/log/auth.log не существуют, а всё лежит только в journald.

Проверить можно командами systemctl is-active rsyslog (проверка, запущен ли rsyslog) и ls -lh /var/log/syslog /var/log/auth.log (проверка, есть ли текстовые файлы). Если у вас работают эти два механизма, то учитывайте, что сообщение обычно хранится дважды: в журнале и в текстовом файле. На Ubuntu journald пересылает копию в rsyslog: параметр ForwardToSyslog=yes включён в файле /usr/lib/systemd/journald.conf.d/syslog.conf, который поставляется вместе с systemd. В основном конфиге /etc/systemd/journald.conf этот параметр закомментирован (#ForwardToSyslog=no), так что искать yes там бесполезно.

Наверняка вы задались вопросом: а зачем нам эти два механизма? Если вкратце, journald мгновенно собирает логи в единую бинарную базу, а rsyslog забирает этот поток и раскладывает по привычным текстовым файлам в /var/log для совместимости со старым софтом, скриптами и системами мониторинга. Есть и второй плюс: если бинарный журнал повредится из-за сбоя, текстовые файлы читаются чем угодно, и часть логов удастся спасти.

Только не путайте это с резервной копией. Это не считается: оба хранилища лежат на одном диске, и при выходе диска из строя пропадут оба. От этого защищает, например, отправка логов на другой сервер.

Типы логов

Тип

Где искать

Когда смотреть

Системные

syslog, kern.log, boot.log, daemon.log, journalctl, dmesg

Общая картина: что делали службы и ядро

Безопасность и входы

auth.log, /var/log/audit/ (auditd), btmp, wtmp, lastlog

Кто заходил, перебор паролей, sudo

Пакетные менеджеры

dpkg.log, apt/history.log

Что ставилось и обновлялось перед тем, как всё сломалось

Службы и приложения

nginx/, apache2/, mysql/, postgresql/, fail2ban.log, ufw.log

Работа конкретного сервиса

Контейнеры

docker logs

Вывод контейнеров лежит не в /var/log, а в хранилище Docker

Установка и первый запуск

installer/, cloud-init.log, cloud-init-output.log

Почему свежий VPS настроился не так, как ожидалось

Типы логов знать необязательно, но рекомендуется, если вы хотите запомнить, где что находится, или пишете своё ПО и хотите понимать, в чём разница между текстовыми (rsyslog) и бинарными (journald) логами. Текстовые читаются cat, less, grep. Бинарные так читать нельзя: нужны свои команды, например:

Бинарный лог

Чем читать

Журнал journald

journalctl

/var/log/wtmp — история входов и выходов

last

/var/log/btmp — неудачные попытки входа

lastb

/var/log/lastlog — последний вход каждого пользователя

lastlog

Если сделать grep по btmp, вы получите сообщение типа binary file matches и подумаете, что искомого там нет. А оно там есть, grep просто отказался печатать бинарные данные.

Как устроена строка лога

В зависимости от того, где вы и что смотрите, структура логов может меняться, но базовые вещи всё же вы поймёте по этому примеру:

сен 17 18:10:13 veilos kernel: Linux version 7.0.0-31-generic (buildd@lcy02-amd>
  1. сен 17 18:10:13 — время события. Формат упрощён (в syslog дату и прочие параметры можно увидеть детальнее).

  2. veilos — имя компьютера (hostname).

  3. kernel: — источник сообщения (тут он указывает, что запись сделана ядром операционной системы).

  4. Linux version 7.0.0-31-generic — текст сообщения.

  5. (buildd@lcy02-amd> — обрезанный хвост строки (её обрезал пейджер less: journalctl запускает его с обрезкой длинных строк, а символ > показывает, что текст не поместился в ширину терминала. Остальное видно, если прокрутить вправо, а с ключом --no-pager строки переносятся).

Не хватает уровней важности, о них ниже.

Уровни важности

У каждого сообщения есть уровень (приоритет). Их восемь, от самого серьёзного к самому незначительному:

Число

Имя

Значение

0

emerg

Система непригодна к работе

1

alert

Действовать нужно немедленно

2

crit

Критическая ошибка

3

err

Ошибка

4

warning

Предупреждение (в dmesg называется warn)

5

notice

Обычное, но значимое событие

6

info

Информационное сообщение

7

debug

Отладка

Эти уровни нужны, например, в journalctl -p и dmesg -l, и ведут они себя по-разному:

  • journalctl -p err показывает уровень err и всё серьёзнее: 0, 1, 2 и 3;

  • dmesg -l err показывает только err, а crit и выше не покажет. Чтобы получить то же, что даёт journalctl, перечислите уровни: dmesg -l emerg,alert,crit,err.

Ротация логов

Текстовые логи растут, поэтому их периодически ротируют (rotate): текущий файл переименовывают, а вместо него создают новый пустой. Этим занимается logrotate. Он запускается по расписанию (таймером systemd или через cron), а настройки лежат в /etc/logrotate.conf и /etc/logrotate.d/.

Поэтому в /var/log рядом с syslog вы увидите такие файлы:

ls -lh /var/log/syslog*
-rw-r----- 1 syslog adm 6,6M окт  3 18:52 /var/log/syslog
-rw-r----- 1 syslog adm  13M сен 27 12:09 /var/log/syslog.1
-rw-r----- 1 syslog adm 1,8M сен 20 12:27 /var/log/syslog.2.gz
-rw-r----- 1 syslog adm 1,3M сен 13 08:36 /var/log/syslog.3.gz
-rw-r----- 1 syslog adm 987K сен  6 00:00 /var/log/syslog.4.gz

syslog.1 — предыдущий лог, он остаётся несжатым, потому что служба ещё может дописывать в него хвост. Начиная с .2 файлы сжаты gzip. Сколько копий хранится и как часто идёт ротация, зависит от конфигурации. На Ubuntu в /etc/logrotate.d/rsyslog стоят weekly и rotate 4: ротация раз в неделю, хранятся 4 копии. Именно поэтому даты в списке выше отстоят друг от друга на неделю.

Из этого следуют две вещи. Во-первых, grep по syslog не увидит событий недельной давности, для этого понадобится zgrep. Во-вторых, tail -f может «потерять» файл после ротации. Как с этим бороться, написано в разделе про tail.

Хранение журнала journald

Журнал journald может храниться в двух режимах:

  • постоянный: файлы лежат в /var/log/journal и переживают перезагрузку;

  • временный: файлы лежат в /run/log/journal, то есть в памяти, и пропадают при перезагрузке. Режим выбирает параметр Storage= в /etc/systemd/journald.conf. По умолчанию стоит auto: журнал постоянный, если каталог /var/log/journal существует. На Ubuntu он есть сразу.

Для разбора «почему сервер упал и перезагрузился» это может быть критично, т.к. если журнал временный, логи предыдущей загрузки уже исчезли. Проверить режим можно так:

ls -d /var/log/journal
journalctl --list-boots

Права доступа

Многие логи читаются только от root или от групп adm и systemd-journal. Чтобы не писать sudo перед каждой командой, вы можете добавить себя в эти группы:

# Группа adm даёт чтение файлов в /var/log, systemd-journal даёт чтение журнала journald
sudo usermod -aG adm,systemd-journal $USER

Изменения применятся после нового входа в систему. Флаг -a обязателен. Без него команда заменит все ваши дополнительные группы, и вы потеряете, например, sudo.

Учтите, что группа adm даёт чтение auth.log, а в нём видны имена пользователей, IP-адреса и попытки входа. Выдавайте её только тем, кому это действительно нужно. Исключение: файл /var/log/btmp принадлежит группе utmp, а не adm. Поэтому lastb потребует sudo, даже если вы состоите в adm.

Перед тем как выложить лог

Если вы собираетесь показать кусок лога на форуме, в issue или в чате, сначала проверьте его. В логах бывают токены в URL, пароли в параметрах запроса, имена пользователей, внутренние адреса и IP клиентов. Замените их заглушками до отправки. Это касается и вывода journalctl, и access.log, и логов приложений (да, в принципе, любого лога практически).

На этом базовое ознакомление с логами заканчивается, переходим к утилитам.

journalctl

journalctl читает журнал journald: вывод всех служб, сообщения ядра и сообщения ранней загрузки в одном месте. Его преимущество перед текстовыми файлами в том, что фильтровать можно по службе, времени, уровню и номеру загрузки, не прибегая к grep. Для разбора проблем это первая команда, с которой стоит начинать.

Общий вид: journalctl [ключи] [фильтры], где фильтры — это пары ПОЛЕ=значение, например _PID=1234 или _SYSTEMD_UNIT=cron.service.

Если у вас нет прав, команда напишет подсказку вида You are currently not seeing messages from other users and the system и покажет только ваш пользовательский журнал. Решение — группа systemd-journal из раздела про права доступа или sudo. Набор ключей зависит от версии systemd, свою версию покажет journalctl --version.

Флаг

Что делает

--system

Показать системный журнал

--user

Показать журнал текущего пользователя

-M, --machine=КОНТЕЙНЕР

Работать с локальным контейнером

-m, --merge

Показать записи из всех доступных журналов

-D, --directory=ПУТЬ

Взять файлы журнала из каталога

--file=ПУТЬ

Прочитать конкретный файл журнала

--root=ПУТЬ

Работать с другим корнем файловой системы

--image=ПУТЬ

Работать с образом диска как с корнем файловой системы

--image-policy=ПОЛИТИКА

Политика разбора образа диска

--namespace=ПРОСТРАНСТВО

Показать данные из указанного пространства имён журнала

-S, --since=ДАТА

Записи не старше указанной даты. Формат: "1 hour ago", yesterday, today, "2026-10-01 12:00"

-U, --until=ДАТА

Записи не новее указанной даты

-c, --cursor=КУРСОР

Начать с записи, на которую указывает курсор

--after-cursor=КУРСОР

Показать записи после курсора

--cursor-file=ФАЙЛ

Показать записи после курсора из файла и обновить файл. Удобно для скриптов, которые читают журнал порциями

-b, --boot[=ID]

Текущая загрузка или указанная. -b -1 — предыдущая, -b -2 — позапрошлая

-u, --unit=СЛУЖБА

Логи указанной службы. Ключ можно повторять

--user-unit=СЛУЖБА

Логи указанной пользовательской службы

-t, --identifier=СТРОКА

Записи с указанным идентификатором syslog, обычно это имя программы

-p, --priority=ДИАПАЗОН

Фильтр по уровню. Одиночный уровень включает и всё серьёзнее. Диапазон задаётся так: warning..err

--facility=КАТЕГОРИЯ...

Записи указанных категорий: auth, kern, daemon и другие

-g, --grep=ШАБЛОН

Записи, в тексте сообщения которых есть совпадение с шаблоном (регулярное выражение). Если шаблон в нижнем регистре, регистр не учитывается

--case-sensitive[=BOOL]

Принудительно включить или выключить учёт регистра в -g

-k, --dmesg

Сообщения ядра за текущую загрузку, аналог dmesg

-o, --output=РЕЖИМ

Формат вывода: short (по умолчанию, как у syslog), short-precise (время с микросекундами), short-iso (время ISO 8601), short-iso-precise (ISO 8601 с микросекундами), short-full (с днём недели и часовым поясом), short-monotonic (секунды с момента загрузки), short-unix (время Unix), verbose (все поля записи), export (бинарно-безопасный формат для передачи), json (одна запись — одна строка JSON), json-pretty (JSON с отступами), json-sse (JSON для Server-Sent Events), json-seq (JSON-последовательность по RFC 7464), cat (только текст сообщения), with-unit (с именем службы)

--output-fields=СПИСОК

Какие поля печатать в режимах verbose, export и json

-n, --lines[=[+]ЧИСЛО]

Сколько записей показать

-r, --reverse

Новые записи сверху

--show-cursor

Напечатать курсор после всех записей

--utc

Показывать время в UTC

-x, --catalog

Добавить пояснения к известным сообщениям, где они есть

--no-hostname

Не выводить имя хоста

--no-full

Обрезать длинные поля многоточием

-a, --all

Показать все поля целиком, включая длинные и непечатаемые

-f, --follow

Следить за журналом в реальном времени, выход по Ctrl+C

--no-tail

В режиме слежения показать все строки, а не только последние

--truncate-newline

Обрезать запись по первому символу перевода строки

-q, --quiet

Не выводить служебные сообщения и предупреждение о правах

--no-pager

Не использовать пейджер: в терминале вывод печатается сразу, без less, и длинные строки переносятся. В файл и в конвейер вывод и так идёт без пейджера

-e, --pager-end

Сразу перейти в конец в пейджере

--interval=ВРЕМЯ

Интервал смены ключа запечатывания FSS

--verify-key=КЛЮЧ

Ключ для проверки запечатанного журнала FSS

--force

Перезаписать существующую пару ключей FSS при --setup-keys

-h, --help

Показать справку

--version

Показать версию

-N, --fields

Перечислить все имена полей, которые встречаются в журнале

-F, --field=ПОЛЕ

Перечислить все значения поля. journalctl -F _SYSTEMD_UNIT покажет все службы, которые что-либо писали в журнал

--list-boots

Краткий список загрузок, сохранённых в журнале

--disk-usage

Сколько места занимают все файлы журнала

--vacuum-size=БАЙТЫ

Удалить старые файлы, чтобы журнал занимал меньше указанного размера

--vacuum-files=ЧИСЛО

Оставить только указанное число файлов журнала

--vacuum-time=ВРЕМЯ

Удалить файлы старше указанного срока

--verify

Проверить целостность файлов журнала

--sync

Сбросить несохранённые сообщения журнала на диск

--relinquish-var

Прекратить запись на диск, писать во временную файловую систему

--smart-relinquish-var

То же, но ничего не делать, если каталог журнала лежит на корневом разделе

--flush

Перенести журнал из /run в /var

--rotate

Запросить немедленную ротацию файлов журнала

--header

Показать заголовок журнала

--list-catalog

Показать все идентификаторы сообщений каталога

--dump-catalog

Показать записи каталога сообщений

--update-catalog

Обновить базу каталога сообщений

--setup-keys

Сгенерировать новую пару ключей FSS

dmesg

dmesg печатает кольцевой буфер ядра (kernel ring buffer). Туда ядро пишет всё про железо и драйверы: нашлись диски, поднялась сетевая карта, пошли ошибки ввода-вывода, сработал OOM killer. Буфер небольшой и фиксированного размера. Когда он заполняется, новые сообщения затирают старые, а после перезагрузки он пустой. Получается, что dmesg видит только текущую загрузку. Что было до неё, я смотрю через journalctl -k -b -1, но это работает только если журнал постоянный.

Файл /var/log/dmesg с командой не путайте. Это снимок буфера, который делается в конце загрузки, дальше он не обновляется. Также на Ubuntu и новых Debian от обычного пользователя dmesg может ругнуться: read kernel buffer failed: Operation not permitted. Дело в kernel.dmesg_restrict, значение смотрится командой sysctl kernel.dmesg_restrict. Там 1, значит, нужен sudo.

Без -T время в начале строки идёт в секундах с момента загрузки, вида [ 1234.567890]. Читать неудобно, зато оно точное. А вот -T иногда врёт, подробности в таблице.

Флаг

Что делает

-C или --clear

Очистить буфер ядра

-c или --read-clear

Прочитать все сообщения и очистить буфер

-D или --console-off

Отключить вывод сообщений на консоль

-E или --console-on

Включить вывод сообщений на консоль

-F или --file ФАЙЛ

Взять данные из файла вместо буфера ядра

-f или --facility СПИСОК

Оставить только указанные категории (facility). Есть kern (ядро), user (сообщения уровня пользователя), mail (почта), daemon (системные службы), auth (безопасность и авторизация), syslog (то, что создаёт сам syslogd), lpr (печать), news (сетевые новости)

-H или --human

Вывод для человека: пейджер, цвета, относительное время

-J или --json

Вывод в JSON

-k или --kernel

Показать сообщения ядра

-L или --color[=КОГДА]

Цвет: auto, always или never

-l или --level СПИСОК

Оставить только указанные уровни через запятую: emerg, alert, crit, err, warn, notice, info, debug. Берутся ровно они, уровни выше не добавляются

-n или --console-level УРОВЕНЬ

Задать уровень сообщений, которые идут на консоль

-P или --nopager

Не использовать пейджер

-p или --force-prefix

Метка времени в каждой строке многострочного сообщения

-r или --raw

Сырой буфер

--noescape

Не экранировать непечатаемые символы

-S или --syslog

Работать через syslog(2), а не через /dev/kmsg

-s или --buffer-size РАЗМЕР

Размер буфера при запросе к кольцевому буферу ядра

-u или --userspace

Показать сообщения пользовательского уровня

-w или --follow

Ждать новых сообщений

-W или --follow-new

Ждать новых сообщений и печатать только их

-x или --decode

Расшифровать категорию и уровень в названия

-d или --show-delta

Показать разницу во времени между сообщениями

-e или --reltime

Локальное время и разница между сообщениями в читаемом виде

-T или --ctime

Время в виде даты. Может быть неточным: после suspend и hibernate оно сбивается

-t или --notime

Не показывать время

--time-format ФОРМАТ

Формат времени: delta, reltime, ctime, notime, iso. После suspend и resume ctime и iso сбиваются так же, как -T

--since ВРЕМЯ

Показать строки с указанного времени

--until ВРЕМЯ

Показать строки до указанного времени

-h или --help

Показать справку

-V или --version

Показать версию

tail

tail печатает конец файла. Для логов это самое подходящее поведение: проблема обычно в последних строках. А с ключом -f команда не завершается, а продолжает печатать строки по мере их появления, и вы видите, что происходит, прямо сейчас.

Если файлов несколько, перед каждым печатается заголовок с именем. Если файл не указан или указан -, команда читает стандартный ввод.

Различие для логов — между -f и -F. -f следит за дескриптором, то есть за самим открытым файлом. Когда logrotate переименовывает syslog в syslog.1, tail -f продолжает смотреть на этот переименованный файл, в который уже никто не пишет, и вывод просто замолкает. -F следит за именем: после ротации он замечает, что под именем syslog появился новый файл, и переключается на него. Для долгого слежения за логом на реальном сервере используйте -F.

Флаг

Что делает

-c, --bytes=[+]N

Показать последние N байт. -c +N начинает вывод с N-го байта

-f, --follow[={name|descriptor}]

Выводить поступающие данные по мере роста файла. Без значения используется descriptor, то есть слежение за самим файлом, а не за его именем

-F

То же, что --follow=name --retry

-n, --lines=[+]N

Показать последние N строк вместо 10. -n +N начинает вывод с N-й строки

--max-unchanged-stats=N

С --follow=name: переоткрыть файл, если за N проверок (по умолчанию 5) его размер не изменился, чтобы выяснить, не удалили или переименовали ли его. Это типичный случай ротации. При использовании inotify почти не нужен

--pid=PID

С -f: прерваться, когда процесс с этим PID завершит работу

-q, --quiet, --silent

Не выводить заголовки с именами файлов

--retry

Продолжать пытаться открыть файл, даже когда он недоступен

-s, --sleep-interval=С

С -f: пауза между проверками примерно С секунд (по умолчанию 1.0). При inotify и --pid=P процесс P проверяется как минимум каждые С секунд

-v, --verbose

Всегда выводить заголовки с именами файлов

-z, --zero-terminated

Разделитель строк — NUL, а не перевод строки

--help

Показать справку

--version

Показать версию

У N в -c и -n могут быть суффиксы-множители: b — 512, kB — 1000, K — 1024, MB — 10001000, M — 10241024, GB, G и так далее до Y, R, Q. Двоичные приставки тоже работают: KiB = K, MiB = M.

less

less — постраничный просмотр файла. Он не загружает файл целиком, поэтому спокойно открывает логи на гигабайты, и в нём можно двигаться вперёд и назад, искать, фильтровать строки. Это основной способ изучать большой лог, когда tail уже мало.

Выход — q, справка внутри программы — h. Режим слежения за файлом включается клавишей F внутри или запуском less +F файл: остановка по Ctrl+C позволяет пролистать историю, повторное F возвращает слежение. Клавиши, помеченные *, можно предварять числом N, оно меняет их поведение. Большинство ключей командной строки можно переключить и внутри less клавишей - (короткий) или -- (длинный).

В таблице ниже сначала идут ключи командной строки, затем клавиши внутри программы. Строки, относящиеся к работе внутри less, помечены словом «внутри».

Флаг

Что делает

-?, --help

Показать справку

-a, --search-skip-screen

Поиск пропускает текущий экран

-A, --SEARCH-SKIP-SCREEN

Поиск начинается сразу после целевой строки

-b [N], --buffers=[N]

Количество буферов

-B, --auto-buffers

Не выделять буферы автоматически для каналов

-c, --clear-screen

Перерисовывать экран очисткой, а не прокруткой

-d, --dumb

Режим «глупого» терминала

-D xцвет, --color=xцвет

Задать цвета экрана

-e, -E, --quit-at-eof, --QUIT-AT-EOF

Выходить при достижении конца файла

-f, --force

Открывать и не обычные файлы

-F, --quit-if-one-screen

Выйти, если файл целиком помещается на первый экран

-g, --hilite-search

Подсвечивать только последнее найденное

-G, --HILITE-SEARCH

Не подсвечивать найденное вообще

-h [N], --max-back-scroll=[N]

Предел прокрутки назад

-i, --ignore-case

Игнорировать регистр в поиске, если в шаблоне нет заглавных

-I, --IGNORE-CASE

Игнорировать регистр в любом поиске

-j [N], --jump-target=[N]

Позиция найденной строки на экране

-J, --status-column

Показывать колонку состояния слева

-k [файл], --lesskey-file=[файл]

Использовать файл lesskey

-K, --quit-on-intr

Выходить из less по Ctrl+C

-L, --no-lessopen

Игнорировать переменную окружения LESSOPEN

-m, -M, --long-prompt, --LONG-PROMPT

Стиль подсказки внизу экрана

-n, -N, --line-numbers, --LINE-NUMBERS

Не использовать номера строк (-n) или показывать их (-N)

-o [файл], --log-file=[файл]

Копировать ввод в файл (только для стандартного ввода)

-O [файл], --LOG-FILE=[файл]

То же, но существующий файл перезаписывается без вопросов

-p [шаблон], --pattern=[шаблон]

Начать с первого совпадения с шаблоном

-P [строка], --prompt=[строка]

Задать собственную подсказку

-q, -Q, --quiet, --QUIET, --silent, --SILENT

Отключить звуковой сигнал терминала

-r, -R, --raw-control-chars, --RAW-CONTROL-CHARS

Выводить управляющие символы как есть. Нужен для цветного вывода

-s, --squeeze-blank-lines

Сжимать несколько пустых строк в одну

-S, --chop-long-lines

Обрезать длинные строки, а не переносить

-t [тег], --tag=[тег]

Найти тег

-T [файл], --tag-file=[файл]

Использовать другой файл тегов

-u, -U, --underline-special, --UNDERLINE-SPECIAL

Изменить обработку backspace

-V, --version

Показать версию

-w, --hilite-unread

Подсвечивать первую новую строку после прокрутки экрана вперёд

-W, --HILITE-UNREAD

Подсвечивать первую новую строку после любого движения вперёд

-x [N[,...]], --tabs=[N[,...]]

Задать позиции табуляции

-X, --no-init

Не использовать строки инициализации и деинициализации termcap (экран не очищается при выходе)

-y [N], --max-forw-scroll=[N]

Предел прокрутки вперёд

-z [N], --window=[N]

Размер окна

-" [c[c]], --quotes=[c[c]]

Символы кавычек оболочки

-~, --tilde

Не показывать тильды после конца файла

-# [N], --shift=[N]

Шаг горизонтальной прокрутки (0 — пол-ширины экрана)

--file-size

Автоматически определять размер входного файла

--follow-name

Команда F переключается на новый файл, если входной файл переименовали

--incsearch

Искать по мере ввода каждого символа шаблона

--line-num-width=N

Ширина поля номера строки в -N в символах

--mouse

Включить ввод мышью

--no-keypad

Не посылать строки инициализации и деинициализации клавиатуры termcap

--no-histdups

Убрать повторы из истории команд

--rscroll=C

Символ, которым помечаются обрезанные строки

--save-marks

Сохранять закладки между запусками

--status-col-width=N

Ширина колонки состояния -J в символах

--use-backslash

Следующие ключи используют обратную косую черту как экранирующий символ

--use-color

Включить цветной текст

--wheel-lines=N

На сколько строк прокручивать за один щелчок колеса мыши

h, H (внутри)

Показать справку

q, :q, Q, :Q, ZZ (внутри)

Выйти

e, ^E, j, ^N, Enter * (внутри)

На строку вперёд (или на N строк)

y, ^Y, k, ^K, ^P * (внутри)

На строку назад (или на N строк)

f, ^F, ^V, Space * (внутри)

На окно вперёд (или на N строк)

b, ^B, ESC-v * (внутри)

На окно назад (или на N строк)

z * (внутри)

На окно вперёд и задать размер окна N

w * (внутри)

На окно назад и задать размер окна N

ESC-Space * (внутри)

На окно вперёд, не останавливаясь на конце файла

d, ^D * (внутри)

На полокна вперёд (и задать размер полокна N)

u, ^U * (внутри)

На полокна назад (и задать размер полокна N)

ESC-), → * (внутри)

Вправо на пол-ширины экрана (или на N позиций)

ESC-(, ← * (внутри)

Влево на пол-ширины экрана (или на N позиций)

ESC-}, ^→ (внутри)

Вправо до последнего показанного столбца

ESC-{, ^← (внутри)

Влево до первого столбца

F (внутри)

Следить вперёд бесконечно, как tail -f

ESC-F (внутри)

Как F, но остановиться, когда найден шаблон поиска

r, ^R, ^L (внутри)

Перерисовать экран

R (внутри)

Перерисовать экран, отбросив буферизованный ввод

/шаблон * (внутри)

Искать вперёд N-ю подходящую строку

?шаблон * (внутри)

Искать назад N-ю подходящую строку

n * (внутри)

Повторить предыдущий поиск (N-е вхождение)

N * (внутри)

Повторить предыдущий поиск в обратном направлении

ESC-n * (внутри)

Повторить предыдущий поиск, переходя между файлами

ESC-N * (внутри)

Повторить предыдущий поиск в обратном направлении между файлами

ESC-u (внутри)

Включить или выключить подсветку найденного

ESC-U (внутри)

Снять подсветку найденного

&шаблон * (внутри)

Показать только подходящие строки. Вернуть всё: & и Enter

^N или ! в начале шаблона (внутри)

Искать строки, которые не подходят

^E или * в начале шаблона (внутри)

Искать по нескольким файлам, переходя через конец файла

^F или @ в начале шаблона (внутри)

Начать поиск с первого файла (для /) или с последнего (для ?)

^K в начале шаблона (внутри)

Подсветить совпадения, но не перемещаться

^R в начале шаблона (внутри)

Не использовать регулярные выражения

^W в начале шаблона (внутри)

Зациклить поиск, если совпадений не нашлось

g, <, ESC-< * (внутри)

В первую строку файла (или в строку N)

G, >, ESC-> * (внутри)

В последнюю строку файла (или в строку N)

p, % * (внутри)

В начало файла (или на N процентов вглубь файла)

t * (внутри)

К следующему тегу (N-му)

T * (внутри)

К предыдущему тегу (N-му)

{, (, [ * (внутри)

Найти закрывающую скобку }, ), ] для N-й открывающей в верхней строке

}, ), ] * (внутри)

Найти открывающую скобку {, (, [ для N-й закрывающей в нижней строке

ESC-^F c1 c2 * (внутри)

Найти закрывающую скобку c2 для открывающей c1

ESC-^B c1 c2 * (внутри)

Найти открывающую скобку c1 для закрывающей c2

m и буква (внутри)

Поставить закладку на верхнюю строку. Закладкой может быть любая буква

M и буква (внутри)

Поставить закладку на нижнюю строку

' и буква (внутри)

Перейти к закладке. Заранее определены ^ (начало файла) и $ (конец файла)

'' (внутри)

Вернуться на предыдущую позицию

^X^X (внутри)

То же, что '

ESC-M и буква (внутри)

Снять закладку

:e [файл], ^X^V (внутри)

Открыть другой файл

:n * (внутри)

Следующий файл из командной строки (N-й)

:p * (внутри)

Предыдущий файл из командной строки (N-й)

:x * (внутри)

Первый файл из командной строки (или N-й)

:d (внутри)

Убрать текущий файл из списка командной строки

=, ^G, :f (внутри)

Показать имя текущего файла

-флаг (внутри)

Переключить ключ командной строки

--имя (внутри)

Переключить ключ командной строки по длинному имени

_флаг (внутри)

Показать значение ключа

__имя (внутри)

Показать значение ключа по длинному имени

+команда

Выполнять команду less при каждом открытии нового файла (в командной строке: less +F файл)

!команда (внутри)

Выполнить команду в оболочке $SHELL

|Xкоманда (внутри)

Передать участок файла между текущей позицией и закладкой X в команду оболочки

s файл (внутри)

Сохранить ввод в файл

v (внутри)

Открыть текущий файл в $VISUAL или $EDITOR

V (внутри)

Показать версию less

→, ESC-l (строка команд)

Курсор на символ вправо

←, ESC-h (строка команд)

Курсор на символ влево

Ctrl+→, ESC-→, ESC-w (строка команд)

Курсор на слово вправо

Ctrl+←, ESC-←, ESC-b (строка команд)

Курсор на слово влево

Home, ESC-0 (строка команд)

Курсор в начало строки

End, ESC-$ (строка команд)

Курсор в конец строки

Backspace (строка команд)

Удалить символ слева от курсора

Delete, ESC-x (строка команд)

Удалить символ под курсором

Ctrl+Backspace, ESC-Backspace (строка команд)

Удалить слово слева от курсора

Ctrl+Delete, ESC-Delete, ESC-X (строка команд)

Удалить слово под курсором

Ctrl+U (строка команд)

Удалить всю строку

↑, ESC-k (строка команд)

Предыдущая введённая команда

↓, ESC-j (строка команд)

Следующая введённая команда

Tab (строка команд)

Дополнить имя файла и перебирать варианты

Shift+Tab, ESC-Tab (строка команд)

Дополнить имя файла и перебирать в обратном порядке

Ctrl+L (строка команд)

Дополнить имя файла и показать все варианты

Окно по умолчанию равно высоте экрана, полокна — половине высоты. Строка команд — это строка внизу экрана, которую вы вводите, например, при поиске.

grep

grep ищет строки по шаблону. Он работает с текстовыми файлами и с выводом других команд через конвейер. Для логов это основной инструмент поиска: найти все неудачные входы, все строки одной службы, посчитать количество ошибок.

Общий вид: grep [ключи] ШАБЛОНЫ [ФАЙЛ...]. Шаблонов можно указать несколько, разделяя их переводом строки. Если файл указан как -, читается стандартный ввод. Если файл не указан, читается текущий каталог при -r и стандартный ввод в остальных случаях. Код завершения: 0, если что-то найдено, 1, если ничего не совпало, 2 при ошибках (если не задан -q).

Флаг

Что делает

-E, --extended-regexp

Шаблоны — расширенные регулярные выражения

-F, --fixed-regexp

Шаблоны — обычные строки, без регулярных выражений

-G, --basic-regexp

Шаблоны — простые регулярные выражения (режим по умолчанию)

-P, --perl-regexp

Шаблоны — регулярные выражения Perl

-e, --regexp=ШАБЛОНЫ

Использовать указанные шаблоны для поиска

-f, --file=ФАЙЛ

Брать шаблоны из файла

-i, --ignore-case

Игнорировать регистр

--no-ignore-case

Учитывать регистр (режим по умолчанию)

-w, --word-regexp

Совпадение только с целым словом

-x, --line-regexp

Совпадение только с целой строкой

-z, --null-data

Строки разделяются нулевым байтом, а не символом конца строки

-s, --no-messages

Не показывать сообщения об ошибках

-v, --invert-match

Выбирать строки, которые не подходят

-V, --version

Показать версию

--help

Показать справку

-m, --max-count=ЧИСЛО

Остановиться после указанного числа совпавших строк

-b, --byte-offset

Печатать смещение в байтах вместе со строкой

-n, --line-number

Печатать номер строки вместе со строкой

--line-buffered

Сбрасывать буфер после каждой строки. Нужен в конвейерах со слежением, иначе вывод приходит с задержкой

-H, --with-filename

Печатать имя файла для каждой строки

-h, --no-filename

Не печатать имя файла

--label=МЕТКА

Использовать метку в качестве имени файла для стандартного ввода

-o, --only-matching

Показывать только совпавшие непустые части строк

-q, --quiet, --silent

Подавить весь обычный вывод

--binary-files=ТИП

Как считать бинарный файл: binary, text или without-match

-a, --text

То же, что --binary-files=text

-I

То же, что --binary-files=without-match

-d, --directories=ДЕЙСТВИЕ

Как обрабатывать каталоги: read, recurse или skip

-D, --devices=ДЕЙСТВИЕ

Как обрабатывать устройства, FIFO и сокеты: read или skip

-r, --recursive

То же, что --directories=recurse

-R, --dereference-recursive

То же, но с переходом по всем символьным ссылкам

--include=МАСКА

Обрабатывать только файлы, подходящие под маску

--exclude=МАСКА

Пропускать файлы, подходящие под маску

--exclude-from=ФАЙЛ

Пропускать файлы, подходящие под маски из файла

--exclude-dir=МАСКА

Пропускать каталоги, подходящие под маску

-L, --files-without-match

Печатать только имена файлов без выбранных строк

-l, --files-with-matches

Печатать только имена файлов с выбранными строками

-c, --count

Печатать только количество выбранных строк на файл

-T, --initial-tab

Выравнивать табуляцией, если нужно

-Z, --null

Печатать нулевой байт после имени файла

-B, --before-context=ЧИСЛО

Напечатать указанное число строк перед совпадением

-A, --after-context=ЧИСЛО

Напечатать указанное число строк после совпадения

-C, --context[=ЧИСЛО]

Напечатать указанное число строк вокруг совпадения

-ЧИСЛО

То же, что --context=ЧИСЛО

--group-separator=SEP

Печатать SEP в строке между группами совпадений с контекстом

--no-group-separator

Не печатать разделитель между группами

--color[=КОГДА], --colour[=КОГДА]

Подсвечивать совпавшие строки: always, never или auto

-U, --binary

Не удалять символы CR в конце строки (MS-DOS и Windows)

zgrep

zgrep — это grep, который умеет читать сжатые gzip-файлы. Из-за ротации логи недельной давности лежат в syslog.2.gz, auth.log.3.gz и так далее, и обычный grep по ним ничего не найдёт. zgrep распаковывает их на лету и ищет внутри, а обычные несжатые файлы читает как grep. Поэтому одна команда по маске (/var/log/syslog*) охватывает и текущий лог, и все архивные.

Общий вид: zgrep [ключи] [-e] ШАБЛОН [ФАЙЛ...]. Порядок файлов при маске лексикографический, а не по времени: syslog.1, syslog.10.gz, syslog.2.gz. Для сжатия другими алгоритмами есть bzgrep (.bz2), xzgrep (.xz) и zstdgrep (.zst).

Ключи те же, что у grep (таблица выше). Не поддерживаются:

Флаг

Что делает в grep

-R, --dereference-recursive

Рекурсивный поиск с переходом по символьным ссылкам

-r, --recursive

Рекурсивный поиск

-d, --directories

Действие над каталогами

--include

Обрабатывать только файлы, подходящие под маску

--exclude

Пропускать файлы, подходящие под маску

--exclude-from

Пропускать файлы по маскам из файла

--exclude-dir

Пропускать каталоги, подходящие под маску

-Z, --null

Печатать нулевой байт после имени файла

-z, --null-data

Строки разделяются нулевым байтом

Из-за этого zgrep -r по каталогу не работает: файлы нужно перечислять явно или задавать маской оболочки.

Журналы входов: last, lastb, lastlog

Журналы входов в систему бинарные, и читать их можно только специальными командами, а не grep или less. last читает /var/log/wtmp: историю входов, выходов, перезагрузок и выключений. lastb читает /var/log/btmp: неудачные попытки входа. lastlog читает /var/log/lastlog: время последнего входа каждого пользователя. Исходные записи в текстовом виде показывает utmpdump, например sudo utmpdump /var/log/wtmp. last и lastlog работают без sudo, а lastb нужен sudo, потому что btmp закрыт для всех, кроме root и группы utmp.

Общий вид: last [ключи] [имя_пользователя...] [tty...], у lastb то же самое, у lastlog просто lastlog [ключи]. Ключи last и lastb одинаковые, отличается только файл по умолчанию: /var/log/wtmp у last и /var/log/btmp у lastb.

Команда

Ключ

Что делает

last, lastb

-ЧИСЛО

Сколько строк вывести

last, lastb

-a или --hostlast

Имя хоста в последней колонке

last, lastb

-d или --dns

Перевести IP-адрес обратно в имя хоста

last, lastb

-f или --file ФАЙЛ

Взять указанный файл вместо /var/log/wtmp (у lastb вместо /var/log/btmp)

last, lastb

-F или --fulltimes

Полное время и дата входа и выхода

last, lastb

-i или --ip

IP-адреса в виде «числа и точки»

last, lastb

-n или --limit ЧИСЛО

Сколько строк вывести

last, lastb

-R или --nohostname

Не выводить поле с именем хоста

last, lastb

-s или --since ВРЕМЯ

Строки начиная с указанного времени

last, lastb

-t или --until ВРЕМЯ

Строки до указанного времени

last, lastb

-p или --present ВРЕМЯ

Кто был в системе в указанное время

last, lastb

-w или --fullnames

Полные имена пользователя и домена

last, lastb

-x или --system

Добавить записи о выключениях системы и смене уровня запуска

last, lastb

--time-format ФОРМАТ

Формат меток времени: notime, short, full, iso

last, lastb

-h или --help

Справка

last, lastb

-V или --version

Версия

lastlog

-b или --before ДНЕЙ

Записи старше указанного числа дней

lastlog

-C или --clear

Очистить запись lastlog пользователя. Только вместе с -u

lastlog

-h или --help

Справка

lastlog

-R или --root КАТАЛОГ

Каталог, в который выполняется chroot

lastlog

-S или --set

Записать в lastlog пользователя текущее время. Только вместе с -u

lastlog

-t или --time ДНЕЙ

Записи за последние указанные дни

lastlog

-u или --user ИМЯ

Запись только для этой учётной записи

Что чаще всего используется для разбора проблем

Вообще на практике многие ключи и флаги вы можете не встретить или не использовать, но гарантированно возникнет ситуация, когда вам понадобится сделать следующее:

  • вывести лог целиком до и после запуска N-го сервиса (например, чтобы посмотреть, что происходит при его запуске);

  • вывести последние, условно, 50 строк, чтобы посмотреть причину падения сервиса;

  • вывести только строки с нужным словом (например, со статусом err или warn и т.п.);

  • проверить на нехватку памяти (чтобы посмотреть, например, сработал ли OOM killer);

  • вывести логи полностью и т.п.

Попробуйте самостоятельно составить такие команды, если у вас развёрнут Docker или какой-нибудь другой сервис/служба. (Ну так, чисто для практики :) ) Если справились, то вы большой молодец!)

Заключение

В статье мы разобрали базовые утилиты для работы с логами и то, на чём они держатся: где лежат логи, чем текстовые отличаются от бинарных, что такое уровни важности, ротация и постоянный журнал journald. Для одного сервера или homelab этого набора хватает. Но бывают случаи потяжелее. Например, нужно сопоставить по времени сразу несколько логов разных служб, разобраться в файлах с разными форматами или перекопать гигабайты записей. Тут даже эти утилиты начинают мешать: вы гоняете один и тот же grep по десятку файлов и сшиваете результат руками. В таких ситуациях подключают инструменты вроде lnav: он сам разбирает форматы логов, склеивает несколько файлов в одну ленту по времени и читает сжатые архивы напрямую. Это уже тема для отдельной статьи.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.