Библиотека логирования и WFC-фреймворка, с большими возможностями кастомизации с помощью опций, обработчиков и конфигурационного файла в формате JSON.
- Документация doxygen.
- Репозитарий на github.com.
- Отчет coverage
Каждая строка лога состоит из временной отметки, имени лога (по умолчанию WLOG), типа сообщения и текста сообщения. Запись в лог осуществляется с помощью набора макросов, например:
#define WLOG_ENABLE_DEBUG_LOG // Don't disable DEBUG and TRACE in Release
#include <wlog/wlog.hpp>
#include <wlog/init.hpp>
int main()
{
wlog::init("example.log");
WLOG_MESSAGE( "Example N" << 1 << " message" )
WLOG_WARNING( "Example N" << 1 << " warning" )
WLOG_ERROR( "Example N" << 2 << " error" )
WLOG_DEBUG( "Example N" << 3 << " debug" )
WLOG_TRACE( "Example N" << 4 << " trace" )
return 0;
}
По умолчанию сообщения DEBUG и TRACE отключаются на уровне препроцессора в Release режиме.
- linux
- g++ 4.7 и выше, clang++
- cmake 2.8 и выше
- Стандарт c++11
- thread-safe
- Запись в файлы, stdout и syslog
- Не header-only
- Большие возможности кастомизации форматирования и ротирования как на уровне конфигурации, так и с помощью программных обработчиков
- Можно писать наборы логов в разные файлы с различным форматированием (в том числе stdout) и режимами ротации
- Динамическое реконфигурирование в любой момент времени
- Поддержка JSON-конфигурации с комментариями в Си-стиле
make shared && sudo make install
make static && sudo make install
Для сборки примеров и тестов, а также чтобы отключить поддержку JSON-конфигурации:
git clone https://github.com/mambaru/wlog.git
mkdir wlog/build
cd wlog/build
cmake ..
# Для сборки примеров и тестов
cmake -DBUILD_TESTING=ON ..
# Если поддержка JSON не требуется
cmake -DWLOG_DISABLE_JSON=ON ..
cmake --build make
ctest
Для компиляции с поддержкой JSON-конфигурации потребуются header-only библиотеки wjson и faslib, которые система сборки автоматически клонирует в директорию сборки, если не найдет их в системе или на том же уровне файловой системы, куда вы клонировали wlog, но для использования они не нужны.
main.cpp:
#include <wlog/logging.hpp>
#include <wlog/init.hpp>
#include <wlog/load.hpp>
int main()
{
wlog::init(wlog::load("{}"));
WLOG_MESSAGE("Hello")
}
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_FLAGS "-std=c++11")
add_subdirectory(wlog)
add_executable(main main.cpp)
include_directories(wlog)
target_link_libraries(main wlog)
git init
git submodule add https://github.com/mambaru/wlog.git
mkdir build
cd build
cmake ..
make
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_FLAGS "-std=c++11")
add_subdirectory(faslib)
add_subdirectory(wjson)
add_subdirectory(wlog)
include_directories(wlog wjson faslib)
add_executable(main main.cpp)
target_link_libraries(main wlog)
git init
git submodule add https://github.com/migashko/faslib.git
git submodule add https://github.com/mambaru/wjson.git
git submodule add https://github.com/mambaru/wlog.git
mkdir build
cd build
cmake ..
make
Если не вызвать wlog::init
то вывод будет на экран без форматирования и синхронизации. Вызывать wlog::init
можно в любое время в любом месте,
а также повторно для реконфигурации.
#include <wlog/init.hpp>
#include <wlog/load.hpp>
// По умолчанию вывод только в clog в цвете
wlog::init();
// Выводить с тысячными долями секунд и отключить цветовую раскраску
wlog::init(wlog::resolutions::milliseconds, wlog::colorized_flags::none);
// Выводить в файл и clog
wlog::init("main.log");
// Выводить с тысячными долями секунд в файл и clog и отключить цветовую раскраску для clog
wlog::init("main.log", wlog::resolutions::milliseconds, wlog::colorized_flags::none);
// Так можно задать все остальные опции
wlog::logger_options opt;
opt.path="main.log";
wlog::init(opt);
// Загрузить конфигурацию из файла
wlog::init(wlog::load("logger.json"));
// Загрузить конфигурацию из строки
wlog::init(wlog::load("{\"path\":\"main.log\"}"));
// Вариант с проверкой
std::string err;
opt = wlog::logger_options();
if ( wlog::load("logger.json", &opt, &err) )
wlog::init(opt);
else
std::cerr << "ERROR: " << err << std::endl;
Для вывода финального сообщения при завершении работы:
// Выключаем логирование
if (auto log = wlog::release() )
{
// Глобальный лог уже не доступен
// Но можем записать в лог финальное сообщение
log( wlog::time_point::clock::now(), "EXAMPLE4", "FINAL", "Bye!\n" );
}
Это может быть полезно, если нужна гарантия, что сообщение будет последним в файле лога (например, в многопоточной среде, и/или много отладочных сообщений в деструкторах объектов)
В каждом сообщении лога присутствуют четыре основные элемента, которые можно кастомизировать или скрывать:
- Дата и время + доли секунды
- Имя лога
- Тип сообщения:
- ERROR - ошибки, после которых система сохраняет работоспособность и согласованность данных
- WARNING - предупреждения, например о превышении размера очереди.
- MESSAGE - прочие уведомления
- FATAL - фатальная ошибка. Обычно далее следует останов системы
- BEGIN - начало какого либо процесса (например загрузка БД)
- END - окончание какого либо процесса (например загрузка БД)
- DEBUG - отладочные сообщения (отключается в релиз-версии на уровне препроцессора )
- TRACE - трассировка ввода/вывода (отключается в релиз-версии на уровне препроцессора )
- PROGRESS - трассировка прогресса длительных операций без перевода строки (например процент загрузки БД)
- Сообщение. Произвольный формат
По умолчанию используется лог WLOG в соответствующем наборе макросов:
//wlog/logging.hpp
#define WLOG_ERROR(X) WLOG_LOG_ERROR ( "WLOG", X )
#define WLOG_WARNING(X) WLOG_LOG_WARNING ( "WLOG", X )
#define WLOG_MESSAGE(X) WLOG_LOG_MESSAGE ( "WLOG", X )
#define WLOG_FATAL(X) WLOG_LOG_FATAL ( "WLOG", X )
#define WLOG_BEGIN(X) WLOG_LOG_BEGIN ( "WLOG", X )
#define WLOG_END(X) WLOG_LOG_END ( "WLOG", X )
#define WLOG_DEBUG(X) WLOG_LOG_DEBUG ( "WLOG", X )
#define WLOG_TRACE(X) WLOG_LOG_TRACE ( "WLOG", X )
#define WLOG_PROGRESS(X) WLOG_LOG_PROGRESS( "WLOG", X )
Аналогичным образом можно сделать свой набор макросов для каждого лога. Если не устраивает предлагаемых сообщений, то можно задать свой, аналогично набору макросов для работы с syslog:
//wlog/logging.hpp
#define WSYSLOG_EMERG(X) WLOG( "SYSLOG", "EMERG", X)
#define WSYSLOG_ALERT(X) WLOG( "SYSLOG", "ALERT", X)
#define WSYSLOG_CRIT(X) WLOG( "SYSLOG", "CRIT", X)
#define WSYSLOG_ERR(X) WLOG( "SYSLOG", "ERR", X)
#define WSYSLOG_WARNING(X) WLOG( "SYSLOG", "WARNING", X)
#define WSYSLOG_NOTICE(X) WLOG( "SYSLOG", "NOTICE", X)
#define WSYSLOG_INFO(X) WLOG( "SYSLOG", "INFO", X)
#define WSYSLOG_DEBUG(X) WLOG( "SYSLOG", "DEBUG", X)
Пример использования:
WLOG_MESSAGE("Это " << 10 << " сообщение" )
WLOG_ERROR("Это " << 25 << " ошибка" )
Здесь и далее будут приводиться примеры конфигурации в JSON-формате. Имена полей полностью совпадают с полями структур конфигурации. В неочевидных случаях, например при использовании перечислений, будут приведены примеры на C++. JSON-конфигурация, со значениями по умолчанию. Если значения по умолчанию вас устраивают, то эти поля можно удалять:
{
/* Список доступных логов и типов сообщений */
"allow": [],
/* Список запрещенных логов и типов сообщений */
"deny": [],
/* Путь к файлу лога */
"path": "",
/* Синхронная запись (открыть-записать-закрыть) */
"sync": true,
/* --- Опции ротации --- */
/* Начинать лог с начала файла (старый лог сохраняется, если задан rotation) */
"startup_rotate": false,
/* Ограничение лога по размеру (в байтах) */
"size_limit": 0,
/* Ограничение лога по времени (в секундах) */
"time_limit": 0,
/* Включить сохранение логов при ротации (макс. кол-во файлов) */
"rotation": 0,
/* Сопроводительное сообщение ротирование в начале файла */
"rotation_header": true,
/* Сопроводительное сообщение ротирование в конце файла */
"rotation_footer": true,
/* По умолчание к имени файла добавляется внутренний счетчи, если указать эту функцию - то unixtime*/
"unixtime_suffix": false,
/* --- Опции форматирования --- */
// Ширина поля имени лога (в символах)
"name_width": 6,
// Ширина поля типа сообщения (в символах)
"ident_width": 9,
/* Точность отображения времени (от наносекунд до года) */
"resolution": "seconds",
/* Формат представления даты и времени в формате strftime (игнорируется если заданы resolution (от minutes и выше) или любые комбинации hide) */
"datetime_format": "",
/* Перечисление скрываемых частей сообщения */
"hide": "none",
/* Локаль */
"locale": "",
/* Включить цветовую схему при записи в файл */
"colorized": "none",
/* Карта цветов*/
"color_map": {},
/* --- Кастомизация --- */
/* Настройки стандартного вывода */
"stdout": {
/* Возможные значения: cout, clog, cerr и # для запрета вывода */
"name":"cout",
/* Делать flush после каждого сообщения */
"sync": false,
/* Включить цветовую схему при записи в stdout */
"colorized": "all",
/* -- остальные опции форматирования -- */
},
/* Настройки записи в системный лог */
"syslog": {
/* Имя для syslog. Если не указан (по умолчанию) то запись в syslog не ведется*/
"name":""
},
/* Индивидуальные настройки для логов и типов сообщений */
"customize": [ /* рассмотрим далее */ ]
}
Минимальная конфигурация:
{}
В этом случае запись в файл и syslog не производится, а вывод только в std::cout
в цвете. Чтобы отключить раскраску:
{
"stdout": {
"colorized": "none",
}
}
Для записи в файл достаточно указать путь:
{
"path":"/path/to/log/file.log"
}
Чтобы запретить вывод в stdout, а в файл выводить в цвете:
{
"path":"/path/to/log/file.log"
"colorized": "none",
"stdout": {
"name":"#"
}
}
Чтобы запретить запись сообщений конкретного лога или типов сообщений всех логов, нужно перечислить их в массиве deny
, например для того чтобы отфильтровать "мусор" в Debug режиме:
{
"path": "/path/to/log/file.log",
"deny": ["DEBUG", "TRACE"]
}
Чтобы разрешить запись сообщений конкретного лога или некоторые типы сообщений, нужно перечислить их в массиве allow
, например для того чтобы разрешить только сообщения лога MYLOG, и сообщения ERROR остальных логов:
{
"path": "/path/to/log/file.log",
"allow": ["MYLOG", "ERROR"]
}
Ускорить запись в лог примерно в три раза, но без гарантий в случае аварийных падений:
{
"path": "/path/to/log/file.log",
"sync": false
}
По умолчанию запись происходит в один и тот же файл, без ограничений. Чтобы при каждом запуске запись происходила с начала файла:
{
"path": "/path/to/log/file.log",
"startup_rotate": true
}
Чтобы при этом сохранялся лог от предыдущего запуска в файле /path/to/log/file.log.old-0
:
{
"path": "/path/to/log/file.log",
"startup_rotate": true,
"rotation": 1
}
Без указанных ограничений на размер или время, значения rotation
больше единицы не дают эффекта.
Для обнуления файла при достижении заданного размера (1МБ):
{
"path": "/path/to/log/file.log",
"size_limit": 1048576
}
В следующий конфигурации при запуске, запись будет продолжена в указанный лог, но при достижении размера в 1МБ файл будет переименован '/path/to/log/file.log.old-0' и запись начнется с начала файла:
{
"path": "/path/to/log/file.log",
"size_limit": 1048576,
"rotation": 1
}
Запись в новый файл при запуске и сохранении истории в 10 файлов, с размером не более 1 МБ каждый:
{
"path": "/path/to/log/file.log",
"startup_rotate": true,
"size_limit": 1048576,
"rotation": 10
}
Посуточная ротация файлов с историей за месяц:
{
"path": "/path/to/log/file.log",
"time_limit": 86400,
"rotation": 30
}
Посекундные срезы (например при трассировании трафика при большой нагрузке ):
{
"path": "/path/to/log/file.log",
"startup_rotate": true,
"time_limit": 1,
"rotation": 1024
}
С помощью unixtime_suffix
можно изменить алгоритм формирования файла с простого счетчика на unixtime, например file-1521107160.log
.
В случае падений или повторной инициализации счетчики сбрасываются и старые файлы не удаляются. В случае с обычными счетчиками они в конечном итоге перезапишутся,
а при unixtime
нужно удалять вручную.
По умолчанию, при ротации, в начало и конец файла записывается дополнительная информация, которую можно с помощью опций rotation_header
и rotation_footer
:
! ---------------- rotated ----------------
! Start time: Thu Mar 15 12:50:35 2018
! Summary size: 209
! Total Rotated: 1
! Previous log: ./example_j1.log
! -----------------------------------------
2018-03-15 12:50:35.255 WLOG MESSAGE Demo progress LOG
2018-03-15 12:50:35.255 WLOG BEGIN Progress...
2018-03-15 12:50:35.256 WLOG WARNING Test WARNING message №0
2018-03-15 12:50:36.398 WLOG TRACE Test TRACE message №1000
2018-03-15 12:50:37.548 WLOG DEBUG Test DEBUG message №2000
2018-03-15 12:50:41.002 WLOG BEGIN Test BEGIN message №5000
2018-03-15 12:50:42.154 WLOG END Test END message №6000
2018-03-15 12:50:43.304 WLOG MESSAGE Test MESSAGE message №7000
2018-03-15 12:50:44.455 EXAMPL MESSAGE Test MESSAGE message №8000
2018-03-15 12:50:45.607 EXAMPL WARNING Test WARNING message №9000
! ---------------- rotated ----------------
! Start time: Thu Mar 15 12:50:35 2018
! Summary size: 1067
! Total Rotated: 1
! Previous log: ./example_j1.log
! -----------------------------------------
Для отображения долей секунд используется опция resolution
со следующими значениями: seconds
(без долей), deciseconds
, centiseconds
, milliseconds
, microseconds
или nanoseconds
, например:
{
"path": "/path/to/log/file.log",
"resolution": "milliseconds"
}
Изменить отображение даты и времени можно с помощью дополнительных значений 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 |
Пример:
{
"path": "/path/to/log/file.log",
"resolution": "milliseconds",
"hide":"year|month|seconds"
}
wlog::logger_options opt;
opt.path="/path/to/log/file.log";
opt.resolution = wlog::resolutions::milliseconds;
opt.hide = wlog::hide_flags::year|wlog::hide_flags::month|wlog::hide_flags::seconds;
Wed 27 17:53.17548 WLOG DEBUG Тестовое DEBUG сообщение №22000
Wed 27 17:53.18734 WLOG ERROR Тестовое ERROR сообщение №23000
Wed 27 17:53.19914 WLOG FATAL Тестовое FATAL сообщение №24000
Для представления даты и времени в формате strftime можно с помощью опции datetime_format
. Но нужно иметь ввиду,
что в этом случае нельзя использовать resolution
со значениями minutes
, hours
, days
, month
, year
и любые комбинации hide.
Для resolution
со значениями deciseconds
, centiseconds
, milliseconds
, microseconds
или nanoseconds
доли секунды записываются
сразу после строки времени через разделитель.
Для локализации отображения datetime_format
используется, соответственно, locale
. Задана только locale
, но не заданы другие опции форматирования
даты и времени, то datetime_format == "%c"
{
"path": "/path/to/log/file.log",
"resolution": "milliseconds",
"locale": "ru_RU.UTF-8"
}
Ср 27 дек 2017 18:03:29,864 EXAMPLE [DEBUG] Тестовое DEBUG сообщение №11000
Ср 27 дек 2017 18:03:31,144 EXAMPLE [ERROR] Тестовое ERROR сообщение №12000
Ср 27 дек 2017 18:03:32,426 EXAMPLE [FATAL] Тестовое FATAL сообщение №13000
{
"path": "/path/to/log/file.log",
"resolution": "milliseconds",
"locale": "en_US.UTF-8"
}
Wed 27 Dec 2017 06:04:35 PM MSK.057 WLOG TRACE Тестовое TRACE сообщение №1000
Wed 27 Dec 2017 06:04:36 PM MSK.331 WLOG DEBUG Тестовое DEBUG сообщение №2000
Wed 27 Dec 2017 06:04:37 PM MSK.608 WLOG ERROR Тестовое ERROR сообщение №3000
Наследует и/или переопределяет все настройки форматирования. Если опция определена в секции stdout
то используется она, если нет,
то опция из основной секции или значение по умолчанию. Исключение составляет опция colorized
, у которой в основной
секции по умолчанию значение none
, но если она не определен в секции stdout
, то по умолчанию значение all
. Иными словами,
по умолчанию, в основной лог запись идет без цветовой раскраски, а на экран в цвете. Также по умолчанию sync
отключена и не наследуется.
{
/* ... */
"stdout": {
/* Имя стандартного вывода (cout, cerr, clog)*/
"name": "cout",
"sync": false,
"name_width": 6,
"ident_width": 9,
"resolution": "seconds",
"datetime_format": "",
"hide": "",
"locale": "",
"colorized": "all",
"color_map": {}
}
}
Если в основной секции определены datetime_format
или locale
, но вы не хотите их наследовать то используйте значение #
, а для resolution
и colorized
- none
.
Здесь основная идея в том, что как правило нет нужды применять разное форматирование для файлов и stdout, но если очень хочется, то можно. Чаще всего требуется отключить цветовую раскраску
или изменить stdout, а в остальном применяется такое же форматирование как и для файлов.
Для каждого лога, набра логов и даже типов сообщений, можно применить собственный набор настроек форматирования и ротации.
{
/* --- основные настройки --- */
"customize": [
{
"names":["DEBUG", "MYLOG"],
/* здесь доступны все опции основной секции, за исключением customize*/
}
]
}
Чтобы вывести DEBUG и TRACE сообщения в отдельный файл:
{
"path": "/path/to/log/file.log",
"customize": [
{
"names":["DEBUG", "TRACE"],
"path": "/path/to/log/file-Debug.log",
"sync":false,
"startup_rotate": true,
"size_limit": 1048576,
"rotation": 1,
"stdout":{"name": "#"}
}
]
}
Здесь в основной файл будет производиться без ротации, а в file-Debug.log ограничение в 1МБ. Также запрещаем выводить эти сообщения в stdout, и отключаем синхронную запись для ускорения. Если не указывать путь, то запись будет вестись в основной файл. Чтобы отладочные сообщения выводить только на экран, а все остальные только в файл:
{
"path": "/path/to/log/file.log",
"stdout":{"name": "#"}
"customize": [
{
"names":["DEBUG", "TRACE"],
"path": "#",
"stdout":{"name": "cerr"}
}
]
}
Можно выводить все сообщения лога в отдельный файл, или каждый тип сообщений по разным файлам указав в знак $ вместо пути:
{
/* запрещаем DEBUG и TRACE сообщения
"deny": ["DEBUG", "TRACE"],
"path": "/path/to/log/file.log",
"customize": [
{
/* Для всех сообщений MYLOG, включая DEBUG и TRACE*/
"names":["MYLOG1", "MYLOG2"],
/* но исключая PROGRESS */
"deny": ["PROGRESS"],
/* пишем в /path/to/log/file-MYLOG1.log и /path/to/log/file-MYLOG1.log */
"path":"$"
},
{
/* Для всех сообщений MYLOG, включая DEBUG и TRACE*/
"names":["MYLOG3", "MYLOG4"],
/* пишем MYLOG3 и MYLOG4 в /path/to/log/file-MYLOG34.log */
"path":"$MYLOG34"
}, {
// все сообщения "PROGRESS" выводим только в stdout
"names":["PROGRESS"],
"path":"#"
}
]
}
Обратите внимание все сообщения заблокированные deny
в секции customize
, не отбрасываются, поэтому сообщения PROGRESS будут писаться в основной лог, если не сделать отдельную кастомизацию.
Для записи в syslog достаточно задать имя в соответствующей секции конфигурации, однако в этом случае в syslog будут писаться все сообщения всех логов, что и в основной файл, а не только лога SYSLOG. Чтобы исправить это:
{
"path": "/path/to/log/file.log",
"customize": [
{
"names":["SYSLOG"],
"syslog":{
"name":"myprj"
}
}
]
}
Для управление цветовой схемой используются опции colorized
(для указания раскраски элементов записи лога) и color_map
(для изменения цветовой схемы).
Значения colorized
:
- none - отключить раскраску
- date - дата
- time - время
- fraction - доли секунды
- name - имя лога
- notice - тип сообщения
- ident - тип сообщения
- message - текст сообщения (если не задан в color_map, то в цвет ident)
- all - включить в раскраску все элементы
Для цветовой схемы, в качестве ключа используется имя лога, тип сообщения или одно из специальных значений:
- $all - всю строку одним цветом (например чтобы выделить ошибку)
- $date - цвет даты
- $time - цвет времени
- $fraction - доли секунды
- $name - цвет имени лога
- $ident - цвет типа сообщения
- $message - цвет текста сообщения
В качестве значения номер цвета, или его названия
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 в пурпурный цвет :
{
"stdout": {
"color_map":{"MYLOG":"light_magenta"}
}
}
Делаем для сообщений FATAL красный фон:
{
"customize": [
{
"names":["FATAL"],
"stdout": {
"color_map":{"$all":"41"}
}
}
]
}