Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Пример логирования

В этом разделе описана настройка параметров, связанных с логированием. Для настройки логирования в приложении также можно использовать модуль log.

log_level

Начиная с версии 1.6.2.

Задает уровень детализации лога. Доступны следующие уровни:

  • 0 – fatal
  • 1 – syserror
  • 2 – error
  • 3 – crit
  • 4 – warn
  • 5 – info
  • 6 – verbose
  • 7 – debug

Задавая log_level, можно включить логирование всех событий с уровнем важности не ниже указанного. По умолчанию Tarantool выводит логи в стандартный поток ошибок. Это поведение можно изменить с помощью параметра конфигурации log.

Тип: integer, string

Значение по умолчанию: 5

Переменная окружения: TT_LOG_LEVEL

Динамический: yes

log_modules

Начиная с версии 2.11.0.

Настройка заданных уровней логирования (log_level) для разных модулей.

Уровень логирования можно задать для следующих типов модулей:

Тип: table

Значение по умолчанию: пусто

Переменная окружения: TT_LOG_MODULES

Динамический: yes

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

Предположим, есть два одинаковых модуля, расположенных по путям: test/logging/module1.lua и test/logging/module2.lua. Эти модули используют логгер по умолчанию и выглядят следующим образом:

return {    say_hello = function()        local log = require('log')        log.info('Info message from module1')    end}

Для загрузки этих модулей в приложение нужно добавить соответствующие директивы require:

module1 = require('test.logging.module1')module2 = require('test.logging.module2')

Для настройки уровней логирования нужно указать имена модулей, соответствующие путям к этим модулям. В примере ниже переменная box_cfg содержит настройки логирования, которые можно передать функции box.cfg():

box_cfg = { log_modules = {    ['test.logging.module1'] = 'verbose',    ['test.logging.module2'] = 'error' }}

Поскольку для module1 задан уровень логирования verbose, а для module2error, вызов module1.say_hello() выведет сообщение, а module2.say_hello() будет подавлен:

-- Prints 'info' messages --module1.say_hello()--[[[92617] main/103/interactive/test.logging.module1 I> Info message from module1---...--]]-- Swallows 'info' messages --module2.say_hello()--[[---...--]]

Пример 2: Настройка уровней логирования для модулей, использующих пользовательские логгеры

В примере ниже переменная box_cfg содержит настройки логирования, которые можно передать функции box.cfg(). В этом примере для module1 задается уровень verbose, а для module2 – уровень error:

box_cfg = { log_level = 'warn',            log_modules = {                module1 = 'verbose',                module2 = 'error' }}

Для создания пользовательских логгеров вызовите функцию log.new():

-- Creates new loggers --module1_log = require('log').new('module1')module2_log = require('log').new('module2')

Поскольку для module1 задан уровень логирования verbose, а для module2error, вызов module1_log.info() выведет сообщение, а module2_log.info() будет подавлен:

-- Prints 'info' messages --module1_log.info('Info message from module1')--[[[16300] main/103/interactive/module1 I> Info message from module1---...--]]-- Swallows 'debug' messages --module1_log.debug('Debug message from module1')--[[---...--]]-- Swallows 'info' messages --module2_log.info('Info message from module2')--[[---...--]]

Пример 3: Настройка уровня логирования для модулей на C

В примере ниже переменная box_cfg содержит настройки логирования, которые можно передать функции box.cfg(). В этом примере для модуля tarantool задается уровень info:

box_cfg = { log_level = 'warn',            log_modules = { tarantool = 'info' } }

Заданный уровень влияет на сообщения, выводимые из модулей на C:

ffi = require('ffi')-- Prints 'info' messages --ffi.C._say(ffi.C.S_INFO, nil, 0, nil, 'Info message from C module')--[[[6024] main/103/interactive I> Info message from C module---...--]]-- Swallows 'debug' messages --ffi.C._say(ffi.C.S_DEBUG, nil, 0, nil, 'Debug message from C module')--[[---...--]]

В примере выше используется библиотека LuaJIT ffi для вызова функций на C, предоставляемых модулем say.

Пример логирования

В этом примере показано, как работает «ротация», то есть что происходит, когда экземпляр сервера пишет в лог и при архивировании используются сигналы.

  1. Откройте два окна терминала: Терминал №1 и Терминал №2.

  2. В Терминале №1 запустите интерактивную сессию Tarantool. Затем используйте параметр log для направления логов в Log_file и вызовите log.info, чтобы записать сообщение в файл лога.

    box.cfg{log='Log_file'}log = require('log')log.info('Log Line #1')
  3. В Терминале №2 выполните команду mv, чтобы переименовать файл лога в Log_file.bak.

    mv Log_file Log_file.bak

    В результате следующее сообщение лога будет записано в Log_file.bak.

  4. Вернитесь в Терминал №1 и запишите сообщение "Log Line #2" в файл лога.

    log.info('Log Line #2')
  5. В Терминале №2 выполните команду ps, чтобы найти идентификатор процесса экземпляра Tarantool.

    ps -A | grep tarantool
  6. В Терминале №2 выполните kill -HUP, чтобы отправить сигнал SIGHUP экземпляру Tarantool. Tarantool переоткроет Log_file, и следующее сообщение лога будет записано в Log_file.

    kill -HUP process_id

    Того же эффекта можно добиться вызовом log.rotate.

  7. В Терминале №1 запишите сообщение "Log Line #3" в файл лога.

    log.info('Log Line #3')
  8. В Терминале №2 используйте less для просмотра файлов. Log_file.bak будет содержать следующие строки ...

    2015-11-30 15:13:06.373 [27469] main/101/interactive I> Log Line #1`2015-11-30 15:14:25.973 [27469] main/101/interactive I> Log Line #2`

    ... а Log_file будет выглядеть так:

    log file has been reopened2015-11-30 15:15:32.629 [27469] main/101/interactive I> Log Line #3