std/logging
Исходный кодИзменитьЭтот модуль реализует простой регистратор.
Он разработан максимально просто, чтобы избежать избыточности. Если эта библиотека не удовлетворяет вашим потребностям, напишите свою собственную.
Основное использование
Для начала создайте регистратор:
import std/logging var logger = newConsoleLogger()
Созданный выше регистратор записывает в консоль, но этот модуль также предоставляет регистраторы, которые записывают в файлы, такие как FileLogger. Также возможно создание пользовательских регистраторов, наследуя от типа Logger.
После создания регистратора вызовите его процедуру log для записи сообщения:
logger.log(lvlInfo, "a log message") # Output: INFO a log message
Значение INFO в выводе является результатом форматированной строки, которая добавляется перед сообщением, и оно будет отличаться в зависимости от уровня сообщения. Форматированные строки подробно описаны здесь.
Существует шесть уровней регистрации: debug, info, notice, warn, error и fatal. Они подробно описаны в документации перечисления Level. Сообщение регистрируется, если его уровень не ниже уровня регистратора в поле levelThreshold и глобального фильтра регистрации. Последний может быть изменён с помощью процедуры setLogFilter.
flushThreshold при создании регистратора, чтобы изменить это.Обработчики
При использовании нескольких регистраторов вызов процедуры log для каждого регистратора может стать повторяющимся действием. Вместо этого зарегистрируйте каждый используемый регистратор с помощью процедуры addHandler, что продемонстрировано в следующем примере:
import std/logging
var consoleLog = newConsoleLogger()
var fileLog = newFileLogger("errors.log", levelThreshold=lvlError)
var rollingLog = newRollingFileLogger("rolling.log")
addHandler(consoleLog)
addHandler(fileLog)
addHandler(rollingLog) После этого используйте либо шаблон log template, либо один из шаблонов определённого уровня, например, error template, чтобы записать сообщения сразу во все зарегистрированные обработчики.
# This example uses the loggers created above
log(lvlError, "an error occurred")
error("an error occurred") # Equivalent to the above line
info("something normal happened") # Will not be written to errors.log Обратите внимание, что уровень сообщения по-прежнему проверяется для каждого обработчика относительно его levelThreshold и глобального фильтра регистрации.
Форматированные строки
Сообщения регистрации предваряются форматированными строками. Эти строки содержат заполнитель для переменных, таких как $time, которые заменяются соответствующими значениями, такими как текущее время, перед добавлением их к сообщению регистрации. Символы, которые не являются частью переменных, остаются неизменными.
Форматированная строка, используемая регистратором, может быть задана, передавая аргумент fmtStr при создании регистратора или установив его поле fmtStr позже. Если не задано, используется стандартная форматированная строка.
Доступны следующие переменные, которые должны быть префиксрованы знаком доллара ($) :
| Переменная | Вывод |
|---|---|
| $date | Текущая дата |
| $time | Текущее время |
| $datetime | $dateT$time |
| $app | os.getAppFilename() |
| $appname | Базовое имя $app
|
| $appdir | Имя директории $app
|
| $levelid | Первая буква уровня регистрации |
| $levelname | Название уровня регистрации |
Обратите внимание, что $app, $appname, и $appdir не поддерживаются при использовании JavaScript-бекенда.
Следующий пример иллюстрирует использование форматированных строк:
import std/logging var logger = newConsoleLogger(fmtStr="[$time] - $levelname: ") logger.log(lvlInfo, "this is a message") # Output: [19:50:13] - INFO: this is a message
Примечания при использовании нескольких потоков
Необходимо учитывать несколько моментов при использовании этого модуля в нескольких потоках:
- Глобальный фильтр регистрации фактически является локальной переменной потока, поэтому его нужно задавать в каждом потоке, который использует этот модуль.
- Список зарегистрированных обработчиков также является локальной переменной потока. Если обработчик будет использоваться в нескольких потоках, его нужно регистрировать в каждом из этих потоков.
См. также
- Модуль strutils для общих функций строк
- Модуль strformat для интерполяции строк и форматирования
-
Модуль strscans для макросов
scanfиscanp, которые предлагают более простой способ извлечения подстрок, чем регулярные выражения
Импорты
- strutils, times, os
Типы
ConsoleLogger = ref object of Logger useStderr*: bool ## If true, writes to stderr; otherwise, writes to stdout flushThreshold*: Level ## Only messages that are at or above this ## threshold will be flushed immediately-
Регистратор, который записывает сообщения регистрации в консоль.
Создайте новый
ConsoleLoggerс помощью процедуры newConsoleLogger.См. также:
Исходный код Изменить FileLogger = ref object of Logger file*: File ## The wrapped file flushThreshold*: Level ## Only messages that are at or above this ## threshold will be flushed immediately-
Регистратор, который записывает сообщения регистрации в файл.
Создайте новый
FileLoggerс помощью процедуры newFileLogger.Примечание: Этот регистратор недоступен для JavaScript-бекенда.
См. также:
Исходный код Изменить Level = enum lvlAll, ## All levels active lvlDebug, ## Debug level and above are active lvlInfo, ## Info level and above are active lvlNotice, ## Notice level and above are active lvlWarn, ## Warn level and above are active lvlError, ## Error level and above are active lvlFatal, ## Fatal level and above are active lvlNone ## No levels active; nothing is logged
-
Перечисление уровней регистрации.
Сообщения debug представляют собой самый низкий уровень регистрации, а сообщения fatal error - самый высокий.
lvlAllможет использоваться для включения всех сообщений, аlvlNone- для их отключения.Типичное использование каждого уровня регистрации, от самого низкого до самого высокого, описано ниже:
- Debug - отладочная информация, полезная только для разработчиков
- Info - информация, связанная с нормальной работой и не имеющая особой важности
- Notice - более важная информация, о которой пользователи должны быть уведомлены
- Warn - предстоящие проблемы, требующие внимания
- Error - ситуации ошибок, от которых приложение может восстановиться
- Fatal - фатальные ошибки, препятствующие дальнейшей работе приложения
Как использовать каждый уровень, полностью зависит от приложения.
У каждого регистратора есть поле
Исходный код ИзменитьlevelThreshold, которое отфильтровывает сообщения с уровнем ниже порога. Также существует глобальный фильтр, который применяется ко всем сообщениям регистрации, и он может быть изменён с помощью процедуры setLogFilter. Logger = ref object of RootObj levelThreshold*: Level ## Only messages that are at or above this ## threshold will be logged fmtStr*: string ## Format string to prepend to each log message; ## defaultFmtStr is the default-
Абстрактный базовый тип всех регистраторов.
Пользовательские регистраторы должны наследовать от этого типа. Они также должны предоставлять собственную реализацию метода log.
См. также:
Исходный код Изменить RollingFileLogger = ref object of FileLogger
-
Регистратор, который записывает сообщения регистрации в файл с вращением логов.
Создайте новый
RollingFileLoggerс помощью процедуры newRollingFileLogger.Примечание: Этот регистратор недоступен для JavaScript-бекенда.
См. также:
Исходный код Изменить
Константы
defaultFmtStr = "$levelname "
- Стандартная форматированная строка. Исходный код Изменить
LevelNames: array[Level, string] = ["DEBUG", "DEBUG", "INFO", "NOTICE", "WARN", "ERROR", "FATAL", "NONE"]- Массив строк, представляющих каждый уровень регистрации. Исходный код Изменить
verboseFmtStr = "$levelid, [$datetime] -- $appname: "
-
Более подробная форматированная строка.
Эта строка может быть передана как аргумент
frmStrдля процедур создания новых регистраторов, таких как newConsoleLogger.Если предпочтительна другая форматированная строка, ознакомьтесь с документацией по форматированным строкам для получения дополнительной информации, включая список доступных переменных.
Исходный код Изменить
Процедуры
proc addHandler(handler: Logger) {....raises: [], tags: [], forbids: [].}- Добавляет логгер в список зарегистрированных обработчиков.Предупреждение: Список обработчиков — это локальная переменная потока. Если данный обработчик будет использоваться в нескольких потоках, эту процедуру следует вызывать в каждом из этих потоков.
См. также:
Пример:
var logger = newConsoleLogger() addHandler(logger) doAssert logger in getHandlers()
Исходный код Редактировать proc defaultFilename(): string {....raises: [], tags: [ReadIOEffect], forbids: [].}-
Возвращает имя файла, используемое по умолчанию при именовании лог-файлов.
Примечание: Эта процедура недоступна для бэкенда JavaScript.
Исходный код Редактировать proc getHandlers(): seq[Logger] {....raises: [], tags: [], forbids: [].}-
Возвращает список всех зарегистрированных обработчиков.
См. также:
Исходный код Редактировать proc getLogFilter(): Level {....raises: [], tags: [], forbids: [].}-
Получает глобальный фильтр логов.
См. также:
Исходный код Редактировать proc newConsoleLogger(levelThreshold = lvlAll; fmtStr = defaultFmtStr; useStderr = false; flushThreshold = defaultFlushThreshold): ConsoleLogger {. ...raises: [], tags: [], forbids: [].}-
Создаёт новый ConsoleLogger.
По умолчанию сообщения логов записываются в
stdout. ЕслиuseStderrравно true, они записываются вstderrвместо этого.Для бэкенда JavaScript сообщения логов записываются в консоль, и
useStderrигнорируется.См. также:
- процедуру newFileLogger, использующую дескриптор файла
- процедуру newFileLogger, принимающую имя файла
- процедуру newRollingFileLogger
Примеры:
var normalLog = newConsoleLogger() var formatLog = newConsoleLogger(fmtStr=verboseFmtStr) var errorLog = newConsoleLogger(levelThreshold=lvlError, useStderr=true)
Исходный код Редактировать proc newFileLogger(file: File; levelThreshold = lvlAll; fmtStr = defaultFmtStr; flushThreshold = defaultFlushThreshold): FileLogger {. ...raises: [], tags: [], forbids: [].}-
Создаёт новый FileLogger, использующий предоставленный дескриптор файла.
Примечание: Эта процедура недоступна для бэкенда JavaScript.
См. также:
- процедуру newConsoleLogger
- процедуру newFileLogger, принимающую имя файла
- процедуру newRollingFileLogger
Примеры:
var messages = open("messages.log", fmWrite) var formatted = open("formatted.log", fmWrite) var errors = open("errors.log", fmWrite) var normalLog = newFileLogger(messages) var formatLog = newFileLogger(formatted, fmtStr=verboseFmtStr) var errorLog = newFileLogger(errors, levelThreshold=lvlError)Исходный код Редактировать proc newFileLogger(filename = defaultFilename(); mode: FileMode = fmAppend; levelThreshold = lvlAll; fmtStr = defaultFmtStr; bufSize: int = -1; flushThreshold = defaultFlushThreshold): FileLogger {. ...raises: [IOError], tags: [], forbids: [].}-
Создаёт новый FileLogger, записывающий в файл с указанным именем.
bufSizeуправляет размером буфера вывода, используемого при записи в лог-файл. Доступны следующие значения:-
-1— использовать системные значения по умолчанию -
0— не буферизовать -
> 0— фиксированный размер буфера
Примечание: Эта процедура недоступна для бэкенда JavaScript.
См. также:
- процедуру newConsoleLogger
- процедуру newFileLogger, использующую дескриптор файла
- процедуру newRollingFileLogger
Примеры:
var normalLog = newFileLogger("messages.log") var formatLog = newFileLogger("formatted.log", fmtStr=verboseFmtStr) var errorLog = newFileLogger("errors.log", levelThreshold=lvlError)Исходный код Редактировать -
proc newRollingFileLogger(filename = defaultFilename(); mode: FileMode = fmReadWrite; levelThreshold = lvlAll; fmtStr = defaultFmtStr; maxLines: Positive = 1000; bufSize: int = -1; flushThreshold = defaultFlushThreshold): RollingFileLogger {. ...raises: [IOError, OSError], tags: [ReadDirEffect, ReadIOEffect], forbids: [].}-
Создаёт новый RollingFileLogger.
После того, как текущий лог-файл, в который происходит запись, содержит
maxLinesстрок, будет создан новый лог-файл, а старый лог-файл будет переименован.bufSizeуправляет размером буфера вывода, используемого при записи в лог-файл. Доступны следующие значения:-
-1— использовать системные значения по умолчанию -
0— не буферизовать -
> 0— фиксированный размер буфера
Примечание: Эта процедура недоступна в бэкенде JavaScript.
См. также:
- процедуру newConsoleLogger
- процедуру newFileLogger, использующую дескриптор файла
- процедуру newFileLogger, принимающую имя файла
Примеры:
var normalLog = newRollingFileLogger("messages.log") var formatLog = newRollingFileLogger("formatted.log", fmtStr=verboseFmtStr) var shortLog = newRollingFileLogger("short.log", maxLines=200) var errorLog = newRollingFileLogger("errors.log", levelThreshold=lvlError)Исходный код Редактировать -
proc removeHandler(handler: Logger) {....raises: [], tags: [], forbids: [].}-
Удаляет логгер из списка зарегистрированных обработчиков.
Обратите внимание, что при n-кратном регистрации логгера требуется n вызовов этой процедуры для его удаления.
Исходный код Редактировать proc setLogFilter(lvl: Level) {....raises: [], tags: [], forbids: [].}-
Устанавливает глобальный фильтр логов.
Сообщения ниже указанного уровня не будут регистрироваться независимо от
levelThresholdотдельного логгера. По умолчанию все сообщения регистрируются.Предупреждение: Глобальный фильтр логов — это локальная переменная потока. Если выполняется регистрация логов в нескольких потоках, эта процедура должна вызываться в каждом потоке, если не предполагается, что разные потоки должны регистрировать логи на разных уровнях.См. также:
Пример:
setLogFilter(lvlError) doAssert getLogFilter() == lvlError
Исходный код Редактировать proc substituteLog(frmt: string; level: Level; args: varargs[string, `$`]): string {. ...raises: [], tags: [ReadIOEffect, TimeEffect], forbids: [].}-
Форматирует сообщение лога на указанном уровне с использованием заданной строки формата.
Переменные формата формата, присутствующие в
frmt, будут заменены соответствующими значениями до того, как будут добавлены кargsи возвращены.Если вы не реализуете собственный логгер, нет необходимости вызывать это напрямую. Используйте либо метод log логгера, либо один из шаблонов логгирования.
См. также:
- метод log для ConsoleLogger
- метод log для FileLogger
- метод log для RollingFileLogger
- шаблон логгирования
Пример:
doAssert substituteLog(defaultFmtStr, lvlInfo, "a message") == "INFO a message" doAssert substituteLog("$levelid - ", lvlError, "an error") == "E - an error" doAssert substituteLog("$levelid", lvlDebug, "error") == "Derror"Исходный код Редактировать
Методы
method log(logger: ConsoleLogger; level: Level; args: varargs[string, `$`]) {. ...raises: [], tags: [ReadIOEffect, TimeEffect, WriteIOEffect], forbids: [].}-
Записывает в консоль с использованием только данного ConsoleLogger.
Этот метод игнорирует список зарегистрированных обработчиков.
Будет ли сообщение записано, зависит как от поля
levelThresholdConsoleLogger, так и от глобального фильтра логов, установленного с помощью процедуры setLogFilter.Примечание: По умолчанию только сообщения об ошибках и критических ошибках заставляют буфер вывода немедленно сбросить. Установите
flushThresholdпри создании логгера, чтобы изменить это.См. также:
- метод log для FileLogger
- метод log для RollingFileLogger
- шаблон лога
Примеры:
var consoleLog = newConsoleLogger() consoleLog.log(lvlInfo, "this is a message") consoleLog.log(lvlError, "error code is: ", 404)
Исходный код Редактировать method log(logger: FileLogger; level: Level; args: varargs[string, `$`]) {. ...raises: [IOError], tags: [WriteIOEffect, ReadIOEffect, TimeEffect], forbids: [].}-
Записывает сообщение на указанном уровне с использованием только данного FileLogger.
Этот метод игнорирует список зарегистрированных обработчиков.
Будет ли сообщение записано, зависит как от поля
levelThresholdFileLogger, так и от глобального фильтра логов, установленного с помощью процедуры setLogFilter.Примечания:
- По умолчанию только сообщения об ошибках и критические ошибки заставляют буфер вывода немедленно сбросить. Установите
flushThresholdпри создании логгера, чтобы изменить это. - Этот метод недоступен для JavaScript-бэкенда.
См. также:
- метод log для ConsoleLogger
- метод log для RollingFileLogger
- шаблон лога
Примеры:
var fileLog = newFileLogger("messages.log") fileLog.log(lvlInfo, "this is a message") fileLog.log(lvlError, "error code is: ", 404)Исходный код Редактировать - По умолчанию только сообщения об ошибках и критические ошибки заставляют буфер вывода немедленно сбросить. Установите
method log(logger: Logger; level: Level; args: varargs[string, `$`]) {. ...raises: [Exception], gcsafe, tags: [RootEffect], base, ...forbids: [].}-
Переопределите этот метод в пользовательских логгерах. По умолчанию реализация ничего не делает.
См. также:
- метод log для ConsoleLogger
- метод log для FileLogger
- метод log для RollingFileLogger
- шаблон лога
method log(logger: RollingFileLogger; level: Level; args: varargs[string, `$`]) {. ...raises: [OSError, IOError], tags: [ReadDirEffect, ReadIOEffect, WriteIOEffect, TimeEffect], forbids: [].}-
Записывает сообщение на указанном уровне с использованием только данного RollingFileLogger.
Этот метод игнорирует список зарегистрированных обработчиков.
Будет ли сообщение записано, зависит как от поля
levelThresholdRollingFileLogger, так и от глобального фильтра логов, установленного с помощью процедуры setLogFilter.Примечания:
- По умолчанию только сообщения об ошибках и критические ошибки заставляют буфер вывода немедленно сбросить. Установите
flushThresholdпри создании логгера, чтобы изменить это. - Этот метод недоступен для JavaScript-бэкенда.
См. также:
- метод log для ConsoleLogger
- метод log для FileLogger
- шаблон лога
Примеры:
var rollingLog = newRollingFileLogger("messages.log") rollingLog.log(lvlInfo, "this is a message") rollingLog.log(lvlError, "error code is: ", 404)Исходный код Редактировать - По умолчанию только сообщения об ошибках и критические ошибки заставляют буфер вывода немедленно сбросить. Установите
Шаблоны
template debug(args: varargs[string, `$`])
-
Записывает отладочное сообщение во все зарегистрированные обработчики.
Отладочные сообщения, как правило, полезны только разработчику приложения, и они обычно отключены в релизных сборках, хотя этот шаблон не делает этого различия.
Примеры:
var logger = newConsoleLogger() addHandler(logger) debug("myProc called with arguments: foo, 5")См. также:
Исходный код Редактировать template error(args: varargs[string, `$`])
-
Записывает сообщение об ошибке во все зарегистрированные обработчики.
Сообщения об ошибках предназначены для условий ошибок уровня приложения, таких как при возникновении исключения из-за какого-либо пользовательского ввода. Обычно приложение продолжит работу, но с ухудшенной функциональностью или потерей данных, и эти эффекты могут быть видны пользователям.
Примеры:
var logger = newConsoleLogger() addHandler(logger) error("An exception occurred while processing the form.")См. также:
Исходный код Редактировать template fatal(args: varargs[string, `$`])
-
Записывает сообщение о критической ошибке во все зарегистрированные обработчики.
Сообщения о критических ошибках обычно указывают на то, что приложение не может продолжать работу и завершится из-за критического состояния. Этот шаблон только записывает сообщение, и ответственность за корректное завершение приложения лежит на приложении.
Примеры:
var logger = newConsoleLogger() addHandler(logger) fatal("Can't open database -- exiting.")См. также:
Исходный код Редактировать template info(args: varargs[string, `$`])
-
Записывает информационное сообщение во все зарегистрированные обработчики.
Информационные сообщения обычно генерируются во время нормальной работы приложения и не имеют особого значения. Может быть полезно агрегировать эти сообщения для последующего анализа.
Примеры:
var logger = newConsoleLogger() addHandler(logger) info("Application started successfully.")См. также:
Исходный код Редактировать template log(level: Level; args: varargs[string, `$`])
-
Записывает сообщение на указанном уровне во все зарегистрированные обработчики.
Будет ли сообщение записано, зависит как от поля
levelThresholdFileLogger, так и от глобального фильтра логов, установленного с помощью процедуры setLogFilter.Примеры:
var logger = newConsoleLogger() addHandler(logger) log(lvlInfo, "This is an example.")
См. также:
- шаблон отладки
- шаблон info
- шаблон notice
- шаблон предупреждения
- шаблон ошибки
- шаблон критической ошибки
template notice(args: varargs[string, `$`])
-
Записывает сообщение notice во все зарегистрированные обработчики.
Сообщения notice по смыслу очень похожи на информационные сообщения, но они предназначены для сообщений, о которых пользователь должен быть активно проинформирован, в зависимости от приложения.
Примеры:
var logger = newConsoleLogger() addHandler(logger) notice("An important operation has completed.")См. также:
Исходный код Редактировать template warn(args: varargs[string, `$`])
-
Записывает предупреждение во все зарегистрированные обработчики.
Предупреждение — это сообщение, не являющееся ошибкой, которое может указывать на предстоящие проблемы или снижение производительности.
Примеры:
var logger = newConsoleLogger() addHandler(logger) warn("The previous operation took too long to process.")См. также:
Исходный код Редактировать
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/logging.html