wlog
|
Библиотека логирования и WFC-фреймворка, с большими возможностями кастомизации с помощью опций, обработчиков и конфигурационного файла в формате JSON.
Каждая строка лога состоит из временной отметки, имени лога (по умолчанию WLOG), типа сообщения и текста сообщения. Запись в лог осуществляется с помощью набора макросов, например:
По умолчанию сообщения DEBUG и TRACE отключаются на уровне препроцессора в Release режиме.
Для сборки примеров и тестов, а также чтобы отключить поддержку JSON-конфигурации:
Для компиляции с поддержкой JSON-конфигурации потребуются header-only библиотеки wjson и faslib, которые система сборки автоматически клонирует в директорию сборки, если не найдет их в системе или на том же уровне файловой системы, куда вы клонировали wlog, но для использования они не нужны.
main.cpp:
CMakeLists.txt:
CMakeLists.txt:
Если не вызвать wlog::init
то вывод будет на экран без форматирования и синхронизации. Вызывать wlog::init
можно в любое время в любом месте, а также повторно для реконфигурации.
Для вывода финального сообщения при завершении работы:
Это может быть полезно, если нужна гарантия, что сообщение будет последним в файле лога (например, в многопоточной среде, и/или много отладочных сообщений в деструкторах объектов)
В каждом сообщении лога присутствуют четыре основные элемента, которые можно кастомизировать или скрывать:
По умолчанию используется лог WLOG в соответствующем наборе макросов:
Аналогичным образом можно сделать свой набор макросов для каждого лога. Если не устраивает предлагаемых сообщений, то можно задать свой, аналогично набору макросов для работы с syslog:
Пример использования:
Здесь и далее будут приводиться примеры конфигурации в JSON-формате. Имена полей полностью совпадают с полями структур конфигурации. В неочевидных случаях, например при использовании перечислений, будут приведены примеры на C++. JSON-конфигурация, со значениями по умолчанию. Если значения по умолчанию вас устраивают, то эти поля можно удалять:
Минимальная конфигурация:
В этом случае запись в файл и syslog не производится, а вывод только в std::cout
в цвете. Чтобы отключить раскраску:
Для записи в файл достаточно указать путь:
Чтобы запретить вывод в stdout, а в файл выводить в цвете:
Чтобы запретить запись сообщений конкретного лога или типов сообщений всех логов, нужно перечислить их в массиве deny
, например для того чтобы отфильтровать "мусор" в Debug режиме:
Чтобы разрешить запись сообщений конкретного лога или некоторые типы сообщений, нужно перечислить их в массиве allow
, например для того чтобы разрешить только сообщения лога MYLOG, и сообщения ERROR остальных логов:
Ускорить запись в лог примерно в три раза, но без гарантий в случае аварийных падений:
По умолчанию запись происходит в один и тот же файл, без ограничений. Чтобы при каждом запуске запись происходила с начала файла:
Чтобы при этом сохранялся лог от предыдущего запуска в файле /path/to/log/file.log.old-0
:
Без указанных ограничений на размер или время, значения rotation
больше единицы не дают эффекта. Для обнуления файла при достижении заданного размера (1МБ):
В следующий конфигурации при запуске, запись будет продолжена в указанный лог, но при достижении размера в 1МБ файл будет переименован '/path/to/log/file.log.old-0' и запись начнется с начала файла:
Запись в новый файл при запуске и сохранении истории в 10 файлов, с размером не более 1 МБ каждый:
Посуточная ротация файлов с историей за месяц:
Посекундные срезы (например при трассировании трафика при большой нагрузке ):
С помощью unixtime_suffix
можно изменить алгоритм формирования файла с простого счетчика на unixtime, например file-1521107160.log
. В случае падений или повторной инициализации счетчики сбрасываются и старые файлы не удаляются. В случае с обычными счетчиками они в конечном итоге перезапишутся, а при unixtime
нужно удалять вручную. По умолчанию, при ротации, в начало и конец файла записывается дополнительная информация, которую можно с помощью опций rotation_header
и rotation_footer
:
Для отображения долей секунд используется опция resolution
со следующими значениями: seconds
(без долей), deciseconds
, centiseconds
, milliseconds
, microseconds
или nanoseconds
, например:
Изменить отображение даты и времени можно с помощью дополнительных значений resolution
: minutes
, hours
, days
, month
, year
которые влияют на отображение информации, также как опция hide
. Опция hide
позволяет скрыть несколько частей сообщения в любой комбинации. Таблица возможных значений для hide
:
date
- все поле датыtime
- все поле времениyear
- год в поле датыmonth
- месяц в поле датыweekday
- день недели в поле датыdays
- день месяца в поле датыhours
- часы в поле времениminutes
- минуты в поле времениseconds
- секунды в поле времениfraction
- доли секундыname
- имя логаident
- идентификатор сообщенияmessage
- текст сообщенияЗначения частично скрывающие поля даты и времени влияют на формат отображения этих полей. Частично hide
перекрывают resolution
. Общая рекомендация - если необходимого представления возможно добиться с помощью опции resolution
, то используем ее.
Далее, для удобства, отдельно приведены таблицы для полей даты и времени.
Возможные комбинации для hide
и аналогичные resolution
для поля времени с примерами отображения:
hide | resolution | Пример отображения |
---|---|---|
milliseconds | 18:36:12.805 | |
fraction | seconds | 18:36:12 |
fraction|seconds | minutes | 18:36 |
fraction|seconds|minutes | hours | 18h |
Следующий вывод можно добиться только с помощью hide
для resolution
==milliseconds
:
hide | Пример отображения | Комментарий |
---|---|---|
hours | 01m 55s.405 | Сомнительно. Например при поминутных слепках. |
hours|minutes | 1514304173.456 | Если нужен unixtime. |
hours|minutes|fraction | 1514304173 | Если нужен unixtime>. Но лучше hide=hours|minutes и resolution=seconds |
hours|minutes|seconds | .456 | Бесполезно. |
hours|seconds | 26m.37642 | Сомнительно (доли минуты в resolution). Например при поминутных слепках. |
minutes|seconds | 19h.1631487 | Сомнительно (доли часа в resolution). Например при часовых слепках. |
Возможные комбинации для hide
и аналогичные resolution
для поля времени с примерами вывода:
hide | resolution | Пример отображения |
---|---|---|
time | days | 2017-12-27 |
time|days | month | 2017 Dec |
time|days|month | year | 2017 |
Следующий вывод даты можно добиться только с помощью hide
:
hide | Пример отображения | Комментарий |
---|---|---|
year | Wed Dec 27 | |
year|month | Wed 27 | |
year|month|weekday | 27 | |
month | 27 Wed 2017 | |
day | 2017 Dec | |
minutes|seconds | 19h.1631487 |
Пример:
Для представления даты и времени в формате strftime можно с помощью опции datetime_format
. Но нужно иметь ввиду, что в этом случае нельзя использовать resolution
со значениями minutes
, hours
, days
, month
, year
и любые комбинации hide. Для resolution
со значениями deciseconds
, centiseconds
, milliseconds
, microseconds
или nanoseconds
доли секунды записываются сразу после строки времени через разделитель.
Для локализации отображения datetime_format
используется, соответственно, locale
. Задана только locale
, но не заданы другие опции форматирования даты и времени, то datetime_format == "%c"
Наследует и/или переопределяет все настройки форматирования. Если опция определена в секции stdout
то используется она, если нет, то опция из основной секции или значение по умолчанию. Исключение составляет опция colorized
, у которой в основной секции по умолчанию значение none
, но если она не определен в секции stdout
, то по умолчанию значение all
. Иными словами, по умолчанию, в основной лог запись идет без цветовой раскраски, а на экран в цвете. Также по умолчанию sync
отключена и не наследуется.
Если в основной секции определены datetime_format
или locale
, но вы не хотите их наследовать то используйте значение #
, а для resolution
и colorized
- none
. Здесь основная идея в том, что как правило нет нужды применять разное форматирование для файлов и stdout, но если очень хочется, то можно. Чаще всего требуется отключить цветовую раскраску или изменить stdout, а в остальном применяется такое же форматирование как и для файлов.
Для каждого лога, набра логов и даже типов сообщений, можно применить собственный набор настроек форматирования и ротации.
Чтобы вывести DEBUG и TRACE сообщения в отдельный файл:
Здесь в основной файл будет производиться без ротации, а в file-Debug.log ограничение в 1МБ. Также запрещаем выводить эти сообщения в stdout, и отключаем синхронную запись для ускорения. Если не указывать путь, то запись будет вестись в основной файл. Чтобы отладочные сообщения выводить только на экран, а все остальные только в файл:
Можно выводить все сообщения лога в отдельный файл, или каждый тип сообщений по разным файлам указав в знак $ вместо пути:
Обратите внимание все сообщения заблокированные deny
в секции customize
, не отбрасываются, поэтому сообщения PROGRESS будут писаться в основной лог, если не сделать отдельную кастомизацию.
Для записи в syslog достаточно задать имя в соответствующей секции конфигурации, однако в этом случае в syslog будут писаться все сообщения всех логов, что и в основной файл, а не только лога SYSLOG. Чтобы исправить это:
Для управление цветовой схемой используются опции colorized
(для указания раскраски элементов записи лога) и color_map
(для изменения цветовой схемы). Значения colorized
:
Для цветовой схемы, в качестве ключа используется имя лога, тип сообщения или одно из специальных значений:
В качестве значения номер цвета, или его названия
black | 30 |
red | 31 |
green | 32 |
brown | 33 |
blue | 34 |
magenta | 35 |
cyan | 36 |
gray | 37 |
dark_gray | 90 |
light_red | 91 |
light_green | 92 |
yellow | 93 |
light_blue | 94 |
light_magenta | 95 |
light_cyan | 96 |
white | 97 |
Раскрашиваем имя лога MYLOG в пурпурный цвет :
Делаем для сообщений FATAL красный фон: