События системного журнала#

Настройки логирования#

Логирование происходит одним из 3 способов:

  • console - запись в консоль в stdout (или stderr если это установлено в настройках);

  • file - запись в файл;

  • conn - запись в сокет (сеть или Unix).

Настройка логирования осуществляется в разделе [log] конфигурационного файла (app.ini):

  • [log] используется для основных настроек.

  • [log.<mode-name>] - указывает, куда записывать логи (console, file, conn).

  • [log] также может содержать настройки вспомогательного логгера по следующей схеме: logger.<logger-name>.<CONFIG-KEY>.

Раздел [log]#

Ниже представлены основные параметры раздела (подробное описание далее по тексту):

Параметр

Описание

LEVEL

Уровень логирования (по умолчанию: Info). Возможные варианты: Trace, Debug, Info, Warn, Error, Fatal

BUFFER_LEN

Размер буфера. Актуально для логирования в файл. Для немедленного отображения записей в лог-файле необходимо указать значение = 0, в противном случае сообщения в файле могут появляться не сразу, а по мере заполнения буфера

MODE

Логгеры, которые можно настраивать отдельно в своих секциях конфигурации по именам log.<mode name> (по умолчанию: console).

ROOT_PATH

Путь до каталога, в котором хранятся логи (по умолчанию: %(SC_WORK_DIR)/log)

FLAGS

Настройка выводимой в лог информации. Рекомендуемое значение date,time,microseconds,shortfile,shortfuncname,level

logger.router.MODE

Настройка роутер-логгера (по умолчанию: ,). Рекомендуется отключить. Для этого нужно указать значение None

logger.access.MODE

Настройка логгера доступа. Рекомендуемое значение console, file. Данный логгер позволяет автоматически логировать все поступающие запросы и настраивать выводимую информацию

logger.xorm.MODE

Список выходных данных журнала, которые будут использоваться для XORM-логгера (по умолчанию: ,)

STACKTRACE_LEVEL

Уровень логирования, предоставляющий подробную информацию при выводе стэка трасcировки вызова в случае ошибки в работе приложения (по умолчанию: None)

ACCESS_LOG_TEMPLATE

Шаблон вывода информации для логгера доступа. Позволяет настроить вид сообщения и перечень выходных данных. Подробное описание см. ниже в разделе Логгер доступа

Запятая (,) в режиме вспомогательного логгера (logger.router.MODE/logger.access.MODE/logger.xorm.MODE) означает использование глобального режима (MODE) по умолчанию.

Пример настроек

[log]
LEVEL               = info
STACKTRACE_LEVEL    = none
BUFFER_LEN          = 10000
MODE                = console, file
ROOT_PATH           = sc/log
ENABLE_SSH_LOG      = false
ACCESS_LOG_TEMPLATE = {{.Ctx.Req.Method}} {{.Ctx.Req.URL.RequestURI}}, Body: {{.Body}}, Status: {{.ResponseWriter.Status}}, Size: {{.ResponseWriter.Size}}, Host: {{.Ctx.RemoteHost}}, User: {{.Identity}}, Start: {{.Start.Format "[02/Jan/2006:15:04:05.000000 -0700]" }}, End: {{.End.Format "[02/Jan/2006:15:04:05.000000 -0700]" }}, Duration: {{.Duration}}
REQUEST_ID_HEADERS  =
logger.access.MODE  = console
logger.router.MODE  =
FLAGS               = date,time,microseconds,shortfile,shortfuncname,level

Примеры событий системного журнала#

Уровень Info

  2023/09/05 13:12:11.226101 acceslogsbt.go:135:1() [INFO] [TraceId: edc303b8-756b-4cb0-922b-97c845a3739a] POST /user/settings, Body: {"_csrf":"zdZcDAtI6wT4uDdApgrX4yDkADQ6MTY5MzkwODEyMzU3NzI3NzAwMA","description":"","full_name":"","location":"","name":"testuser1","visibility":"0","website":""}, Status: 303, Size: 0, Host: ::1, User: testuser, Start: [05/Sep/2023:13:12:11.208572 +0300], End: [05/Sep/2023:13:12:11.226012+0300], Duration: 17.440342ms

Параметр

Описание

2023/09/05

Дата события

13:12:11.226101

Время события

TraceId

Системный параметр

Body

Тело сообщения

Status

Код состояния HTTP

User

Имя пользователя

Start

Дата и время начала события

End

Дата и время окончания события

Duration

Длительность запроса в мс

Уровень Debug

2023/09/05 13:12:11.219343 profile.go:93:ProfilePost() [DEBUG] Changing name for testuser to testuser1

Параметр

Описание

2023/09/05

Дата события

13:12:11.219343

Время события

Changing name for testuser to testuser1

Изменение имени пользователя с testuser на testuser1

Настройки логирования по умолчанию#

[log]
ROOT_PATH = %(SC_WORK_DIR)/log
MODE = console
LEVEL = Info
STACKTRACE_LEVEL = None
logger.router.MODE = ,
logger.xorm.MODE = ,
logger.access.MODE =

[log.console]
MODE = console
FLAGS = stdflags
PREFIX =
COLORIZE = true

Это эквивалентно отправке всех логов в консоль, при этом логи Golang по умолчанию также выводятся в консоли.

Обратите внимание
Настройки выше указаны для примера и не рекомендуются для указания в конфигурационном файле.

Отключение роутер-логгера и запись логов доступа в файл#

В примере ниже роутер-логгер отключен, логи доступа (>=Warn) записываются в access.log:

[log]
logger.router.MODE =
logger.access.MODE = access-file

[log.access-file]
MODE = file
LEVEL = Warn
FILE_NAME = access.log

Настройка уровней логирования для разных режимов#

Логи по умолчанию (>=Warn) записываются в sc.log, в то время как логи с ошибками (Error) сохраняются в file-error.log.

[log]
LEVEL = Warn
MODE = file, file-error

; по умолчанию, при записи логов в файл они записываются в %(log.ROOT_PATH)/sc.log, поэтому настраивать путь не нужно.
; [log.file]

[log.file-error]
LEVEL = Error
FILE_NAME = file-error.log

Выходные данные журнала (режим и регистратор выходных данных)#

Общие настройки#

EXPRESSION

EXPRESSION представляет собой регулярное выражение, с которым должны совпадать события логирования для того, чтобы быть записанными регистратором. Совпадать должно либо сообщение журнала (цвет текста не учитывается), либо longfilename:linenumber:functionname. Все сообщение или строка не обязательно должны полностью совпадать.

FLAGS

FLAGS представляет информацию о контексте логирования, которая выводится перед каждым сообщением. Это набор строковых данных, разделенных запятыми. Порядок значений не важен.

По умолчанию используется значение stdflags (= date,time,medfile,shortfuncname,levelinitial). Возможные значения:

  • none or , - отсутствие флагов;

  • date - дата в локальном часовом поясе: 2009/01/23;

  • time - время в локальном часовом поясе: 01:23:23;

  • microseconds - время в микросекундах: 01:23:23.123123;

  • longfile - полное имя файла и номер строки: /a/b/c/d.go:23;

  • shortfile - последний элемент имени файла и номер строки: d.go:23;

  • funcname - имя функции, в которой была вызвана запись: runtime.Caller();

  • shortfuncname - последняя часть имени функции. Переопределяет имя функции funcname;

  • utc - если установлена дата или время, используйте UTC вместо локального часового пояса;

  • levelinitial - первая буква в названии уровня логирования. Например, [I] для уровня логирования INFO;

  • level - уровень логирования, например [INFO];

  • gopid - Goroutine-ID;

  • medfile - последние 20 символов имени файла. Эквивалентно shortfile,longfile;

  • stdflags - эквивалентно date,time,medfile,shortfuncname,levelinitial.

Запись логов в консоль#

При записи в консоль используются следующие настройки:

Параметр

Описание

COLORIZE

Параметр для выделения цветом блоков логирования. При записи логов в консоль значение по умолчанию true, иначе по умолчанию false

STDERR

Стандартный поток вывода ошибок для программ. Если false, то логгер будет выводить сообщения в поток stdout, иначе в stderr

При записи в консоль логгер перенаправляет сообщения с логами в потоки stdout и stderr, прикрепленные к процессу в SourceControl.

Запись логов в файл#

При записи логов в файл используются следующие настройки:

Параметр

Значение

Описание

FILE_NAME

По умолчанию: %(ROOT_PATH)/sc.log

Файл для записи событий логирования. Относится к ROOT_PATH

MAX_SIZE_SHIFT

28

Максимальный размер файла (28 эквивалентно 256 Мбайт), определяется путем сдвига влево на единицу заданное количество раз (1 << x)

LOG_ROTATE

true

Включает ротацию log-файлов. На основании других настроек (DAILY_ROTATE, MAX_DAYS) файлы логов будут перезаписываться

DAILY_ROTATE

true

Ежедневная ротация логов

MAX_DAYS

7

Удалить измененные файлы журнала по истечении этого количества дней

COMPRESS

true

Сжатие старых файлов с логами по умолчанию в gzip.

COMPRESSION_LEVEL

-1

Уровень сжатия файла. Возможные значения: от 1 до 9 (включительно), где более высокое значение означает более сильное сжатие

Обратите внимание
Сильное сжатие может сопровождаться более высоким потреблением ресурсов. Перед COMPRESSION_LEVEL должен стоять знак -.

Запись логов в сеть#

При записи в сеть логгер отправляет сообщения с логами посредством сетевого сокета. Рекомендуются следующие настройки:

Параметр

Значение

Описание

ADDR

7020

Адрес подключения

PROTOCOL

tcp

Протокол (TCP, UNIX или UDP)

RECONNECT

false

Попытка переподключения при потере соединения

RECONNECT_ON_MSG

false

Повторное подключение хоста для каждого отдельного сообщения

Роутер-логгер#

При включении обработчиков маршрутов роутер-логгер записывает следующие типы сообщений:

  • started - сообщения записываются на уровне TRACE.

  • polling/completed-роутеры записываются на уровне INFO. Исключение: «/assets» статические запросы ресурсов также логируются на уровне TRACE.

  • slow-роутеры логируются на уровне WARN.

  • failed-роутеры логируются на уровне WARN.

XORM-логгер#

XORM-библиотека - ORM-библиотека для языка Go, которая позволяет хранить структуры данных приложения в базе данных без дополнительных преобразований.

Для того чтобы XORM выводил SQL-логи, необходимо установить значение LOG_SQL = true в разделе [database].

Логгер доступа#

Логгер доступа обеспечивает формат журнала, совместимый с NCSA Common Log. Он легко настраивается, но следует соблюдать осторожность при изменении его шаблона. Основным преимуществом этого логгера является то, что SourceControl может логировать доступы в стандартном формате журнала, поэтому можно использовать стандартные инструменты.

Включить логгер доступа можно, используя logger.access.MODE.

Обратите внимание
Логгер доступа записывает логи на уровне INFO. Установка значения LEVEL этого логгера на WARN или выше приведет к отсутствию журналов доступа.

ACCESS_LOG_TEMPLATE

Шаблон вывода информации для логгера доступа. Позволяет настроить вид сообщения и перечень данных. В шаблоне можно использовать данные из кода программы. Рекомендуемое значение:

{{.Ctx.Req.Method}} {{.Ctx.Req.URL.RequestURI}}, Body: {{.Body}}, Status: {{.ResponseWriter.Status}}, Size: {{.ResponseWriter.Size}}, Host: {{.Ctx.RemoteHost}}, User: {{.Identity}}, Start: {{.Start.Format "[02/Jan/2006:15:04:05.000000 -0700]" }}, End: {{.End.Format "[02/Jan/2006:15:04:05.000000 -0700]" }}, Duration: {{.Duration}}

В шаблон передаются следующие параметры:

Параметр

Описание

.Ctx.Req.Method

HTTP метод запроса

.Ctx.Req.URL.RequestURI

Путь запроса

.Body

JSON-тело запроса (если в запросе передается поле «password», то оно исключается из вывода)

.ResponseWriter.Status

Итоговый HTTP статус запроса

.ResponseWriter.Size

Размер запроса в байтах

.Ctx.RemoteHost

DNS-имя или IP-адрес источника запроса

.Identity

Имя пользователя, если запрос был от аутентифицированного пользователя, либо - в случае, если это был анонимный пользователь

.Start.Format "[02/Jan/2006:15:04:05.000000 -0700]"

Время начала выполнения запроса

.End.Format "[02/Jan/2006:15:04:05.000000 -0700]"

Время завершения выполнения запроса

.Duration

Продолжительность выполнения запроса

Обратите внимание
Необходимо соблюдать осторожность при изменении этого шаблона, поскольку он работает за пределами обработчика аварийного восстановления. Шаблон также должен быть простым, так как он выполняется для каждого запроса.