Log File Navigator (lnav) - это расширенный просмотрщик файлов журнала для консоли.
Глава один Вступление
Log File Navigator, lnav, представляет собой расширенный просмотрщик файлов журналов для терминала. Он предоставляет простой в использовании интерфейс для мониторинга и анализа файлов журналов практически без настройки. Просто откройте в lnav свои файлы журналов, и он автоматически определит Форматы журналов, проиндексирует их содержимое и отобразит комбинированное представление всех сообщений журналов. Вы можете перемещаться по журналам с помощью различных горячих клавиш. Команды дают вам дополнительный контроль над поведением lnav для таких вещей, как применение фильтров, тегирование сообщений и многое другое. Затем вы можете анализировать сообщения журнала с помощью интерфейса SQLite.
1.1 Зависимости
При компиляции из исходников требуются следующие зависимости:
Проверьте страницу загрузок, чтобы узнать, есть ли пакеты для вашей операционной системы. Для компиляции из исходного кода используйте следующие команды:
$ ./configure
$ make
$ sudo make install
1.3 Просмотр журналов
Аргументы для lnav - это файлы журналов, каталоги или URL-адреса для просмотра. Например, чтобы просмотреть все журналы CUPS в вашей системе:
$ lnav /var/log/cups
Форматы журналов определяются автоматически и индексируются на лету. См. раздел Форматы журналов для получения списка предопределенных форматов и того, как определить свои собственные.
Если аргументы не указаны, lnav попытается открыть файл системного журнала в вашей системе:
$ lnav
1.4 Настройка
После запуска lnav вы можете захотеть установить параметры конфигурации, упомянутые ниже. Конфигурация в lnav выполняется с помощью команды :config. Чтобы изменить параметр конфигурации, начните с нажатия : для входа в командную строку. Затем введите config, а затем имя и значение параметра.
Примечание: Для этих параметров конфигурации, а в некоторых случаях и для их значений, доступно дополнение табуляцией.
1.4.1 Раскладка клавиатуры
Раскладка клавиатуры определяет соответствие горячих клавиш командам для выполнения. Сопоставление по умолчанию предназначено для клавиатур US. Для изменения раскладки клавиатуры можно использовать следующую команду:
Чтобы создать или настроить тему, обратитесь к разделу Определения тем.
1.4.3 Форматы журналов
Чтобы lnav мог понять ваши файлы журналов, ему необходимо знать, как анализировать сообщения журнала, используя определение формата журнала. Существует множество встроенных форматов журналов, и lnav автоматически определит оптимальный формат для использования. В случае, если ваш файл журнала не распознан, обратитесь к разделу Форматы журналов для получения информации о том, как создать формат.
Глава вторая Использование
В этой главе содержится обзор использования lnav.
2.1 Основные элементы управления
Как и в большинстве программ просмотра файлов, прокрутка файлов может выполняться с помощью обычных горячих клавиш. Для нетривиальных операций вы можете войти в режим командной строки, нажав :. Чтобы проанализировать данные в файле журнала, вы можете ввести запрос SQL, нажав ;.
Совет: Проверьте правый нижний угол экрана на наличие подсказок по горячим клавишам, которые могут быть полезны в текущем контексте.
Рис. 1. При первом открытии lnav предлагается использовать e и Shift+e для перехода к сообщениям об ошибках.
2.2 Просмотр файлов
Файлы для просмотра в lnav можно указать в командной строке или передать команде :open. Для отслеживания файлов с общим именем может быть задан шаблон поиска. Если путь - это каталог, все файлы в каталоге будут открыты, и каталог будет отслеживаться на предмет добавления или удаления файлов из представления. Если путь - это архив или сжатый файл (а lnav был создан с помощью libarchive), архив будет извлечен во временное расположение и файлы внутри будут загружены. Найденные файлы будут просканированы для определения их формата. Файлы, соответствующие формату журнала, будут отсортированы по времени и отображены в представлении журнала. Неформатированные текстовые файлы можно просмотреть в текстовом представлении, доступ к которому можно получить нажав t.
2.2.1 Поддержка архивов
Если lnav скомпилирован с помощью libarchive, любые открываемые файлы будут проверены на предмет того, являются ли они поддерживаемым типом архива. В этом случае содержимое архива будет извлечено в каталог $TMPDIR/lnav-user-${UID}-work/archives/. После извлечения файлы внутри будут загружены в lnav. Чтобы ускорить открытие большого количества файлов, любой файл, отвечающий следующим условиям, будет автоматически скрыт и не проиндексирован:
Двоичные файлы
Неформатированные текстовые файлы размером более 128kb
Дубликаты файлов журналов
Распакованные файлы останутся во временном каталоге после выхода из lnav, так что повторное открытие того же архива будет быстрее. Распакованные архивы, к которым не обращались в течение последних двух дней, будут автоматически удалены при следующем запуске lnav.
2.2.2 Файлы на удаленных хостах
Файлы на удаленных машинах можно просматривать и отслеживать, если у вас есть доступ к машинам через SSH. Во-первых, убедитесь, что вы можете подключиться к удаленному компьютеру по SSH без какого-либо взаимодействия: 1) приняв ключ хоста как известный и 2) скопировав ваш открытый ключ в файл .ssh/authorized_keys на удаленном компьютере. После завершения настройки вы можете открыть файл на удаленном хосте, используя тот же синтаксис, что и scp(1), где указываются имя пользователя и хост, за которыми следует двоеточие, а затем путь к файлам, например:
[user@]host:/path/to/logs
Например, чтобы открыть /var/log/syslog.log на «host1.example.com» от имени пользователя «dean», вы должны ввести:
Файлы на удаленных хостах также можно открыть с помощью команды :open. Открытие удаленного файла в TUI имеет то преимущество, что путь к файлу может быть заполнен клавишей TAB и отображается предварительный просмотр первых нескольких строк файла.
Примечание: Если lnav устанавливается из snap, вам необходимо подключить его к ssh-keys plug, используя следующую команду:
$ sudo snap connect lnav:ssh-keys
Примечание: Удаленный доступ к файлам реализуется путем передачи αcτµαlly pδrταblε εxεcµταblε адресату и его вызова. Бинарный файл APE может работать практически на любой машине x86_64 и ОС (например, MacOS, Linux, FreeBSD, Windows). Бинарный файл встроен в сам исполняемый файл lnav, поэтому на удаленном компьютере не требуется дополнительных настроек.
2.3 Поиск
Любые сообщения журнала, загружаемые в lnav, индексируются по времени и уровню журнала (например, error, warning), чтобы сделать поиск быстрым и легким с помощью горячих клавиш. Например, нажатие e приведет к переходу к следующей ошибке в файле, а нажатие Shift+e приведет к переходу к предыдущей ошибке. Поиск в неформатированном тексте можно выполнить, нажав / для входа в строку поиска. В приглашение можно ввести регулярное выражение, чтобы начать поиск в текущем представлении.
2.4 Фильтрация
Чтобы уменьшить количество шума в файле журнала, lnav может скрывать сообщения журнала, соответствующие определенным критериям. Следующие подразделы объясняют, как это сделать.
2.4.1 Соответствие регулярному выражению
Если есть сообщения журнала, которые вас не интересуют, вы можете выполнить «фильтрацию» (filter out), чтобы скрыть сообщения, соответствующие шаблону. Фильтр можно создать с помощью интерактивного редактора, команды :filter-out или путем выполнения INSERT для таблицы lnav_view_filters.
2.4.2 Выражение SQLite
Сложную фильтрацию можно выполнить, передав выражения SQLite команде :filter-expr. Выражение будет выполняться для каждого сообщения журнала, и если оно вернет истину, строка будет показана в представлении журнала.
2.4.3 Время
Чтобы ограничить сообщения журнала заданным временным интервалом, можно использовать команды :hide-lines-before и :hide-lines-after, чтобы указать начало и конец временного интервала.
2.4.4 Уровень журнала
Чтобы скрыть сообщения ниже определенного уровня журнала, вы можете использовать :set-min-log-level.
2.5 Таблицы поиска
TBD
2.6 Ведение заметок
Некоторые столбцы в таблицах журнала можно обновлять построчно, чтобы вы могли делать заметки. Большинство столбцов в таблице журнала доступны только для чтения, поскольку они поддерживаются самими файлами журнала. Однако с помощью оператора UPDATE можно изменить следующие столбцы:
log_part - «Раздел», которому принадлежит сообщение журнала. Этот столбец также можно изменить с помощью команды :partition-name.
log_mark - указывает, добавлена ли строка в закладки.
log_comment - текстовое поле произвольной формы для хранения комментария. Этот столбец также можно изменить с помощью команды :comment.
log_tags - список тегов JSON, связанных с сообщением журнала. Этот столбец также можно изменить с помощью команды :tag.
Хотя эти столбцы можно обновлять другими способами, использование интерфейса SQL позволяет вносить изменения автоматически и массово. Например, чтобы добавить в закладки все строки с текстом «something interesting» в теле сообщения журнала, вы можете выполнить:
;UPDATE all_logs SET log_mark = 1 WHERE log_body LIKE '%something interesting%'
В качестве более сложного примера возможностей виртуальных таблиц SQL и lnav мы помечаем сообщения журнала, в которых изменился IP-адрес, связанный с dhclient. Например, если dhclient сначала сообщает «bound to 10.0.0.1», а затем сообщает «bound to 10.0.0.2», мы хотим пометить только те сообщения, IP-адрес которых отличался от предыдущего сообщения. Хотя это можно сделать с помощью одного оператора SQL[1], в этом примере мы разделим все на несколько шагов. Сначала мы воспользуемся командой :create-search-table, чтобы сопоставить сообщение dhclient и извлечь IP-адрес:
:create-search-table dhclient_ip bound to (?<ip>[^ ]+)
Приведенная выше команда создаст новую таблицу с именем dhclient_ip со стандартными столбцами журнала и столбцом ip, содержащим IP-адрес. Затем мы создадим представление таблицы dhclient_ip, которое возвращает номер строки сообщения журнала, IP-адрес из текущей строки и IP-адрес из предыдущей строки:
;CREATE VIEW IF NOT EXISTS dhclient_ip_changes AS SELECT log_line, ip, lag(ip) OVER (ORDER BY log_line) AS prev_ip FROM dhclient_ip
Наконец, следующий оператор UPDATE присоединит тег «#ipchanged» к столбцу log_tags для любых строк в представлении, где текущий IP-адрес отличается от предыдущего IP-адреса:
;UPDATE syslog_log SET log_tags = json_concat(log_tags, '#ipchanged') WHERE log_line IN (SELECT log_line FROM dhclient_ip_changes WHERE ip != prev_ip)
Поскольку приведенное выше строки могут быть слишком длинными для интерактивного ввода, вы можете поместить эти команды в скрипт и выполнить этот сценарий с помощью горячей клавиши |.
Выражение regexp_match('bound to ([^ ]+)', log_body) as ip может использоваться для извлечения IP-адреса из тела сообщения журнала.
Глава третья Cookbook
В этой главе содержатся рецепты для общих задач, которые могут быть выполнены в lnav. Эти рецепты можно использовать в качестве отправной точки для ваших собственных нужд после некоторой адаптации.
3.1 Форматы журналов
TBD
3.1.1 Определение нового формата
TBD
3.2 Аннотирование журналов
Журналы сообщений можно аннотировать несколькими способами в lnav, чтобы помочь вам организовать работу.
3.2.1 Создание разделов для загрузки Linux
При копании в журналах, которые можно разбить на несколько разделов, можно использовать функцию разделенияlnav, чтобы отслеживать, в каком разделе вы находитесь. Например, если коллекция журналов Linux охватывает несколько загрузок, следующий сценарий может использоваться для создания разделов для каждой загрузки. После того, как имя раздела будет установлено для сообщений журнала, текущее имя будет отображаться в верхней строке состояния рядом с текущим временем.
Листинг 1: partition-by-boot.lnav
#
# DO NOT EDIT THIS FILE, IT WILL BE OVERWRITTEN!
#
# @synopsis: partition-by-boot
# @description: Partition the log view based on boot messages from the Linux kernel.
#
;UPDATE syslog_log
SET log_part = 'Boot: ' || log_time
WHERE log_text LIKE '%kernel:%Linux version%';
;SELECT 'Created ' || changes() || ' partitions(s)';
3.2.2 Добавление тегов к сообщениям журнала SSH
Сообщения журнала могут быть помечены тегами интерактивно с помощью команды :tag или программно с использованием интерфейса SQLite. В этом примере используется сценарий для поиска интересных сообщений SSH и автоматически добавляется соответствующий тег.
Листинг 2: tag-ssh-msgs.lnav
#
# @synopsis: tag-ssh-msgs
# @description: Tag interesting SSH log messages
#
;UPDATE all_logs
SET log_tags = json_concat(log_tags, '#ssh.invalid-user')
WHERE log_text LIKE '%Invalid user from%'
;SELECT 'Tagged ' || changes() || ' messages';
3.3 Анализ журнала
Большая часть анализа журналов в lnav выполняется через интерфейс SQLite. Следующие примеры должны дать вам некоторые идеи, чтобы начать использовать эту функциональность. Следует иметь в виду, что если запрос становится слишком большим или требуется выполнить несколько операторов, вы можете создать сценарий .lnav, содержащий эти операторы, и выполнить его в командной строке с помощью |.
3.3.1 Подсчет IP-адресов клиентов в журналах веб-доступа
Чтобы подсчитать количество вхождений IP-адреса в журналы веб-доступа и упорядочить результаты от наибольшего к наименьшему:
;SELECT c_ip, count(*) as hits FROM access_log GROUP BY c_ip ORDER BY hits DESC
3.3.2 Показывать только строки, в которых числовое поле находится в диапазоне
Команду :filter-expr можно использовать для фильтрации журналов веб-доступа, чтобы отображались только строки, в которых количество байтов, переданных клиенту, составляет от 10 000 до 40 000 байт, например:
:filter-expr :sc_bytes BETWEEN 10000 AND 40000
3.3.3 Создание отчета
Отчеты могут быть созданы путем написания скриптаlnav, который использует запросы и команды SQL для форматирования документа. Базовый сценарий может просто выполнить SQL-запрос, отображаемый в представлении БД. Более сложные сценарии могут использовать следующие команды для создания настраиваемого вывода для отчета:
Команда :echo для написания неформатированного текста
#
# @synopsis: report-demo [<output-path>]
# @description: Generate a report for requests in access_log files
#
# Figure out the file path where the report should be written to, default is
# stdout
;SELECT CASE
WHEN $1 IS NULL THEN '-'
ELSE $1
END AS out_path
# Redirect output from commands to $out_path
:redirect-to $out_path
# Print an introductory message
;SELECT printf('\n%d total requests', count(1)) AS msg FROM access_log
:echo $msg
;WITH top_paths AS (
SELECT
cs_uri_stem,
count(1) AS total_hits,
sum(sc_bytes) as bytes,
count(distinct c_ip) as visitors
FROM access_log
WHERE sc_status BETWEEN 200 AND 300
GROUP BY cs_uri_stem
ORDER BY total_hits DESC
LIMIT 50),
weekly_hits_with_gaps AS (
SELECT timeslice(log_time_msecs, '1w') AS week,
cs_uri_stem,
count(1) AS weekly_hits
FROM access_log
WHERE cs_uri_stem IN (SELECT cs_uri_stem FROM top_paths) AND
sc_status BETWEEN 200 AND 300
GROUP BY week, cs_uri_stem),
all_weeks AS (
SELECT week
FROM weekly_hits_with_gaps
GROUP BY week
ORDER BY week ASC),
weekly_hits AS (
SELECT all_weeks.week,
top_paths.cs_uri_stem,
ifnull(weekly_hits, 0) AS hits
FROM all_weeks
CROSS JOIN top_paths
LEFT JOIN weekly_hits_with_gaps
ON all_weeks.week = weekly_hits_with_gaps.week AND
top_paths.cs_uri_stem = weekly_hits_with_gaps.cs_uri_stem)
SELECT weekly_hits.cs_uri_stem AS Path,
printf('%,9d', total_hits) AS Hits,
printf('%,9d', visitors) AS Visitors,
printf('%9s', humanize_file_size(bytes)) as Amount,
sparkline(hits) AS Weeks
FROM weekly_hits
LEFT JOIN top_paths ON top_paths.cs_uri_stem = weekly_hits.cs_uri_stem
GROUP BY weekly_hits.cs_uri_stem
ORDER BY Hits DESC
LIMIT 10
:write-table-to -
:echo
:echo Failed Requests
:echo
;SELECT printf('%,9d', count(1)) AS Hits,
printf('%,9d', count(distinct c_ip)) AS Visitors,
sc_status AS Status,
cs_method AS Method,
group_concat(distinct cs_version) AS Versions,
cs_uri_stem AS Path,
replicate('|', (cast(count(1) AS REAL) / $total_requests) * 100.0) AS "% of Requests"
FROM access_log
WHERE sc_status >= 400
GROUP BY cs_method, cs_uri_stem
ORDER BY Hits DESC
LIMIT 10
:write-table-to -
Глава четвертая Как это работает
4.1 Внутренняя архитектура
Файл ARCHITECTURE.md в дереве исходных текстов содержит некоторую информацию о внутреннем устройстве lnav.
Глава пятая Конфигурация
Конфигурация для lnav хранится в следующих файлах JSON в ~/.lnav:
config.json - содержит локальные настройки, которые выполняются с помощью команды :config.
configs/default/*.json - файлы конфигурации по умолчанию, встроенные в lnav, записываются в этот каталог с добавлением .sample. Удаление расширения .sample и редактирование файла позволит вам выполнить базовую настройку.
configs/installed/*.json - содержит файлы конфигурации, установленные с использованием флага -i (например, $ lnav -i /path/to/config.json).
configs/*/*.json - другие каталоги, содержащие файлы *.json, будут загружены при запуске. Эта структура удобна для установки конфигураций lnav, например, из репозитория git.
Допустимый файл конфигурации lnav должен содержать объект со свойством $schema, например:
Примечание: Определения формата журнала хранятся отдельно в файлах ~/.lnav/formats. См. главу Форматы журналов для получения дополнительной информации.
5.1 Опции
Следующие параметры конфигурации можно использовать для настройки lnav по своему вкусу. Параметры можно изменить с помощью команды :config.
5.1.1 /ui/keymap
Имя используемой раскладки клавиатуры
тип
string
5.1.2 /ui/theme
Имя используемой темы
тип
string
5.1.3 /ui/clock-format
Формат часов, отображаемых в верхнем левом углу с использованием преобразований strftime(3)
тип
string
пример
%a %b %d %H:%M:%S %Z
5.1.4 /ui/dim-text
Уменьшить яркость текста (полезно для xterms). Этот параметр может быть полезен при работе в xterm, где белый цвет очень яркий.
тип
boolean
5.1.5 /ui/default-colors
Использовать цвета фона и переднего плана терминала по умолчанию вместо черного и белого для всех цветов текста. Этот параметр может быть полезен при использовании прозрачного фона или терминала с альтернативной цветовой темой.
тип
boolean
5.2 Определения тем
Темы пользовательского интерфейса определены в файле конфигурации JSON. Тема состоит из определений стилей для разных типов текста в пользовательском интерфейсе. Определение может включать цвета переднего плана/фона и атрибуты шрифта жирного/подчеркивания. Определения стилей разбиты на несколько категорий в целях организации. Чтобы упростить написание определения, тема может определять переменные, на которые можно ссылаться как на значения цвета.
5.2.1 Переменные
Объект vars в определении темы содержит отображение имен переменных в значения цвета. На эти переменные можно ссылаться в определениях стилей, поставив перед ними знак доллара (например, $black). Следующие переменные также могут быть определены для управления значениями цветов ANSI, которые являются сообщениями журнала или неформатированным текстом:
Таблица 1: Цвета ANSI
Имя переменной
ANSI Escape
black
ESC[30m
red
ESC[31m
green
ESC[32m
yellow
ESC[33m
blue
ESC[34m
magenta
ESC[35m
cyan
ESC[36m
white
ESC[37m
5.2.2 Указание цветов
Цвета можно указать в шестнадцатеричной системе счисления, начав с хеша (например, #aabbcc) или используя название цвета, которое можно найти на http://jonasjacek.github.io/colors/. Если цвета для стиля не указаны, значения берутся из определения styles/text.
Примечание: При указании цветов в шестнадцатеричной системе счисления нет необходимости иметь точное совпадение в цветовой палитре XTerm 256. Наилучшее приближение будет выбрано на основе алгоритма цветопередачи CIEDE2000.
5.2.3 Пример
В следующем примере черный/фоновый цвет текста устанавливается в темно-серый с помощью переменной, а для переднего плана устанавливается не совсем белый цвет. Эта тема неполная, но она работает достаточно, чтобы дать вам представление о том, как определяется тема. Вы можете скопировать блок кода, сохранить его в файл в ~/.lnav/configs/installed/, а затем активировать его, выполнив :config /ui/theme example в lnav. Для более полного определения темы см. одно из определений, встроенных в lnav, например monocai.
Значение цвета переднего плана для этого стиля. Значением может быть имя цвета xterm, шестнадцатеричное значение или ссылка на переменную темы.
тип
string
примеры
#fff
Green
$black
background-color
/background-color
Значение цвета фона для этого стиля. Значением может быть имя цвета xterm, шестнадцатеричное значение или ссылка на переменную темы.
тип
string
примеры
#2d2a2e
Green
underline
/underline
Указывает, что текст должен быть подчеркнут.
тип
boolean
bold
/bold
Указывает, что текст должен быть выделен жирным шрифтом.
тип
boolean
additionalProperties
False
5.3 Определения раскладки клавиатуры
Раскладки в lnav сопоставляют последовательность клавиш выполняемой команде. Когда клавиша нажата, она преобразуется в закодированную в шестнадцатеричном формате строку, которая просматривается в раскладке клавиатуры. Затем выполняется значение command, связанное с записью в таблице клавиш. Обратите внимание, что «команда» может быть командойlnav, оператором/запросом SQL или скриптом lnav. Если значение alt-msg включено в запись, нижний правый раздел пользовательского интерфейса будет обновлен с помощью текста справки.
Примечание: В настоящее время не все функции доступны с помощью команд или SQL. Кроме того, некоторые горячие клавиши не реализованы через раскладки клавиатуры.
5.3.1 Кодирование последовательности клавиш
Нажатие клавиш преобразуется в строку с шестнадцатеричной кодировкой, которая используется для поиска записи в раскладке. Каждый байт значения нажатия клавиши форматируется как x, за которым следует шестнадцатеричное кодирование в нижнем регистре. Например, кодировка для ключа £ будет xc2xa3. Чтобы упростить определение кодировки неназначенных клавиш, lnav напечатает в командной строке команду :config и JSON-указатель для назначения команды клавише.
Рис. 1: Снимок экрана командной строки при нажатии неназначенной клавиши.
Примечание: Поскольку lnav является консольным приложением, он может принимать только нажатия клавиш, которые могут быть представлены как символы или escape-последовательности. Например, он не может обрабатывать нажатие клавиши-модификатора.
5.3.2 Справочник
ui/keymap-defs/<keymap_name>
Определения раскладок клавиатуры
тип
object
patternProperties
((?:x[0-9a-f]{2})+)
/ui/keymap-defs/<keymap_name>/<key_seq>
Карта кодов клавиш для выполнения команд. Имена полей - это ключи, которые должны быть сопоставлены с использованием шестнадцатеричного представления кодировки UTF-8. Каждый байт UTF-8 должен начинаться с буквы "x", за которой следует шестнадцатеричное представление байта.
тип
object
properties
command
/ui/keymap-defs/<keymap_name>/<key_seq>/command
Команда, выполняемая для заданной последовательности клавиш. Используйте скрипт для выполнения более сложных операций.
тип
string
примеры
:goto next hour
шаблон
[:|;].*
alt-msg
/ui/keymap-defs/<keymap_name>/<key_seq>/alt-msg
Сообщение справки, отображаемое после нажатия клавиши.
тип
string
additionalProperties
False
additionalProperties
False
5.4 Настройка
Следующие параметры конфигурации можно использовать для настройки внутреннего устройства lnav по своему вкусу. Параметры можно изменить с помощью команды :config.
5.4.1 /tuning/archive-manager
Настройки, связанные с открытием архивных файлов
тип
object
характеристики
min-free-space
/tuning/archive-manager/min-free-space
Минимальное свободное пространство в байтах для сохранения при распаковке архивов
тип
integer
minimum
0
cache-ttl
/tuning/archive-manager/cache-ttl
Время жизни для распакованных архивов, выраженное в виде продолжительности (например, 3d в течение трех дней)
тип
string
примеры
3d
12h
additionalProperties
False
5.4.2 /tuning/file-vtab
Настройки, связанные с виртуальной таблицей lnav_file
тип
object
характеристики
max-content-size
/tuning/file-vtab/max-content-size
Максимально допустимый размер файла для столбца содержимого
тип
integer
minimum
0
additionalProperties
False
5.4.3 /tuning/logfile
Настройки, связанные с файлами журналов
тип
object
характеристики
max-unrecognized-lines
/tuning/logfile/max-unrecognized-lines
Максимальное количество строк в файле, которое будет использоваться при определении формата
тип
integer
minimum
1
additionalProperties
False
5.4.4 /tuning/remote/ssh
Настройки, связанные с командой ssh, используемой для связи с удаленными машинами
тип
object
характеристики
command
/tuning/remote/ssh/command
Команда SSH для выполнения
тип
string
transfer-command
/tuning/remote/ssh/transfer-command
Команда, выполняемая на удаленном хосте при передаче файла
тип
string
start-command
/tuning/remote/ssh/start-command
Команда, выполняемая на удаленном хосте для запуска тайлера
тип
string
flags
/tuning/remote/ssh/flags
Флаги для передачи команде SSH
тип
string
options
/tuning/remote/ssh/options
Параметры для передачи в команду SSH
тип
object
patternProperties
(\w+)
/tuning/remote/ssh/options/<option_name>
Установка параметра, который будет передан команде SSH
тип
string
additionalProperties
False
config
/tuning/remote/ssh/config
Опции ssh_config для передачи в SSH с параметром -o
тип
object
patternProperties
(\w+)
/tuning/remote/ssh/config/<config_name>
Установка значения конфигурации SSH
тип
string
additionalProperties
False
additionalProperties
False
Глава шестая Интерфейс командной строки
При запуске lnav можно использовать следующие параметры. Флагов не так много, поскольку доступ к большинству функций осуществляется с помощью параметра -c для выполнения команд или SQL-запросов.
6.1 Опции
-h
Распечатать эти параметры командной строки и выйти.
-H
Запустить lnav и переключиться на просмотр справки.
-C
Сравнить указанные файлы с конфигурацией, сообщить об ошибках и выйти. Этот параметр может быть полезен для проверки правильности формата журнала.
-c <command>
Выполнить указанную команду lnav, запрос SQL или сценарий lnav. Аргумент должен начинаться с символа, используемого для ввода подсказки, чтобы различать разные типы (например, :, ;, |). Этот вариант можно давать несколько раз.
-f <path>
Выполнить указанный командный файл. Этот вариант можно давать несколько раз.
-I <path>
Добавить каталог конфигурации.
-i
Установить файлы формата в каталог .lnav/formats/. Отдельные файлы будут установлены в каталог installed, а репозитории git будут клонированы с именем каталога на основе их URI репозитория.
-u
Обновить форматы, установленные из репозиториев git.
-d <path>
Записывать отладочные сообщения в указанный файл.
-n
Запуск без интерфейса curses (безголовый режим).
-N
Не открывать файл системного журнала по умолчанию, если файлы не указаны.
-r
Рекурсивно загружать файлы из указанных базовых каталогов.
-t
Добавлять временные метки к строкам данных, считываемых на стандартный ввод.
-w <path>
Записывать в этот файл содержимое стандартного ввода.
-V
Напечатать версию lnav.
-q
Не печатать сообщения журнала после выполнения всех команд.
6.2 Переменные среды
XDG_CONFIG_HOME
Если эта переменная установлена, lnav будет использовать этот каталог для хранения своей конфигурации в подкаталоге с именем lnav.
HOME
Если XDG_CONFIG_HOME не установлен, lnav будет использовать этот каталог для хранения своей конфигурации в подкаталоге с именем .lnav.
TZ
Настройка часового пояса используется в некоторых форматах журналов для преобразования меток времени UTC в местный часовой пояс.
6.3 Примеры
Чтобы загрузить файл системного журнала и следить за ним:
$ lnav
Чтобы загрузить все файлы в /var/log:
$ lnav /var/log
Чтобы посмотреть вывод make с добавленными отметками времени:
$ make 2>&1 | lnav -t
Глава седьмая Пользовательский интерфейс
Основная часть дисплея показывает сообщения журнала из всех файлов, отсортированных по времени сообщения. Строки состояния вверху и внизу экрана могут дать вам представление о том, где вы находитесь в журналах. И последняя строка используется для ввода команд. Навигация управляется серией горячих клавиш, дополнительную информацию см. в Справочнике горячих клавиш.
Рис. 1: Снимок экрана lnav, просматривающего сообщения системного журнала.
На цветных дисплеях сообщения журнала будут выделены следующим образом:
ошибки будут окрашены в красный цвет;
предупреждения будут желтыми;
поисковые запросы - инвертированный цвет;
различные цвета будут применены к: IP-адресам, ключевым словам SQL, тегам XML, номерам файлов и строк в трассировках Java и строкам в кавычках;
«идентификаторам» в сообщениях будут случайным образом назначаться цвета в зависимости от их содержимого (лучше всего работает на терминалах «xterm-256color»).
В правой части дисплея есть «полоса прокрутки» пропорционального размера, которая показывает:
вашу текущую позицию в файле;
расположение ошибок/предупреждений в файлах журнала с использованием красного или желтого цвета;
местоположения совпадений при поиске с помощью отметки, указывающей влево;
расположение закладок с помощью отметки, указывающей вправо.
Выше и ниже основного текста находятся строки состояния, в которых отображаются:
текущее время;
имя файла, из которого была извлечена верхняя строка;
формат журнала для верхней строки;
текущий вид;
номер строки в верхней строке дисплея;
текущее совпадение поиска, общее количество совпадений и поисковый запрос;
Если представление поддерживает фильтрацию, в строке состояния будет отображаться следующее:
количество включенных фильтров и общее количество фильтров;
количество строк, которые не отображаются из-за фильтрации.
Чтобы отредактировать фильтры, вы можете нажать клавишу TAB, чтобы переключить фокус с главного экрана на редактор фильтров. Редактор позволяет легко создавать, включать/отключать и удалять фильтры.
Наконец, последняя строка на дисплее - это место, где вы можете вводить шаблоны поиска и выполнять внутренние команды, такие как преобразование отметки времени unix в удобочитаемую дату. Командная строка использует библиотеку readline, поэтому можно применять обычный набор сочетаний клавиш.
Дисплей также используется для отображения другого содержимого, такого как: файл справки, гистограммы сообщений журнала с течением времени и результаты SQL. Представления организованы в стек, поэтому каждый раз, когда вы активируете новое представление нажатием клавиши или командой, новое представление помещается в стек. Повторное нажатие той же клавиши вытолкнет представление из стека и вернет вас к предыдущему представлению. Обратите внимание, что вы всегда можете использовать «q», чтобы вывести из стека предыдущий вид.
Глава восьмая Справочник горячих клавиш
В этом справочнике описаны клавиши, используемые для управления lnav. Обратитесь к встроенной справке в lnav для более подробного объяснения каждой клавиши.
8.1 Пространственная навигация
Нажатия
Команда
Пробел
PgDn
На страницу вниз.
b
Backspace
PgUp
На страницу вверх.
j
Return
🠗
На строку вниз.
k
🠕
На строку вверх.
h
🠔
Левая половина страницы. В представлении журнала нажатие влево в начале текста сообщения покажет имя исходного файла для каждой строки. Повторное нажатие покажет полный путь.
Shift+h
Shift+🠔
Десять столбцов влево.
l
🠖
Правая половина страницы.
Shift+l
Shift+🠖
Десять столбцов вправо.
Home
g
Верхняя часть представления.
End
G
Нижняя часть представления.
e
Shift+e
Следующая/предыдущая ошибка.
w
Shift+w
Следующее/предыдущее предупреждение.
n
Shift+n
Следующее/предыдущее поисковое совпадение.
>
<
Следующее/предыдущее поисковое совпадение (по горизонтали).
f
Shift+f
Следующий/предыдущий файл.
u
Shift+u
Следующая/предыдущая закладка.
o
Shift+o
Вперед/назад через сообщения журнала с соответствующим полем opid.
y
Shift+y
Следующий/предыдущий результат SQL-запроса.
s
Shift+s
Следующее/предыдущее замедление скорости сообщений журнала.
{
}
Предыдущее/следующее местоположение в истории.
8.2 Хронологическая навигация
Нажатия
Команда
d
Shift+d
Вперед/назад на 24 часа.
1-6
Shift+1-6
Следующая/предыдущая n * 10 минута часа.
7
8
Предыдущая/следующая минута.
0
Shift+0
Следующий/предыдущий день.
r
Shift+r
Вперед/назад на относительное время, которое последний раз использовалось с командой goto.
8.3 Закладки
Нажатия
Команда
m
Отметить/снять отметку с верхней строки.
Shift+m
Отметить/снять отметку с диапазона строк от последней отмеченной до верхней.
Shift+j
Отметить/снять отметку со следующей строки после ранее отмеченной.
Shift+k
Отметить/снять отметку с предыдущей строки.
c
Копировать отмеченные строки в буфер обмена.
Shift+c
Очистить выделенные строки.
8.4 Дисплей
Нажатия
Команда
?
Просмотр/выход из встроенной справки.
q
Возврат к предыдущему виду/выход.
Shift+q
Возврат к предыдущему представлению/выход, пока совпадает верхнее время двух представлений.
a
Восстановить вид, который ранее был отображен с помощью q/Q.
Shift+a
Восстановить вид, который ранее был отображен с помощью q/Q и соответствовал верхнему времени представлений.
Shift+p
Переключение в/из красивого печатного вида отображаемого журнала или текстовых файлов.
Shift+t
Отображение прошедшего времени между строками.
t
Переключиться в/из представления текстового файла.
i
Переключиться в/из представления гистограммы.
Shift+i
Переключиться в/из представления гистограммы.
v
Переключиться в/из представления результатов SQL.
Shift+v
Переключиться в/из представления результатов SQL и перейти к соответствующему полю в столбец log_line.
p
Переключить отображение результатов парсера журнала.
Tab
В представлениях журнала/текста, сфокусироваться на панели конфигурации для редактирования фильтров и просмотра списка загруженных файлов. В представлении результатов SQL циклически перемещаться по столбцам для отображения в виде гистограмм.
Ctrl+l
Переключиться в режим lo-fi. Отображаемые строки журнала будут выгружены в терминал без каких-либо украшений, чтобы их можно было легко скопировать.
Ctrl+w
Включить перенос слов.
Ctrl+p
Показать/скрыть панель предварительного просмотра данных, которая может открываться при вводе команд или SQL-запросов.
Ctrl+f
Переключить состояние включения/выключения всех фильтров в текущем представлении.
x
Переключить скрытие полей сообщений журнала. Скрытые поля будут заменены тремя маркерами и выделены желтым цветом.
=
Приостановить/возобновить загрузку данных нового файла.
Поиск строк, соответствующих регулярному выражению.
;
Открыть интерфейс SQLite для выполнения операторов/запросов SQL.
:
Выполнить внутреннюю команду, дополнительную информацию см. в разделе Команды
|
Выполнить скрипт lnav, расположенный в каталоге формата.
Ctrl+]
Отменить запрос.
8.7 Настройка
Вы можете настроить поведение горячих клавиш, определив свои собственные раскладки. Обратитесь к разделу Определений раскладки клавиатуры для получения дополнительной информации.
Глава девятая Форматы журналов
Файлы журнала, загруженные в lnav, анализируются на основе форматов, определенных в файлах конфигурации. Многие форматы уже встроены в двоичный файл lnav, и вы можете определить свои собственные, используя файл JSON. При загрузке файлов каждый формат проверяется, чтобы увидеть, может ли он проанализировать первые несколько строк в файле. Как только совпадение будет найдено, этот формат будет считаться форматом этого файла и использоваться для анализа оставшихся строк в файле. Если совпадений не найдено, файл по формату считается неформатированным текстом и его можно просмотреть в «текстовом» представлении, доступ к которому осуществляется с помощью клавиши t.
В lnav встроены следующие форматы журналов:
Имя
Имя таблицы
Описание
Common Access Log
access_log
Формат журнала веб-доступа по умолчанию для таких серверов, как Apache.
Amazon ALB log
alb_log
Формат журнала для балансировщиков нагрузки приложений Amazon.
VMware vSphere Auto Deploy log format
autodeploy_log
Формат журнала для службы автоматического развертывания VMware.
Generic Block
block_log
Общий формат для журналов, таких как cron, которые имеют дату в начале блока.
Candlepin log format
candlepin_log
Формат журнала, используемый системой регистрации Candlepin.
Yum choose_repo Log
choose_repo_log
Формат журнала для инструмента yum choose_repo.
CUPS log format
cups_log
Формат журнала, используемый общей системой печати Unix.
Dpkg Log
dpkg_log
Журнал dpkg debian.
Amazon ELB log
elb_log
Формат журнала для Amazon Elastic Load Balancers.
engine log
engine_log
Формат журнала для файлов engine.log из RHEV/oVirt.
Common Error Log
error_log
Формат журнала веб-ошибок по умолчанию для таких серверов, как Apache.
Fsck_hfs Log
fsck_hfs_log
Формат журнала для инструмента fsck_hfs на Mac OS X.
Glog
glog_log
Формат Google glog.
HAProxy HTTP Log Format
haproxy_log
Формат журнала HAProxy.
Java log format
java_log
Формат журнала, используемый log4j и выводимый большинством программ Java.
journalctl JSON log format
journald_json_log
Формат журнала, созданный systemd journalctl -o json.
Katello log format
katello_log
Формат журнала, используемый katello и foreman как и в Satellite 6.
OpenAM Log
openam_log
Поставщик удостоверений OpenAM.
OpenAM Debug Log
openamdb_log
Журналы отладки для поставщика удостоверений OpenAM.
OpenStack log format
openstack_log
Формат журнала для файлов журнала OpenStack.
CUPS Page Log
page_log
Журнал печатных страниц сервера CUPS.
Papertrail Service
papertrail_log
Формат журнала для службы управления журналами papertrail.
S3 Access Log
s3_log
Формат журнала доступа к серверу S3.
SnapLogic Server Log
snaplogic_log
Формат журнала сервера SnapLogic.
SSSD log format
sssd_log
Формат журнала, используемый демоном Служб безопасности системы.
Strace
strace_log
Формат вывода строки.
sudo
sudo_log
Инструмент управления привилегиями sudo.
Syslog
syslog_log
Формат системного регистратора, используемый в большинстве систем posix.
TCF Log
tcf_log
Журнал Target Communication Framework.
TCSH History
tcsh_history
Формат файла истории tcsh.
Uwsgi Log
uwsgi_log
Формат журнала uwsgi.
Vdsm Logs
vdsm_log
Формат журнала Vdsm.
VMKernel Logs
vmk_log
Формат журнала VMkernel.
VMware Logs
vmw_log
Один из форматов журналов, используемых в программном обеспечении ESXi и vCenter VMware.
RHN server XMLRPC log format
xmlrpc_log
Генерируется компонентом Satellite’s XMLRPC.
В дополнение к указанным выше форматам поддерживаются следующие форматы с самоописанием:
Формат журнала Bro Network Security Monitor TSV поддерживается в версиях lnav v0.8.3+. Формат журнала Bro является самоописывающим, поэтому lnav прочитает заголовок, чтобы определить форму файла.
Формат файла W3C Extend Log File Format поддерживается в версиях lnav v0.10.0+. Формат журнала W3C является самоописывающим, поэтому lnav будет читать заголовок, чтобы определить форму файла.
9.1 Определение нового формата
Новые форматы журналов можно определить, поместив файлы конфигурации JSON в подкаталоги каталога ~/.lnav/formats/. Каталоги и файлы можно называть как угодно, но файлы должны иметь суффикс .json. Образец файла, содержащий встроенную конфигурацию, будет записан в этот каталог при запуске lnav. Вы можете обращаться к этому файлу при написании собственных форматов или если вам нужно изменить существующие. Каталоги форматирования также могут содержать файлы сценариев .sql и .lnav, которые можно использовать для автоматического анализа файлов журнала.
Файл формата lnav должен содержать один объект JSON, желательно со свойством $schema, которое относится к format-v1.schema, например:
Каждый формат, который должен быть определен в файле, должен быть отдельным полем в объекте верхнего уровня. Имя поля должно быть символьным именем формата. Это значение также будет использоваться в качестве имени таблицы SQL для журнала. Значением для каждого поля должен быть другой объект со следующими полями:
title
Краткое и удобочитаемое название формата.
description
Более подробное описание формата.
url
URL-адрес определения формата.
file-pattern
Регулярное выражение, используемое для сопоставления путей к файлам журнала. Обычно в процессе обнаружения проверяется каждый формат файла. Это поле можно использовать для ограничения того, к каким файлам применяется формат, в случае потенциального конфликта.
regex
Этот объект содержит подобъекты, которые описывают форматы сообщений, которые должны соответствовать в простом файле журнала. В файлах журнала, содержащих сообщения JSON, не следует указывать это поле.
pattern
Регулярное выражение, которое следует использовать для сопоставления сообщений журнала. Библиотека PCRE используется lnav для сопоставления всех регулярных выражений.
module-format
Если true, это регулярное выражение будет использоваться только для синтаксического анализа тел сообщений для форматов, которые могут действовать как контейнеры, например syslog. По умолчанию: false.
json
Истинно, если каждая строка журнала закодирована в формате JSON.
line-format
Массив, определяющий текстовый формат для сообщений журнала в формате JSON. В файлах журнала с кодировкой JSON каждое сообщение будет преобразовано из необработанной кодировки JSON в этот формат. Каждый элемент является либо объектом, определяющим, какие поля должны быть вставлены в окончательную строку сообщения, либо строковой константой, которая должна быть вставлена. Например, следующая конфигурация преобразует каждый объект сообщения журнала в строку, содержащую метку времени, за которой следует пробел, а затем тело сообщения:
[ { "field": "ts" }, " ", { "field": "msg" } ]
field
Имя или JSON-указатель поля сообщения, которое должно быть вставлено в этот момент в сообщении. Специальное имя поля __timestamp__ может использоваться для вставки удобочитаемой метки времени. Поле __level__ может использоваться для вставки имени уровня, как определено lnav.
Совет: используйте JSON-указатель для ссылки на вложенные поля. Например, чтобы включить свойство «procname», вложенное в объект «details», вы должны написать ссылку на поле как /details/procname.
min-width
Минимальная ширина поля. Если значение поля в данном сообщении журнала короче, при необходимости будет добавлено заполнение, чтобы удовлетворить требованиям минимальной ширины. (v0.8.2+)
max-width
Максимальная ширина поля. Если значение поля в данном сообщении журнала длиннее, будет применен алгоритм переполнения, чтобы попытаться сократить поле. (v0.8.2+)
align
Задает выравнивание поля: «left» или «right». Если «left», отступ для соответствия минимальной ширине будет добавлен справа. Если «right», отступ будет добавлен слева. (v0.8.2 +)
overflow
Алгоритм, используемый для сокращения поля, длина которого превышает «max-width». Поддерживаются следующие алгоритмы:
abbrev
Удаляет все, кроме первой буквы в тексте с точками. Например, «com.example.foo» будет сокращен до «c.e.foo».
truncate
Обрезает любой текст, превышающий максимальную ширину.
dot-dot
Вырезает середину текста и заменяет ее двумя точками (например, "..").
(v0.8.2 +)
timestamp-format
Формат отметки времени, используемый при отображении времени для этого сообщения журнала. (v0.8.2 +)
default-value
Значение по умолчанию, которое следует использовать, если поле не может быть найдено в текущем сообщении журнала. Встроенное значение по умолчанию - «-».
text-transform
Преобразует текст в поле. Поддерживаемые варианты: none, uppercase, lowercase, capitalize.
timestamp-field
Имя поля, содержащего временную метку сообщения журнала. По умолчанию - «timestamp».
timestamp-format
Массив форматов временных меток, использующий подмножество спецификации преобразования strftime. Поддерживаются следующие преобразования: %a, %b, %L, %M, %H, %I, %d, %e, %k, %l, %m, %p, %y, %Y, %S , %s, %Z, %z. Кроме того, вы также можете использовать следующее:
%L
Миллисекунды в виде десятичного числа (от 000 до 999).
%f
Микросекунды в виде десятичного числа (от 000000 до 999999).
%N
Наносекунд в виде десятичного числа (диапазон от 000000000 до 999999999).
%q
Секунды от начала эпохи UNIX в виде шестнадцатеричного числа.
%i
Миллисекунды от начала эпохи UNIX.
%6
Микросекунды от начала эпохи UNIX.
timestamp-divisor
Для журналов JSON с числовыми отметками времени это значение используется для деления отметки времени на количество секунд и доли секунд.
ordered-by-time
(v0.8.3+) Указывает, что порядок сообщений в файле основан на времени. Файлы, которые не упорядочены по времени, будут отсортированы для отображения в правильном порядке. Обратите внимание, что такая сортировка может снизить производительность при отслеживании журналов.
level-field
Имя группы захвата регулярных выражений, которая содержит уровень сообщения журнала. По умолчанию «level».
body-field
Имя поля, содержащего основную часть сообщения. По умолчанию - «body».
opid-field
Имя поля, содержащего «идентификатор операции» сообщения. «ID операции» устанавливает цепочку сообщений, которая может соответствовать конкретной операции/запросу/транзакции. Пользователь может нажимать горячие клавиши «o» или «Shift + O» для перемещения вперед/назад по списку сообщений с одинаковым идентификатором операции. Примечание. Для журналов, закодированных в JSON, поле opid может быть путем (например, “foo/bar/opid”), если поле вложено в объект и ДОЛЖНО быть включено в “формат строки” для работы горячих клавиш "o".
module-field
Имя поля, содержащего идентификатор модуля, который отличает сообщения из одного источника журнала от другого. Это поле следует использовать, если этот формат сообщения может выступать в качестве контейнера для других типов сообщений журнала. Например, журнал доступа Apache можно отправить в системный журнал вместо записи в файл. В этом случае lnav проанализирует сообщение системного журнала, а затем отдельно проанализирует тело сообщения, чтобы определить «вспомогательный» формат. Этот идентификатор модуля используется, чтобы помочь lnav быстро определить формат для использования при синтаксическом анализе тела сообщения.
hide-extra
Логическое значение для журналов JSON, которое указывает, должны ли поля, не представленные в строчном формате, отображаться в отдельных строках.
level
Отображение уровней ошибок в регулярные выражения. Во время сканирования содержимое группы захвата, заданной полем уровня, будет проверяться на соответствие каждому из этих регулярных выражений. Как только совпадение будет найдено, уровень сообщений журнала будет установлен на соответствующий уровень. Доступные уровни в порядке серьезности: fatal, critical, error, warning, stats, info, debug, debug2-5, trace. Для журналов JSON с точными числовыми уровнями можно указать номер соответствующего уровня. Если в формате журнала JSON используются числовые диапазоны вместо точных чисел, вы можете указать шаблон, и число, найденное в журнале, будет преобразовано в строку для сопоставления с шаблоном.
multiline
Если false, lnav будет считать любые строки журнала, которые не соответствуют одному из шаблонов сообщений, ошибочными при проверке файлов с помощью опции -C. Этот флаг не влияет на нормальный просмотр. По умолчанию: true.
value
Этот объект содержит определения значений, захваченных регулярными выражениями.
kind
Тип данных, которые были захвачены: string, integer, float, json, quoted.
collate
Имя функции сортировки SQLite для этого значения. Могут использоваться стандартные функции сопоставления SQLite, а также функции, определенные lnav, как описано в Collators.
identifier
Логическое значение, которое указывает, представляет ли это поле идентификатор, и должно ли быть окрашено синтаксисом.
external-key
Логическое значение, указывающее, что это поле является ключом и не должно отображаться в графическом виде. Это должно быть установлено только для целочисленных полей.
hidden
Логическое значение для полей журнала, указывающее, должны ли они отображаться. Поведение журналов JSON и текстовых журналов немного отличается. Для журнала JSON это свойство определяет, будет ли добавлена дополнительная строка с парой ключ/значение. Для текстовых журналов это свойство определяет, должно ли значение отображаться по умолчанию или заменяться многоточием.
rewriter
Команда для перезаписи этого поля при печати сообщений журнала, содержащих это значение. Команда должна начинаться с :, ; или |, чтобы указать, является ли она обычной командой, SQL-запросом или выполняемым сценарием. Другие поля в строке доступны в SQL с помощью префикса :. Текстовое значение этого поля будет затем заменено результатом выполнения команды при печати в формате. Например, формат журнала доступа HTTP перепишет поле кода состояния, чтобы включить текстовую версию (например, 200 (ОК)), используя следующий SQL-запрос:
;SELECT :sc_status || ' (' || (
SELECT message FROM http_status_codes
WHERE status = :sc_status) || ') '
sample
Список объектов, содержащих образцы сообщений журнала. Все форматы должны включать хотя бы один образец, и ему должно соответствовать одно из включенных регулярных выражений. Каждый объект должен содержать следующее поле:
line
Пример сообщения.
level
Ожидаемый уровень ошибки. Ошибка будет вызвана, если этот уровень не соответствует уровню, проанализированному lnav для этого примера сообщения.
highlights
Этот объект содержит определения шаблонов, которые должны быть выделены в сообщении журнала. Каждая запись должна иметь имя и определение со следующими полями:
pattern
Регулярное выражение, которое должно совпадать в теле сообщения журнала.
color
Цвет переднего плана, который следует использовать при выделении части сообщения, соответствующей шаблону. Если цвет не указан, он будет выбран автоматически. Цвета можно указать в шестнадцатеричной системе счисления, начав с хеша (например, #aabbcc) или используя название цвета, которое можно найти на http://jonasjacek.github.io/colors/.
background-color
Цвет фона, используемый при выделении части сообщения, соответствующей шаблону. Если цвет фона не указан, будет использован черный цвет. Цвет фона учитывается, только если указан цвет переднего плана.
underline
Если true, подчеркивает ту часть сообщения, которая соответствует шаблону.
blink
Если true, мигает та часть сообщения, которая соответствует шаблону.
При загрузке форматов журналов из файлов lnav накладывает любые новые данные поверх ранее загруженных данных. Эта функция позволяет вам переопределить существующее значение или добавить новые в конфигурации формата. Например, вы можете отдельно добавить новое регулярное выражение в приведенный выше пример формата журнала, создав другой файл со следующим содержимым:
Каталоги формата могут также содержать файлы .sql и .lnav, чтобы помочь автоматизировать анализ файлов журнала. Файлы SQL выполняются при запуске для создания любых вспомогательных таблиц или представлений, а файлы сценария .lnav могут быть выполнены с помощью горячей клавиши конвейера (|). Например, lnav включает сценарий «разбиения по загрузке», который разбивает представление журнала на разделы на основе загрузочных сообщений от ядра Linux. Сценарий может содержать сочетание команд SQL и lnav, а также включать другие сценарии. Тип оператора для выполнения определяется ведущим символом в строке: точка с запятой запускает оператор SQL; двоеточие запускает команду lnav; а вертикальная черта (|) обозначает другой сценарий, который должен быть выполнен. Строки, начинающиеся с хеша, рассматриваются как комментарии. В скрипте определены следующие переменные:
#
Количество аргументов, переданных скрипту.
__all__
Строка, содержащая все аргументы, разделенные одиночными пробелами.
0
Путь к исполняемому скрипту.
1-N
Аргументы передаются скрипту.
Помните, что вам нужно использовать команду :eval при обращении к переменным в большинстве команд lnav. Сценарии могут предоставлять текст справки, отображаемый во время интерактивного использования, путем добавления следующих тегов в заголовок комментария:
@synopsis
Синопсис должен содержать имя сценария и любые параметры, которые необходимо передать. Например:
# @synopsis: hello-world [ ... ]
@description
Однострочное описание того, что делает сценарий. Например:
# @description: Say hello to the given names.
Совет: Команду :eval можно использовать для подстановки переменных для команд, которые изначально не поддерживают ее. Например, чтобы заменить переменную pattern в команде :filter-out:
:eval :filter-out ${pattern}
9.4 Установка форматов
Форматы файлов загружаются из подкаталогов /etc/lnav/formats и ~/.lnav/formats/. Вы можете вручную создать эти подкаталоги и скопировать туда файлы форматирования. Или вы можете передать lnav параметр -i для автоматической установки форматов из командной строки. Например:
Файлы формата, установленные с помощью этого метода, будут помещены в подкаталог installed и названы на основе имени первого формата, найденного в файле.
Вы также можете установить форматы из репозиториев git, передав URL-адрес клона репозитория. Стандартный набор репозиториев поддерживается по адресу https://github.com/tstack/lnav-config и может быть установлен путем передачи «extra» в командной строке, например:
$ lnav -i extra
Эти репозитории можно обновить, запустив lnav с флагом -u.
Файлы форматирования также можно сделать исполняемыми, добавив строку shebang (#!) В начало файла, например:
#! /usr/bin/env lnav -i
{
"myformat_log" : ...
}
Запуск файла формата должен затем установить его автоматически:
Когда lnav загружает файл, он пробует каждый формат журнала по первым 15000 строкам[1] файла, пытаясь найти совпадение. Когда совпадение найдено, этот формат журнала будет заблокирован и будет использоваться для остальных строк в этом файле. Поскольку между форматами может быть перекрытие, lnav выполняет тест при запуске, чтобы определить, какие форматы соответствуют друг другу строкам выборки. Используя эту информацию, он упорядочит форматы так, чтобы более конкретные форматы были опробованы перед более общими. Например, формат, который соответствует определенным сообщениям системного журнала, будет соответствовать его собственным строкам выборки, но не строкам в примерах системного журнала. С другой стороны, формат системного журнала будет соответствовать его собственным образцам и образцам в более конкретном формате. Вы можете увидеть порядок форматирования, включив отладку и проверив файл журнала lnav на наличие сообщения «Format order»:
$ lnav -d /tmp/lnav.log
Можно настроить максимальное количество проверяемых строк. См. Раздел Настройка для получения более подробной информации.
Глава десятая Сессии
Информация о сеансе сохраняется автоматически для набора файлов, которые были переданы в командной строке и перезагружены при следующем запуске lnav. В настоящее время сохраняется следующая информация:
Закладки и настройки времени ведения журнала хранятся отдельно для каждого файла. Обратите внимание, что закладки связаны с файлами на основе содержимого первой строки файла, поэтому они сохраняются, даже если файл был перемещен из своего текущего местоположения.
Данные сеанса хранятся в каталоге ~/.lnav.
Глава одиннадцатая Команды
Команды обеспечивают доступ к некоторым более продвинутым функциям lnav, таким как filtering и search tables. Вы можете активировать командную строку, нажав клавишу :. В командной строке вы можете начать вводить нужную команду и/или дважды нажать TAB, чтобы активировать автозаполнение и показать доступные команды. Чтобы помочь вам в использовании команд, над командной строкой появится окно справки с объяснением команды и ее параметров (если они есть). Например, на снимке экрана ниже показана справка для команды :open:
Рис. 1: Снимок экрана онлайн-справки для команды :open.
Помимо интерактивной справки, многие команды позволяют предварительно просмотреть эффекты, которые будет иметь команда. Этот предварительный просмотр активируется вскоре после того, как вы закончите вводить текст, но до того, как вы нажали Enter для выполнения команды. Например, команда :open покажет предварительный просмотр первых нескольких строк файла, заданного в качестве аргумента:
Рис. 2: Снимок экрана предварительного просмотра, показанного для команды :open.
Команда :filter-out pattern - еще один пример, в котором поведение предварительного просмотра может помочь вам создать правильную командную строку. Эта команда принимает регулярное выражение PCRE, которое определяет сообщения журнала, которые должны быть отфильтрованы из представления. В предварительном просмотре для этой команды красным цветом будет выделена часть сообщений журнала, соответствующих выражению. Таким образом, вы можете быть уверены, что регулярное выражение соответствует интересующим вас сообщениям журнала, прежде чем применять фильтр. На следующем снимке экрана показан пример такого поведения предварительного просмотра для строки «launchd»:
Рис. 3: Снимок экрана, показывающий предварительный просмотр команды :filter-out launchd.
Любые ошибки, обнаруженные во время предварительного просмотра, будут отображаться в строке состояния прямо над командной строкой. Например, при попытке открыть неизвестный файл в строке состояния будет отображаться сообщение об ошибке, например:
Рис. 4: Скриншот ошибки при попытке открыть несуществующий файл.
Совет: обратите внимание, что почти все команды поддерживают завершение по TAB для своих аргументов. Итак, если вы сомневаетесь, что вводить для аргумента, вы можете дважды нажать клавишу TAB, чтобы получить предложения. Например, завершение TAB для команды filter-in предложит слова, которые в данный момент отображаются в представлении.
Примечание: Следующие команды можно отключить, установив переменную среды LNAVSECURE перед запуском lnav:
:open
:pipe-to
:pipe-line-to
:write-*-to
Это упрощает запуск lnav в ограниченных средах без риска повышения привилегий.
11.1 Справочник
11.1.1 :adjust-log-time timestamp
Изменить временные метки верхнего файла, чтобы они были относительно заданной даты.
Параметры
timestamp* - новая временная метка для верхней строки в представлении
Примеры
Чтобы установить верхнюю временную метку на заданную дату:
:adjust-log-time 2017-01-02T05:33:00
Чтобы установить верхнюю временную метку на час назад:
:adjust-log-time -1h
11.1.2 :alt-msg msg
Отобразить сообщения в альтернативной командной позиции
Параметры
msg* - сообщение для отображения
Примеры
Чтобы отобразить «Press t to switch to the text view» в правом нижнем углу:
Вывести данное сообщение на экран или, если был вызван: redirect-to, в выходной файл, указанный в перенаправлении. В сообщении выполняется подстановка переменных. Используйте обратную косую черту, чтобы экранировать любые специальные символы, например $.
expr* - выражение SQL, оцениваемое для каждого сообщения журнала. Доступ к значениям сообщений можно получить, используя имена столбцов с префиксом двоеточие.
Примеры
Чтобы установить выражение фильтра, которое соответствует сообщениям системного журнала от syslogd:
:filter-expr :log_procname = 'syslogd'
Чтобы установить выражение фильтра, которое соответствует сообщениям журнала, где после id следует число и содержит строку foo:
:filter-expr :log_body REGEXP 'id\d+' AND :log_body REGEXP 'foo'
Скрыть поля сообщений журнала, заменив их многоточием
Параметры
field-name - имя поля, которое нужно скрыть, в формате для верхней строки журнала. Полное имя может использоваться, если имя поля предваряется именем формата и точкой, чтобы скрыть любое поле.
Примеры
Чтобы скрыть поля log_procname во всех форматах:
:hide-fields log_procname
Чтобы скрыть только поле log_procname в формате системного журнала:
Переключить состояние закладки для верхней строки в текущем представлении
См. также
:hide-unmarked-lines, :next-mark type, :prev-mark type
11.1.38 :mark-expr expr
Установить выражение закладки
Параметры
expr* - выражение SQL, оцениваемое для каждого сообщения журнала. Доступ к значениям сообщений можно получить, используя имена столбцов с префиксом двоеточие.
Примеры
Чтобы отметить строки из dhclient, в которых упоминается eth0:
:mark-expr :log_procname = 'dhclient' AND :log_body LIKE '%eth0%'
См. также
:clear-mark-expr, :hide-unmarked-lines, :mark, :next-mark type, :prev-mark type
11.1.39 :next-location
Перейти к следующей позиции в истории местоположений
Открыть указанный файл(ы) в lnav. Открытие файлов на машинах, доступных через SSH, может быть выполнено с использованием синтаксиса: [user@]host:/path/to/logs
В представлении журнала записать исходное содержимое файла журнала отмеченных сообщений в файл. В представлении БД содержимое ячеек записать в выходной файл.
Параметры
path* - путь к файлу для записи
Примеры
Чтобы записать отмеченные строки в представлении журнала в /tmp/table.txt:
Анализ журнала в lnav можно выполнить с помощью интерфейса SQLite. Доступ к сообщениям журнала можно получить через виртуальные таблицы, созданные для каждого формата файла. Таблицы имеют то же имя, что и формат журнала, и каждое сообщение представляет собой отдельную строку в таблице. Например, учитывая следующее сообщение журнала из журнала доступа Apache:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
Эти столбцы будут доступен для своей строки в таблице access_log:
log_line
0
log_part
<NULL>
log_time
2000-10-10 13:55:36.000
log_idle_msecs
0
log_level
info
log_mark
1
log_comment
<NULL>
log_tags
<NULL>
log_filters
<NULL>
c_ip
127.0.0.1
cs_method
GET
cs_referer
<NULL>
cs_uri_query
<NULL>
cs_uri_stem
/apache_pb.gif
cs_user_agent
<NULL>
cs_username
frank
cs_version
HTTP/1.0
sc_bytes
2326
sc_status
200
Примечание: Некоторые столбцы по умолчанию скрыты для уменьшения шума в результатах, но при явном использовании к ним по-прежнему можно получить доступ. Скрытые столбцы: log_path, log_text, log_body и log_raw_text.
Вы можете активировать запрос SQL, нажав клавишу ; ключ. В командной строке вы можете начать вводить желаемый оператор SQL и/или дважды нажать TAB, чтобы активировать автозаполнение. Над подсказкой появится окно справки, которое поможет вам использовать ключевые слова и функции SQL.
Рис. 1: Снимок экрана интерактивной справки для запроса SQL.
Рис. 2: Скриншот интерактивной справки для функции group_concat().
Простой запрос для выполнения в журнале доступа Apache может заключаться в получении среднего и максимального количества байтов, возвращаемых сервером, сгруппированных по IP-адресу:
;SELECT c_ip, avg(sc_bytes), max(sc_bytes) FROM access_log GROUP BY c_ip
После нажатия Enter SQLite выполнит запрос, используя реализацию виртуальной таблицы lnav, чтобы извлечь данные непосредственно из файлов журнала. После завершения запроса главное окно переключится на представление БД для отображения результатов. Нажмите q, чтобы вернуться к просмотру журнала, и нажмите v, чтобы вернуться к просмотру журнала. Если результаты SQL содержат столбец log_line, вы можете нажать Shift+v для переключения между представлением базы данных и журналом.
Рис. 3: Снимок экрана представления результатов SQL.
Представление БД имеет следующие особенности отображения:
Заголовки столбцов при прокрутке остаются в верхней части представления.
Гистограмма с накоплением значений числового столбца отображается под строками. Нажатие TAB будет циклически отображать отсутствие столбцов, каждый отдельный столбец или все столбцы.
Столбцы JSON в верхней строке можно красиво распечатать, нажав p. На дисплее отобразится значение и путь JSON-указателя, которые можно передать функции jget.
12.1 Таблицы журналов
Каждый формат журнала имеет свою собственную таблицу базы данных, которую можно использовать для доступа к сообщениям журнала, соответствующим этому формату. Имя таблицы совпадает с именем формата, например, в формате syslog_log будет таблица с именем syslog_log. Также есть таблица all_logs, которая обеспечивает доступ ко всем сообщениям всех форматов.
Примечание: В интерфейсе SQLite отражаются только отображаемые сообщения журнала. Отфильтрованные сообщения журнала недоступны.
Столбцы в таблицах журнала состоят из нескольких встроенных функций вместе со значениями, зафиксированными спецификацией формата журнала. Используйте команду .schema в приглашении SQL, чтобы проверить дамп текущей схемы базы данных.
Следующие столбцы являются встроенными и включаются в SELECT *:
log_line
Номер строки для сообщения в представлении журнала.
log_part
Раздел, в котором находится сообщение. Этот столбец можно изменить с помощью UPDATE или команды :parition-name.
log_time
Скорректированная отметка времени для сообщения журнала. Это время может отличаться от отметки времени сообщения журнала, если оно пришло не по порядку и формат журнала предполагает, что файлы журнала будут упорядочены по времени.
log_actual_time
Исходная временная метка сообщений журнала в файле.
log_idle_msecs
Разница во времени между этим и предыдущим сообщениями. Единица времени - миллисекунды.
log_level
Уровень сообщения журнала.
log_mark
Истина, если сообщение журнала было отмечено пользователем.
log_comment
Комментарий к сообщению. Этот столбец можно изменить с помощью команды UPDATE или :comment.
log_tags
Список тегов сообщения в формате JSON. Этот столбец можно изменить с помощью команды UPDATE или :tag.
log_filters
Список идентификаторов фильтров в формате JSON, соответствующих этому сообщению.
Следующие столбцы являются встроенными и скрыты, поэтому они не будут включены в SELECT *:
log_time_msecs
Скорректированная временная метка для сообщения журнала в виде количества миллисекунд от эпохи UNIX. Этот столбец можно более эффективно использовать для операций, связанных со временем, таких как timeslice().
log_path
Путь к файлу журнала, в котором находится это сообщение.
log_text
Полный текст сообщения журнала.
log_body
Тело сообщения журнала.
log_raw_text
Необработанный текст этого сообщения из файла журнала. В случае журналов JSON и CSV это будет точная строка текста JSON-Line и CSV из файла.
12.2 Расширения
Чтобы упростить анализ данных журнала из lnav, существует несколько встроенных расширений, которые предоставляют дополнительные функции и средства сортировки помимо тех, что предоставляются SQLite. Большинство функций взяты из файла extensions-functions.c, доступного на веб-сайте sqlite.org.
Совет: вы можете включить файл базы данных SQLite в командную строку и использовать интерфейс lnav для выполнения запросов. База данных будет прикреплена с именем, основанным на имени файла базы данных.
12.3 Команды
Команда SQL - это внутренний макрос, реализованный lnav.
.schema
Открывает представление схемы. Это представление содержит дамп схемы для внутренних таблиц и любых таблиц в подключенных базах данных.
.msgformats
Выполняет шаблонный запрос, который группирует и подсчитывает сообщения журнала по формату их тела сообщения. Эта команда может быть полезна для быстрого определения типов сообщений, наиболее часто встречающихся в файле журнала.
12.4 Переменные
В операторах SQL доступны следующие переменные:
$LINES
Количество строк в окне терминала.
$COLS
Количество столбцов в окне терминала.
12.5 Окружение
Доступ к переменным среды можно получить в запросах с использованием обычного синтаксиса $VAR_NAME. Например, чтобы прочитать значение переменной «USER», вы можете написать:
;SELECT $USER
12.6 Сортировщики
naturalcase
Сравнивать строки «естественным образом», чтобы числовые значения в строке сравнивались на основе их числовых значений, а не их символьных значений. Например, «foo10» будет считаться большим, чем «foo2».
naturalnocase
То же, что и naturalcase, но без учета регистра.
ipaddress
Сравнение адресов IPv4/IPv6.
12.7 Справочник
Ниже приводится справочник по синтаксису и доступным функциям SQL:
12.7.1 expr [NOT] BETWEEN low AND hi
Проверить, находится ли выражение между двумя значениями.
Параметры
low* - нижняя точка
hi* - верхняя точка
Примеры
Чтобы проверить, находится ли 3 между 5 до 10:
;SELECT 3 BETWEEN 5 AND 10
0
Чтобы проверить, находится ли 10 между 5 до 10:
;SELECT 10 BETWEEN 5 AND 10
1
12.7.2 ATTACH DATABASE filename AS schema-name
Прикрепить файл базы данных к текущему соединению.
Параметры
filename* - путь к файлу базы данных.
schema-name* - префикс для таблиц в этой базе данных.
Примеры
Чтобы прикрепить файл базы данных /tmp/customers.db с именем customers:
;ATTACH DATABASE '/tmp/customers.db' AS customers
12.7.3 CREATE [TEMP] VIEW [IF NOT EXISTS] [schema-name.] view-name AS select-stmt
Присвоить имя оператору SELECT
Параметры
IF NOT EXISTS - не создавать представление, если оно уже существует.
schema-name. - База данных для создания представления в ней.
view-name* - имя представления
select-stmt* - оператор SELECT, который отображает представление
12.7.4 CREATE [TEMP] TABLE [IF NOT EXISTS] [schema-name.] table-name AS select-stmt
Создать таблицу
12.7.5 WITH RECURSIVE cte-table-name AS select-stmt
Создать временное представление, которое существует только на время выполнения оператора SQL.
Параметры
cte-table-name* - имя временной таблицы.
select-stmt* - оператор SELECT, используемый для заполнения временной таблицы.
12.7.6 CAST(expr AS type-name)
Преобразовать значение данного выражения в другой класс хранения, указанный в type-name.
Параметры
expr* - значение для преобразования.
type-name* - имя типа, в который нужно преобразовать.
Примеры
Чтобы преобразовать значение 1.23 в целое число:
;SELECT CAST(1.23 AS INTEGER)
1
12.7.7 CASE [base-expr] WHEN cmp-expr ELSE [else-expr] END
Оценить последовательность выражений по порядку, пока одно из них не станет истинным, а затем вернуть его результат. Подобно конструкции IF-THEN-ELSE в других языках.
Параметры
base-expr - базовое выражение, которое используется для сравнения в ветвях.
cmp-expr - выражение для проверки, следует ли использовать эту ветвь.
else-expr - результат этого CASE, если ни одна ветвь не найдена.
Примеры
Чтобы вычислить число один и вернуть строку one:
;SELECT CASE 1 WHEN 0 THEN 'zero' WHEN 1 THEN 'one' END
one
path - один или несколько компонентов пути, которые необходимо объединить. Если аргумент начинается с прямой или обратной косой черты, он будет считаться абсолютным путем, и любые предыдущие элементы будут проигнорированы.
Примеры
Чтобы объединить каталог и имя файла в относительный путь:
;SELECT joinpath('foo', 'bar')
foo/bar
Чтобы объединить пустой компонент с другими именами в относительный путь:
;SELECT joinpath('', 'foo', 'bar')
foo/bar
Чтобы создать абсолютный путь с двумя компонентами пути:
;SELECT joinpath('/', 'foo', 'bar')
/foo/bar
Чтобы создать абсолютный путь из компонента пути, который начинается с косой черты:
Возвращает массив с заданными значениями, присоединенными к концу. Если начальное значение равно нулю, результатом будет массив с заданными элементами. Если начальное значение представляет собой массив, результатом будет массив с заданными значениями в конце. Если начальное значение не является нулем или массивом, результатом будет массив с двумя элементами: начальным значением и заданным значением.
pattern* - образец для сопоставления. Символ процента (%) соответствует нулю или более символам, а подчеркивание (_) соответствует одному символу.
str* - строка для сопоставления
escape - escape-символ, который можно использовать для добавления буквального символа процента или подчеркивания в шаблоне.
Примеры
Чтобы проверить, содержит ли строка aabcc букву b:
;SELECT like('%b%', 'aabcc')
1
Чтобы проверить, заканчивается ли строка aab%' на 'b%':
;SELECT like('%b:%', 'aab%', ':')
1
12.7.75 likelihood(value, probability)
Предоставляет планировщику запросов подсказку о том, что первый аргумент является логическим значением, которое является истинным с заданной вероятностью
Параметры
value* - возвращаемое логическое значение
probability* - константа с плавающей запятой от 0.0 до 1.0
12.7.76 likely(value)
Сокращение вероятности (X, 0,9375)
Параметры
value* - возвращаемое логическое значение
12.7.77 lnav_top_file()
Возвращает имя файла, из которого взялась верхняя строка в текущем представлении.
12.7.78 load_extension(path, [entry-point])
Загружает расширения SQLite из указанного файла общей библиотеки, используя заданную точку входа.
Параметры
path* - путь к общей библиотеке, содержащей расширение.
Возвращает строку с аргументами этой функции, подставленными в заданный формат. Точки замещения указываются с использованием опций процента (%), как и в стандартной функции printf() в Си.
Параметры
format* - формат возвращаемой строки.
X* - аргумент для замены в данной позиции в формате.
Проверяет, соответствует ли строка регулярному выражению
Параметры
re* - используемое регулярное выражение
str* - строка для проверки на соответствие регулярному выражению.
12.7.107 regexp_capture(string, pattern)
Возвращающая табличное значение функция, которая выполняет регулярное выражение над строкой и возвращает захваченные значения. Если регулярное выражение соответствует только подмножеству входной строки, оно будет повторно выполнено для оставшихся частей строки, пока больше совпадений не будет найдено.
Функция, используемая для создания гистограммы спарклайнов. В неагрегированной версии одно числовое значение диапазона преобразуется в символ гистограммы. Агрегированная версия возвращает строку с символом полосы для каждого числового ввода.
Параметры
value* - числовое значение для преобразования
upper - верхняя граница числового диапазона. По умолчанию для неагрегированной версии установлено значение 100. Для агрегированной версии используется наибольшее значение входных данных.
Примеры
Чтобы получить элемент блока Unicode для значения 32 в диапазоне 0–128:
Возвращает подстроку входной строки X, которая начинается с Y-го символа и имеет длину Z символов.
Параметры
str* - строка, из которой нужно извлечь подстроку.
start* - индекс в строке str, который является началом подстроки. Индексы начинаются с 1. Отрицательное значение означает, что подстрока найдена путем отсчета справа, а не слева.
size - размер подстроки. Если не указан, то возвращаются все символы до конца строки. Если значение отрицательное, то возвращаются символы до начала.
Примеры
Чтобы получить подстроку, начинающуюся со второго символа до конца строки abc:
;SELECT substr('abc', 2)
bc
Чтобы получить подстроку первого размера, начиная со второго символа строки abc:
;SELECT substr('abc', 2, 1)
b
Чтобы подстрока начиналась с последнего символа до конца строки abc:
;SELECT substr('abc', -1)
c
Чтобы получить подстроку, начинающуюся с последнего символа и возвращающуюся на один шаг строки abc:
Чтобы сгруппировать сообщения журнала в пятиминутные сегменты и подсчитать их:
;SELECT timeslice(log_time_msecs, '5m') AS slice, count(1) FROM lnav_example_log GROUP BY slice
slice count(1)
2017-02-03 04:05:00.000 2
2017-02-03 04:25:00.000 1
2017-02-03 04:55:00.000 1
Чтобы сгруппировать сообщения журнала по сообщениям до 4:30 и после:
;SELECT timeslice(log_time_msecs, 'before 4:30am') AS slice, count(1) FROM lnav_example_log GROUP BY slice
slice count(1)
<NULL> 1
2017-02-03 00:00:00.000 3
Возвращающая табличное значение функция, которая выполняет выражение xpath в строке XML и возвращает выбранные значения.
Параметры
xpath* - выражение XPATH для оценки в XML-документе.
xmldoc* - XML-документ в виде строки.
Примеры
Чтобы выбрать узлы XML на пути /abc/def:
;SELECT * FROM xpath('/abc/def', '<abc><def a="b">Hello</def><def>Bye</def></abc>')
result node_path node_attr node_text
<def a="b">Hello</def>␊ /abc/def[1] {"a":"b"} Hello
<def>Bye</def>␊ /abc/def[2] {} Bye
Чтобы выбрать все атрибуты a на пути /abc/def:
;SELECT * FROM xpath('/abc/def/@a', '<abc><def a="b">Hello</def><def>Bye</def></abc>')
result node_path node_attr node_text
b /abc/def[1]/@a {"a":"b"} Hello
Чтобы выбрать текстовые узлы на пути /abc/def:
;SELECT * FROM xpath('/abc/def/text()', '<abc><def a="b">Hello ★</def></abc>')
result node_path node_attr node_text
Hello ★ /abc/def/text() {} Hello ★
Эти дополнительные таблицы предоставляют полезную информацию и позволяют управлять внутренним состоянием lnav. Вы можете получить дамп всей схемы базы данных, выполнив команду SQL .schema, например:
;.schema
13.1 environ
Таблица environ дает вам доступ к переменным окружения процесса lnav. Вы можете использовать переменные среды SELECT, INSERT и UPDATE, например:
;SELECT * FROM environ WHERE name = 'SHELL'
name value
SHELL /bin/tcsh
;UPDATE environ SET value = '/bin/sh' WHERE name = 'SHELL'
Переменные среды могут использоваться для хранения простых значений или передачи значений из среды SQL lnav командам lnav. Например, команда «open» выполнит замену переменной, поэтому вы можете вставить переменную с именем «FILENAME», а затем открыть ее в lnav, указав на нее «$FILENAME»:
;INSERT INTO environ VALUES ('FILENAME', '/path/to/file')
:open $FILENAME
13.2 lnav_file
Таблица lnav_file позволяет вам исследовать и выполнять ограниченные обновления метаданных для файлов, которые в настоящее время загружены в lnav. В этой таблице доступны следующие столбцы:
device
Устройство, на котором хранится файл.
inode
Индекс файла на устройстве.
filepath
Если это настоящий файл, это будет абсолютный путь. В противном случае это символическое имя. Если это символическое имя, его можно обновить (UPDATE), чтобы этот файл учитывался при сохранении и загрузке информации о сеансе.
format
Формат файла журнала для файла.
lines
Количество строк в файле.
time_offset
Смещение в миллисекундах для отметок времени timestamp. Этот столбец можно обновить (UPDATE), чтобы изменить смещение отметок времени в файле.
13.3 lnav_views
Таблица lnav_views позволяет вам сделать SELECT и UPDATE для информации, относящейся к «views» в lnav (например, log, text и т.д.). В этой таблице доступны следующие столбцы:
name
Имя представления.
top
Номер строки в верхней части представления. Это значение можно обновить (UPDATE), чтобы переместить представление в данную строку.
left
Номер самого левого столбца для отображения. Это значение можно обновить (UPDATE) для перемещения представления влево или вправо.
height
Количество строк, отображаемых на экране.
inner_height
Количество отображаемых строк содержимого.
top_time
Отметка времени верхней строки в представлении или NULL, если представление не основано на времени. Это значение можно обновить (UPDATE), чтобы переместить представление на заданное время.
paused
Указывает, что просмотр приостановлен и не загружает новые данные.
search
Строка поиска для этого представления. Это значение можно обновить (UPDATE), чтобы начать текстовый поиск в этом представлении.
13.4 lnav_view_stack
Таблица lnav_view_stack позволяет вам выполнить SELECT и DELETE из стека lnav «представлений» (например, log, text и т.д.). В этой таблице доступны следующие столбцы:
name
Имя представления.
13.5 lnav_view_filters
Таблица lnav_view_filters позволяет вам управлять фильтрами в представлениях lnav. В этой таблице доступны следующие столбцы:
view_name
Имя представления, к которому применяется фильтр.
filter_id
Идентификатор фильтра. Он будет назначен при вставке.
enabled
Указывает, включен или отключен этот фильтр.
type
Тип фильтра: входящий или выходной.
pattern
Регулярное выражение для фильтрации.
Эта таблица поддерживает SELECT, INSERT, UPDATE и DELETE в строках таблицы для чтения, создания, обновления и удаления фильтров для представлений.
13.6 lnav_view_filter_stats
Таблица lnav_view_filter_stats позволяет получить информацию о том, сколько строк соответствует заданному фильтру. В этой таблице доступны следующие столбцы:
view_name
Имя представления.
filter_id
Идентификатор фильтра.
hits
Количество строк, соответствующих этому фильтру.
Эта таблица доступна только для чтения.
13.7 lnav_view_filters_and_stats
Представление lnav_view_filters_and_stats объединяет таблицу lnav_view_filters с таблицей lnav_view_filter_stats в единое представление для простоты использования.
13.8 all_logs
Таблица all_logs позволяет вам запрашивать формат, полученный из анализатора сообщений журнала lnav, который используется для автоматического извлечения данных, см. Извлечение данных для более подробной информации.
13.9 http_status_codes
Таблица http_status_codes - это удобный справочник, который можно использовать для преобразования кодов состояния HTTP в удобочитаемые сообщения.
13.10 regexp_capture(<string>, <regex>)
Возвращающая табличное значение функция regexp_capture() применяет регулярное выражение к заданной строке и возвращает подробные результаты для захваченных частей строки.
Глава четнадцатая Извлечение данных
Примечание: эта функция все еще находится в бета-версии, вы должны ожидать ошибок и несовместимых изменений в будущем.
Сообщения журнала содержат много полезных данных, но их не всегда легко найти. Анализатор журнала, встроенный в lnav, может извлекать данные, как описано в Log Formats, а также обнаруживать данные в текстовых сообщениях. Затем эти данные можно запросить и обработать с помощью внешнего интерфейса SQLite, который также включен в lnav. Например, следующее сообщение системного журнала от sudo может быть обработано для извлечения нескольких пар ключ/значение:
Данные, которые может извлечь анализатор, можно просмотреть непосредственно в lnav, нажав клавишу p. Результаты будут отображаться в виде наложения, как показано ниже:
Обратите внимание, что синтаксический анализатор обнаружил пары вида <key>=<value>. Анализатор данных также будет искать пары, разделенные двоеточием. Если нет четко разграниченных пар, то синтаксический анализатор извлечет все, что выглядит как значения данных, и назначит им ключи формы col_N. Например, два значения данных, IPv4-адрес и имя интерфейса, будут извлечены из следующего сообщения журнала:
Apr 29 08:13:43 sample-centos5 avahi-daemon[2467]: Registering new address record for 10.1.10.62 on eth0.
Поскольку в сообщении нет ключей для значений, синтаксический анализатор назначит col_0 для IP-адреса и col_1 для имени интерфейса, как показано здесь:
Теперь, когда у вас есть представление о том, как работает синтаксический анализатор, вы можете приступить к выполнению запросов к извлекаемым данным. Механизм базы данных SQLite встроен в lnav, а его механизм Виртуальных таблиц используется для обеспечения средств обработки этих данных журнала. Каждый формат журнала имеет свою собственную таблицу, которая может использоваться для доступа ко всем загруженным сообщениям в этом формате. Для доступа к содержимому сообщения журнала, которое имеет более свободный формат, как в приведенных здесь примерах, можно использовать таблицу logline. Таблица logline воссоздается для каждого запроса и основана на формате и парах, обнаруженных в сообщении журнала в верхней части дисплея.
Запросы можно выполнить, нажав клавишу с запятой (;) в lnav. После нажатия клавиши отобразится наложение, показывающее все известные или обнаруженные поля, чтобы дать вам представление о том, какие данные доступны. Запрос может быть любым SQL-запросом, поддерживаемым SQLite. Чтобы упростить анализ, lnav включает множество дополнительных функций для обработки строк, путей и IP-адресов. См. Интерфейс SQLite для получения дополнительной информации.
Например, самый простой запрос для первоначального выполнения - это «select all», например:
SELECT * FROM logline
Когда этот запрос выполняется для второго примера сообщения журнала, приведенного выше, будут получены следующие результаты:
не возвращает результаты для всех сообщений, содержащихся в этом файле системного журнала. Скорее, он ищет сообщения, которые соответствуют формату для данной строки, и возвращает только эти сообщения в результатах. В данном случае это формат «Регистрация новой записи адреса для <IP> на <symbol>», что соответствует частям сообщения, которые не были распознаны как данные.
Конечно, можно делать более сложные запросы. Например, чтобы узнать частоту IP-адресов, упомянутых в этих сообщениях, вы можете запустить:
Поскольку этот тип запросов довольно распространен,
lnav
включает команду «summarize», которая будет вычислять частоты идентификаторов, а также минимальное, максимальное, среднее, медианное и стандартное отклонение для числовых столбцов. В этом случае вы можете выполнить следующее, чтобы вычислить частоты и вернуть упорядоченный набор результатов:
:summarize col_0
14.1 Распознаваемые типы данных
При поиске данных для извлечения из сообщений журнала
lnav
ищет следующий набор шаблонов:
Строки
Строки в одинарных и двойных кавычках. Пример: "The quick brown fox".
Отметки даты и времени в формате «YYYY-mm-DD» и «HH:MM:SS».
IP-адреса
IPv4 и IPv6-адреса. Примеры: 127.0.0.1, fe80::c62c:3ff:fe0e:e44a:en0
UUID
Обычное форматирование для 128-битных UUID. Пример: 0E305E39-F1E9-4DE4-B10B-5829E5DF54D0
Номера версий
Номера версий, разделенные точками. Пример: 3.7.17
Числа
Числа в десятичном, шестнадцатеричном и восьмеричном форматах. Примеры: 1234, 0xbeef, 0777
E-Mail-адреса
Строки, похожие на адрес электронной почты. Пример: [email protected]
Константы
Общие константы в языках, например: true, false, null, None.
Условные обозначения
Слова, соответствующие общепринятым условным обозначениям в языках программирования. Например, содержащие все заглавные буквы или разделенные двоеточиями. Пример: SOME_CONSTANT_VALUE, namespace::value
Глава пятнадцатая Часто задаваемые вопросы
15.1 Q: Как я могу копировать и вставлять без оформления?
Ответ
Сделать это можно несколькими способами:
Используйте горячие клавиши закладок, чтобы отметить строки, а затем нажмите c, чтобы скопировать на локальную системную клавиатуру.
Нажмите CTRL+l, чтобы временно переключиться в режим «lo-fi», в котором содержимое текущего представления выводится на терминал. Эта опция полезна, когда вы вошли на удаленный хост.
15.2 Q: Как я могу принудительно отформатировать файл?
Ответ
Формат журнала для файла определяется автоматически и не может быть принудительно установлен.
Решение
Добавьте несколько строк файла журнала в образец массива, а затем запустите lnav, чтобы получить подробное объяснение того, где шаблоны формата не соответствуют строкам образца.
Подробности
Первые строки файла сопоставляются с регулярными выражениями, определенными в определениях формата. Порядок форматов определяется автоматически, поэтому более конкретные форматы пробуются перед более общими. Следовательно, если ожидаемый формат не выбран для файла, это означает, что регулярные выражения, определенные этим форматом, не соответствуют первым нескольким строкам файла.
15.3 Q: Почему мой файл журнала подсвечивается неправильно?
TBD
15.4 Q: Почему не отображается файл?
Ответ
Файлы с неформатированным текстом отображаются отдельно от файлов журнала в представлении TEXT.
Решение
Нажмите клавишу t, чтобы переключиться в текстовое представление. Или откройте панель конфигурации файлов, нажимая TAB для переключения панелей, а затем нажимайте / для поиска интересующего вас файла. Если файл является журналом, необходимо создать новый формат журнала или модифицировать один из существующих.
Подробности
Если файл, отслеживаемый lnav, не соответствует известному формату файла журнала, он обрабатывается как неформатированный текст и будет отображаться в представлении TEXT.