|
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 красный фон: