{"id":17857829,"url":"https://github.com/newyaroslav/log-it-cpp","last_synced_at":"2025-08-14T09:31:49.256Z","repository":{"id":259633127,"uuid":"860703647","full_name":"NewYaroslav/log-it-cpp","owner":"NewYaroslav","description":" LogIt++ is a flexible and versatile C++ logging library with support for various backends and stream-based output.","archived":false,"fork":false,"pushed_at":"2024-12-05T05:57:39.000Z","size":2329,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-05T06:30:24.348Z","etag":null,"topics":["cpp","cpp11","log","logger","logger-backend","logger-interface","logger-middleware","logging","logs"],"latest_commit_sha":null,"homepage":"https://newyaroslav.github.io/log-it-cpp/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NewYaroslav.png","metadata":{"files":{"readme":"README-RU.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-21T01:06:46.000Z","updated_at":"2024-12-05T05:57:19.000Z","dependencies_parsed_at":"2024-12-05T06:36:52.485Z","dependency_job_id":null,"html_url":"https://github.com/NewYaroslav/log-it-cpp","commit_stats":{"total_commits":17,"total_committers":2,"mean_commits":8.5,"dds":0.05882352941176472,"last_synced_commit":"c91f50c1a56cdf4fb5e58d4888ab1553b961ef52"},"previous_names":["newyaroslav/log-it-cpp"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Flog-it-cpp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Flog-it-cpp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Flog-it-cpp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewYaroslav%2Flog-it-cpp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NewYaroslav","download_url":"https://codeload.github.com/NewYaroslav/log-it-cpp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":229816012,"owners_count":18128512,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","cpp11","log","logger","logger-backend","logger-interface","logger-middleware","logging","logs"],"created_at":"2024-10-28T04:04:05.611Z","updated_at":"2025-08-14T09:31:49.170Z","avatar_url":"https://github.com/NewYaroslav.png","language":"C++","readme":"# LogIt++ Library\n![LogIt++ Logo](docs/logo-640x320.png)\n\n## Введение\n\n**LogIt++** — это гибкая и универсальная библиотека логирования на C++, которая поддерживает различные бэкенды и потоковый вывод. Она предоставляет простой в использовании интерфейс для логирования сообщений с разными уровнями важности и позволяет настраивать форматы и назначения логов.\n\nБиблиотека сочетает простоту макросов для логирования, аналогичную **IceCream-Cpp**, и возможности настройки бэкендов и форматов логов, как в **spdlog**. LogIt++ полностью совместим с `C++11`.\n\n## Возможности\n\n- **Гибкое форматирование логов**: \n\nНастраивайте формат сообщений логов с помощью паттернов. Вы можете переопределить паттерны через макросы или указать их напрямую при добавлении бэкенда логгера. Поддерживаются как стандартные флаги форматирования (`%H`, `%M`, `%S`, `%v` и другие), так и специальные, такие как `%N([...])` для указания fallback-логов без аргументов.\n\n```\n#define LOGIT_CONSOLE_PATTERN \"%H:%M:%S.%e | %^%N([%!g:%#])%v%$\"\n\ntry {\n    throw std::runtime_error(\"An example runtime error\");\n} catch (const std::exception\u0026 ex) {\n    LOGIT_FATAL(ex);\n}\n\n// Вывод:\n\u003e 23:59:59.128 | An example runtime error\n```\n\n- **Логирование с использованием макросов**: \n\nЛегко логируйте переменные и сообщения с помощью макросов. Просто выберите подходящий макрос и передайте переменные или аргументы.\n\t\n```\nfloat someFloat = 123.456f;\nint someInt = 789;\nLOGIT_INFO(someFloat, someInt);\n\nauto now = std::chrono::system_clock::now();\nLOGIT_PRINT_INFO(\"TimePoint example: \", now);\n```\n\n- **Поддержка нескольких бэкендов**: \n\nЛегко настройте логгеры для вывода в консоль и файлы. При необходимости добавьте отправку сообщений на сервер или в базу данных, создавая собственные бэкенды.\n\n```\n// Добавление трёх бэкендов: консольного, файлового и уникального файлового логгера\nLOGIT_ADD_CONSOLE_DEFAULT();\nLOGIT_ADD_FILE_LOGGER_DEFAULT();\nLOGIT_ADD_UNIQUE_FILE_LOGGER_DEFAULT_SINGLE_MODE();\n```\n\n- **Асинхронное логирование**: \n\nУлучшите производительность приложения с помощью асинхронного логирования. Все логгеры по умолчанию обрабатывают сообщения в отдельном потоке.\n\n- **Потоковое логирование**: \n\nИспользуйте операторы потоков для сложных сообщений.\n\n```\nLOGIT_STREAM_INFO() \u003c\u003c \"Stream-based info logging with short macro. Integer value: \" \u003c\u003c 123;\n```\n\n- **Расширяемость**: \n\nСоздавайте собственные логгеры и форматтеры для удовлетворения ваших специфических потребностей.\n\n```\nclass CustomLogger : public logit::ILogger {\npublic:\n    CustomLogger() = default;\n\n    /// \\brief Логирует сообщение, форматируя запись и сообщение.\n    /// \\param record Лог-запись с деталями события.\n    /// \\param message Отформатированное сообщение лога.\n    void log(const logit::LogRecord\u0026 record, const std::string\u0026 message) override {\n        // Реализация отправки логов...\n    }\n\n    ~CustomLogger() override = default;\n};\n\nLOGIT_ADD_LOGGER(CustomLogger, (), logit::SimpleLogFormatter, (\"%v\"));\n```\n\n---\n\n## Использование\n\nНиже приведен простой пример использования LogIt++ в вашем приложении:\n\n```cpp\n#define LOGIT_SHORT_NAME\n#include \u003cLogIt.hpp\u003e\n\nint main() {\n\t// Инициализация логгера с выводом в консоль по умолчанию\n\tLOGIT_ADD_CONSOLE_DEFAULT();\n\n\tfloat a = 123.456f;\n\tint b = 789;\n\tint c = 899;\n\tconst char* someStr = \"Hello, World!\";\n\n\t// Базовое логирование с использованием макросов\n\tLOG_INFO(\"Starting the application\");\n\tLOG_DEBUG(\"Variable values\", a, b);\n\tLOG_WARN(\"This is a warning message\");\n\n\t// Логирование с форматированием\n\tLOG_PRINTF_INFO(\"Formatted log: value of a = %.2f\", a);\n\tLOG_FORMAT_WARN(\"%.4d\", b, c);\n\n\t// Логирование ошибок и фатальных ошибок\n\tLOG_ERROR(\"An error occurred\", b);\n\tLOG_FATAL(\"Fatal error. Terminating application.\");\n\n\t// Условное логирование\n\tLOG_ERROR_IF(b \u003c 0, \"Value of b is negative\");\n\tLOG_WARN_IF(a \u003e 100, \"Value of a exceeds 100\");\n\n\t// Потоковое логирование с использованием коротких и длинных макросов\n\tLOG_S_INFO() \u003c\u003c \"Logging a float: \" \u003c\u003c a \u003c\u003c \", and an int: \" \u003c\u003c b;\n\tLOG_S_ERROR() \u003c\u003c \"Error occurred in the system\";\n\tLOGIT_STREAM_WARN() \u003c\u003c \"Warning: potential issue detected with value: \" \u003c\u003c someStr;\n\n\t// Использование LOGIT_TRACE для трассировки выполнения функций\n\tLOGIT_TRACE0();\t // Trace without arguments\n\tLOG_PRINT_TRACE(\"Entering main function with variable a =\", a);\n\n\t// Ожидание завершения всех асинхронных операций логирования\n\tLOGIT_WAIT();\n\n\treturn 0;\n}\n```\n\nДля получения дополнительных примеров использования обратитесь к папке `examples` в репозитории, где можно найти подробные демонстрации различных сценариев логирования и конфигураций.\n\n---\n\n## Настройка форматов логов\n\n`LogIt++` поддерживает настраиваемое форматирование сообщений с использованием паттернов, которые определяют вид каждого сообщения. Вы можете задавать паттерны через макросы или передавать их при добавлении бэкендов логгера.\n\n### Пример формата\n\nПример задания пользовательского формата для консольного логгера:\n\n```\nLOGIT_ADD_LOGGER(\n    logit::ConsoleLogger, (), \n    logit::SimpleLogFormatter, \n    (\"%Y-%m-%d %H:%M:%S.%e [%l] %^%N(%g:%#)%v%$\")\n);\n```\n\nИли задайте паттерн с использованием макросов:\n\n```\n#define LOGIT_CONSOLE_PATTERN \"%H:%M:%S.%e | %^%N([%!g:%#])%v%$\"\nLOGIT_ADD_CONSOLE_DEFAULT();\n```\n\nЛоггер автоматически подставит в шаблон указанные данные, например:\n\n```\n23:59:59.128 | path/to/file.cpp:123 A sample log message\n```\n\n### Флаги форматирования сообщений\n\n`LogIt++` поддерживает настраиваемое форматирование сообщений лога с использованием флагов форматирования. Вы можете задать, как должно выглядеть каждое сообщение лога, используя заполнители для различных данных, таких как временная метка, уровень лога, имя файла, имя функции и сообщение.\n\nНиже приведен список поддерживаемых флагов форматирования:\n\n- *Флаги форматирования даты и времени*:\n\n\t- `%Y`: Год (например, 2024)\n\t- `%m`: Месяц (01-12)\n\t- `%d`: День месяца (01-31)\n\t- `%H`: Час (00-23)\n\t- `%M`: Минута (00-59)\n\t- `%S`: Секунда (00-59)\n\t- `%e`: Миллисекунда (000-999)\n\t- `%C`: Двузначный год (например, 24 для 2024 года)\n\t- `%c`: Полная дата и время (например, Пн Окт 4 12:45:30 2024)\n\t- `%D`: Короткая дата (например, 04/10/24)\n\t- `%T`, `%X`: Время в формате ISO 8601 (например, 12:45:30)\n\t- `%F`: Дата в формате ISO 8601 (например, 2024-10-04)\n\t- `%s`, `%E`: Unix-временная метка в секундах\n\t- `%ms`: Unix-временная метка в миллисекундах\n\t- `%b`: Сокращенное название месяца (например, Янв)\n\t- `%B`: Полное название месяца (например, Январь)\n\t- `%a`: Сокращенное название дня недели (например, Пн)\n\t- `%A`: Полное название дня недели (например, Понедельник)\n\n- *Флаги уровня логирования*:\n\n\t- `%l`: Полный уровень лога (например, INFO, ERROR)\n\t- `%L`: Сокращенный уровень лога (например, I для INFO, E для ERROR)\n\t\n- *Флаги для файла и функции*:\n\n\t- `%f`, `%fn`, `%bs`: Имя исходного файла\n\t- `%g`, `%ffn`: Полный путь к файлу\n\t- `%#`: Номер строки\n\t- `%!`: Имя функции\n\t\n- *Флаги потоков*:\n\n\t- `%t`: Идентификатор потока\n\t\n- *Флаги цвета*:\n\n\t- `%^`: Начало цветового форматирования\n\t- `%$`: Конец цветового форматирования\n\t- `%SC`: Начало удаления цветовых кодов (Strip Color)\n\t- `%EC`: Конец удаления цветовых кодов (End Color)\n\n- *Флаги сообщения*:\n\n\t- `%v`: Содержимое сообщения лога\n\t- `%N(...)`: Используется как замена, если нет аргументов (*например, при вызове* `LOG_TRACE0()`). В скобках указывается шаблон для вывода. Пример: `%N(%g:%#)` добавит имя файла и номер строки, если нет сообщения.\n\n### Поддержка выравнивания и обрезки текста\n\n`LogIt++` позволяет форматировать текст сообщения с помощью ширины (`width`), выравнивания и обрезки:\n\n- Выравнивание:\n\t- Левое: Используется знак `-` перед числом ширины, например: `%-10v`.\n\t- Центрирование: Используется знак `=` перед числом ширины, например: `%=10v`.\n\t- Правое (по умолчанию): `%10v`.\n\n- Обрезка:\n\t- Символ `!` после числа ширины указывает, что текст нужно обрезать, если он превышает заданную длину. Пример: `%10!v`.\n\n**Примеры**:\n\n- `%10v` – правое выравнивание сообщения на 10 символов.\n- `%-10v` – левое выравнивание сообщения на 10 символов.\n- `%10!v` – обрезка текста до 10 символов с правым выравниванием.\n- `%-10!v` – левое выравнивание сообщения с обрезкой до 10 символов.\n\n### Продвинутая обработка путей\n\nДля флагов, связанных с файлами (%f, %g, %@), при обрезке строки обеспечивается сохранение имени файла и начала пути, а средняя часть заменяется на ..., если ширина меньше длины пути.\n\n**Пример:**\n\n- Вход: `/very/long/path/to/file.cpp`\n- Обрезано до ширины 15: `/very...file.cpp`\n\n---\n\n## Укороченные макросы для логирования\n\n`LogIt++` предоставляет укороченные версии макросов для логирования, когда определён флаг `LOGIT_SHORT_NAME`. Эти макросы позволяют лаконично логировать сообщения на разных уровнях, включая стандартное и потоковое логирование.\n\n### Доступные макросы для уровня TRACE:\n\n- Основное логирование:\n\n\t- `LOG_T(...)`: Регистрирует сообщение уровня TRACE.\n\t- `LOG_T0()`: Регистрирует сообщение уровня TRACE без аргументов.\n\t- `LOG_0T()`: Псевдоним для `LOG_T0()`.\n\t- `LOG_0_T()`: Псевдоним для `LOG_T0()`.\n\t- `LOG_T_NOARGS()`: Псевдоним для `LOG_T0()`.\n\t- `LOG_NOARGS_T()`: Псевдоним для `LOG_T0()`.\n\t\n- Логирование с форматированием:\n\n\t- `LOG_TF(fmt, ...)`: Регистрирует отформатированное сообщение уровня TRACE с использованием строк формата.\n\t- `LOG_FT(fmt, ...)``: Псевдоним для `LOG_TF(fmt, ...)`.\n\t- `LOG_T_PRINT(...)`: Регистрирует сообщение уровня TRACE, печатая каждый аргумент.\n\t- `LOG_PRINT_T(...)`: Псевдоним для `LOG_T_PRINT(...)`.\n\t- `LOG_T_PRINTF(fmt, ...)`: Регистрирует отформатированное сообщение уровня TRACE с использованием форматирования в стиле printf.\n\t- `LOG_PRINTF_T(fmt, ...)`: Псевдоним для `LOG_T_PRINTF(fmt, ...)`.\n\t- `LOG_TP(...)`: Псевдоним для `LOG_T_PRINT(...)`.\n\t- `LOG_PT(...)`: Псевдоним для `LOG_T_PRINT(...)`.\n\t- `LOG_TPF(fmt, ...)`: Псевдоним для `LOG_T_PRINTF(fmt, ...)`.\n\t- `LOG_PFT(fmt, ...)`: Псевдоним для `LOG_T_PRINTF(fmt, ...)`.\n\t\n- Альтернативные макросы уровня `TRACE`:\n\n\t- `LOG_TRACE(...)`: Регистрирует сообщение уровня TRACE (то же, что и `LOG_T(...)`).\n\t- `LOG_TRACE0()`: Регистрирует сообщение уровня TRACE без аргументов (то же, что и `LOG_T0()`).\n\t- `LOG_0TRACE()`: Псевдоним для `LOG_TRACE0()`.\n\t- `LOG_0_TRACE()`: Псевдоним для `LOG_TRACE0()`.\n\t- `LOG_TRACE_NOARGS()`: Регистрирует сообщение уровня TRACE без аргументов (то же, что и `LOG_T_NOARGS()`).\n\t- `LOG_NOARGS_TRACE()`: Псевдоним для `LOG_TRACE_NOARGS()`.\n\t- `LOG_TRACEF(fmt, ...)`: Регистрирует отформатированное сообщение уровня TRACE (то же, что и `LOG_TF(fmt, ...)`).\n\t- `LOG_FTRACE(fmt, ...)`: Псевдоним для `LOG_TRACEF(fmt, ...)`.\n\t- `LOG_TRACE_PRINT(...)`: Регистрирует сообщение уровня TRACE, печатая каждый аргумент (то же, что и `LOG_T_PRINT(...)`).\n\t- `LOG_PRINT_TRACE(...)`: Псевдоним для `LOG_TRACE_PRINT(...)`.\n\t- `LOG_TRACE_PRINTF(fmt, ...)`: Регистрирует отформатированное сообщение уровня TRACE с использованием форматирования в стиле printf (так же, как `LOG_T_PRINTF(fmt, ...)`).\n\t- `LOG_PRINTF_TRACE(fmt, ...)`: Псевдоним для `LOG_TRACE_PRINTF(fmt, ...)`.\n\n\nЭти макросы обеспечивают гибкость и удобство при регистрации сообщений на уровне TRACE. Они позволяют выбирать между различными стилями регистрации, такими как стандартная регистрация, форматированная регистрация и печать каждого аргумента отдельно.\n\n**Примечание**: Аналогичные макросы доступны для других уровней журнала — **INFO** (`LOG_I`, `LOG_INFO`), **DEBUG** (`LOG_D`, `LOG_DEBUG`), **WARN** (`LOG_W`, `LOG_WARN`), **ERROR** (`LOG_E`, `LOG_ERROR`) и **FATAL** (`LOG_F`, `LOG_FATAL`). Соглашения об именовании одинаковы для всех уровней, вам нужно только заменить букву уровня или слово в имени макроса.\n\n- Пример:\n\n```cpp\nLOG_T(\"Trace message using short macro\");\nLOG_TF(\"%.4d\", 999);\nLOG_T_PRINT(\"Printing trace message with multiple variables: \", var1, var2);\nLOG_TRACE(\"Trace message (alias for LOG_T)\");\nLOG_TRACE_PRINTF(\"Formatted trace: value = %d\", value);\n```\n\n---\n\n## Конфигурационные макросы\n\nLogIt++ предоставляет несколько макросов, которые позволяют настраивать библиотеку под ваши нужды. Ниже приведены доступные конфигурационные макросы:\n\n- **LOGIT_BASE_PATH**: Определяет базовый путь, используемый для файлов логов. Если `LOGIT_BASE_PATH` не определен или пуст (`{}`), будет использоваться полный путь из переменной `__FILE__`. Вы можете переопределить это, указав собственный базовый путь для логов.\n\n```cpp\n#define LOGIT_BASE_PATH \"/path/to/your/project\"\n```\n\n- **LOGIT_DEFAULT_COLOR**: Определяет цвет консоли по умолчанию. Если `LOGIT_DEFAULT_COLOR` не определен, по умолчанию используется `TextColor::LightGray`. Вы можете установить собственный цвет текста для консоли, переопределив этот макрос.\n\n```cpp\n#define LOGIT_DEFAULT_COLOR TextColor::Green\n```\n\n- **LOGIT_CURRENT_TIMESTAMP_MS**: Макрос для получения текущей временной метки в миллисекундах. По умолчанию используется `std::chrono` для получения метки времени. Вы можете переопределить этот макрос, чтобы использовать собственную функцию получения времени.\n\n```cpp\n#define LOGIT_CURRENT_TIMESTAMP_MS() my_custom_timestamp_function()\n```\n\n- **LOGIT_CONSOLE_PATTERN**: Определяет шаблон лога для вывода в консоль. Этот шаблон контролирует формат сообщений, отправляемых в консоль, включая временную метку, сообщение и цвет. Если `LOGIT_CONSOLE_PATTERN` не определен, он по умолчанию установлен на `%H:%M:%S.%e | %^%v%$`.\n\n```cpp\n#define LOGIT_CONSOLE_PATTERN \"%H:%M:%S.%e | %^%v%$\"\n```\n\n- **LOGIT_FILE_LOGGER_PATH**: Определяет путь к каталогу для логов. Если `LOGIT_FILE_LOGGER_PATH` не определен, по умолчанию используется *\"data/logs\"*. Вы можете задать этот путь для управления тем, где будут храниться логи.\n\n```cpp\n#define LOGIT_FILE_LOGGER_PATH \"/custom/log/directory\"\n```\n\n- **LOGIT_FILE_LOGGER_AUTO_DELETE_DAYS**: Определяет количество дней, по истечении которых старые файлы логов будут удалены. Если `LOGIT_FILE_LOGGER_AUTO_DELETE_DAYS` не определен, по умолчанию используется `30` дней. Вы можете задать это значение для управления политикой хранения логов.\n\n```cpp\n#define LOGIT_FILE_LOGGER_AUTO_DELETE_DAYS 60  // Хранить логи 60 дней\n```\n\n- **LOGIT_FILE_LOGGER_PATTERN**: Определяет шаблон лога для файловых логгеров. Этот шаблон контролирует формат сообщений, записываемых в файлы логов, включая временную метку, имя файла, номер строки, имя функции и информацию о потоке. Если `LOGIT_FILE_LOGGER_PATTERN` не определен, используется по умолчанию `[%Y-%m-%d %H:%M:%S.%e] [%ffn:%#] [%!] [thread:%t] [%l] %SC%v`.\n\n```cpp\n#define LOGIT_FILE_LOGGER_PATTERN \"[%Y-%m-%d %H:%M:%S.%e] [%l] %SC%v\"\n```\n\n- **LOGIT_UNIQUE_FILE_LOGGER_PATH**: Определяет путь по умолчанию для уникальных файлов логов. Если `LOGIT_UNIQUE_FILE_LOGGER_PATH` не определен, используется *\"data/logs/unique_logs\"*. Вы можете указать собственный путь для уникальных файлов логов.\n\n```cpp\n#define LOGIT_UNIQUE_FILE_LOGGER_PATH \"/custom/unique/log/directory\"\n```\n\n- **LOGIT_UNIQUE_FILE_LOGGER_PATTERN**: Определяет шаблон лога для уникальных файлов логов. Если `LOGIT_UNIQUE_FILE_LOGGER_PATTERN` не определен, по умолчанию используется `\"%v\"`. Вы можете настроить этот шаблон для управления форматом сообщений в уникальных файлах.\n\n```cpp\n#define LOGIT_UNIQUE_FILE_LOGGER_PATTERN \"%v\"\n```\n\n- **LOGIT_UNIQUE_FILE_LOGGER_HASH_LENGTH**: Определяет длину хеша, используемого в уникальных именах файлов логов. Если `LOGIT_UNIQUE_FILE_LOGGER_HASH_LENGTH` не определен, по умолчанию используется `8` символов. Это обеспечивает уникальные имена файлов для каждого лога.\n\n```cpp\n#define LOGIT_UNIQUE_FILE_LOGGER_HASH_LENGTH 12\t // Set hash length to 12 characters\n```\n\n- **LOGIT_SHORT_NAME**: Включает короткие имена для макросов логирования, таких как `LOG_T`, `LOG_D`, `LOG_E` и другие, для более лаконичных записей логов.\n\n- **LOGIT_USE_FMT_LIB**: Включает использование библиотеки fmt для форматирования строк.\n\n---\n\n## Пример пользовательского логгера и форматтера\n\nВы можете расширить возможности LogIt++ с помощью реализации собственных логгеров и форматтеров. Вот как это сделать:\n\n### Пример пользовательского логгера\n\n```cpp\n#include \u003cfstream\u003e\n#include \u003cmutex\u003e\n#include \u003cLogIt.hpp\u003e\n\nclass FileLogger : public logit::ILogger {\npublic:\n\tFileLogger(const std::string\u0026 file_name) : m_file_name(file_name) {\n\t\tm_log_file.open(file_name, std::ios::out | std::ios::app);\n\t}\n\n\t~FileLogger() {\n\t\tif (m_log_file.is_open()) {\n\t\t\tm_log_file.close();\n\t\t}\n\t}\n\n\tvoid log(const logit::LogRecord\u0026 record, const std::string\u0026 message) override {\n\t\tstd::lock_guard\u003cstd::mutex\u003e lock(m_mutex);\n\t\tif (m_log_file.is_open()) {\n\t\t\tm_log_file \u003c\u003c message \u003c\u003c std::endl;\n\t\t}\n\t}\n\n\tvoid wait() override {}\n\nprivate:\n\tstd::string m_file_name;\n\tstd::ofstream m_log_file;\n\tstd::mutex m_mutex;\n};\n```\n\n### Пример пользовательского форматтера\n\n```cpp\n#include \u003cLogIt.hpp\u003e\n#include \u003cjson/json.h\u003e\n\nclass JsonLogFormatter : public logit::ILogFormatter {\npublic:\n\tstd::string format(const logit::LogRecord\u0026 record) const override {\n\t\tJson::Value log_entry;\n\t\tlog_entry[\"level\"] = static_cast\u003cint\u003e(record.log_level);\n\t\tlog_entry[\"timestamp_ms\"] = record.timestamp_ms;\n\t\tlog_entry[\"file\"] = record.file;\n\t\tlog_entry[\"line\"] = record.line;\n\t\tlog_entry[\"function\"] = record.function;\n\t\tlog_entry[\"message\"] = record.format;\n\n\t\tJson::StreamWriterBuilder writer;\n\t\treturn Json::writeString(writer, log_entry);\n\t}\n};\n```\n\n---\n\n## Установка\n\nLogIt++ — это библиотека, работающая только с заголовками. Чтобы интегрировать её в ваш проект, выполните следующие шаги:\n\n1. Клонируйте репозиторий с его подмодулями:\n\n```bash\ngit clone --recurse-submodules https://github.com/NewYaroslav/log-it-cpp.git\n```\n2. Включите заголовочные файлы LogIt++ в ваш проект:\n\n```cpp\n#include \u003cLogIt.hpp\u003e\n```\n\n3. Настройте пути к заголовочным файлам для зависимостей, таких как time-shield-cpp.\n\nLogIt++ зависит от *time-shield-cpp*, который находится в папке `libs` как подмодуль. Убедитесь, что путь к `libs\\time-shield-cpp\\include` добавлен в каталоги заголовков вашего проекта. Если вы используете IDE, такие как *Visual Studio* или *CLion*, вы можете добавить этот путь в настройках проекта.\n\n4. (Необязательно) Включите поддержку библиотеки fmt:\n\nLogIt++ поддерживает библиотеку *fmt* для продвинутого форматирования строк, которая также включена как подмодуль. Чтобы включить *fmt* в LogIt++, определите макрос `LOGIT_USE_FMT_LIB` в вашем проекте:\n\n```cpp\n#define LOGIT_USE_FMT_LIB\n```\n\n### Emscripten\n\nПри сборке с Emscripten библиотека работает в однопоточном режиме. ConsoleLogger\nфункционирует как обычно, а файловые логгеры заменены на заглушки, которые\nвыводят предупреждение при использовании.\n\n---\n\n## Документация\n\nПодробную документацию для LogIt++, включая описание API и примеры использования, можно найти [здесь](https://newyaroslav.github.io/log-it-cpp/).\n\n---\n\n## Лицензия\nЭта библиотека распространяется под лицензией MIT. Подробности смотрите в файле [LICENSE](https://github.com/NewYaroslav/log-it-cpp/blob/main/LICENSE) в репозитории.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewyaroslav%2Flog-it-cpp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnewyaroslav%2Flog-it-cpp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewyaroslav%2Flog-it-cpp/lists"}