Пример логирования
В этом разделе описана настройка параметров, связанных с логированием. Для настройки логирования в приложении также можно использовать модуль log.
Начиная с версии 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
Начиная с версии 2.11.0.
Настройка заданных уровней логирования (log_level) для разных модулей.
Уровень логирования можно задать для следующих типов модулей:
- Модули (файлы), использующие логгер по умолчанию. Пример: Настройка уровней логирования для файлов, использующих логгер по умолчанию.
- Модули, использующие пользовательские логгеры, созданные с помощью функции log.new(). Пример: Настройка уровней логирования для модулей, использующих пользовательские логгеры.
- Модуль
tarantool, позволяющий настроить уровень логирования для сообщений ядра Tarantool. В частности, он настраивает уровень логирования для сообщений, выводимых из кода не на Lua, включая модули на C. Пример: Настройка уровня логирования для модулей на C.
Тип: 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, а для
module2 – error, вызов 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, а для
module2 – error, вызов 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 и Терминал №2.
-
В Терминале №1 запустите интерактивную сессию Tarantool. Затем используйте параметр
logдля направления логов вLog_fileи вызовитеlog.info, чтобы записать сообщение в файл лога.box.cfg{log='Log_file'}log = require('log')log.info('Log Line #1') -
В Терминале №2 выполните команду
mv, чтобы переименовать файл лога вLog_file.bak.mv Log_file Log_file.bakВ результате следующее сообщение лога будет записано в
Log_file.bak. -
Вернитесь в Терминал №1 и запишите сообщение "Log Line #2" в файл лога.
log.info('Log Line #2') -
В Терминале №2 выполните команду
ps, чтобы найти идентификатор процесса экземпляра Tarantool.ps -A | grep tarantool -
В Терминале №2 выполните
kill -HUP, чтобы отправить сигнал SIGHUP экземпляру Tarantool. Tarantool переоткроетLog_file, и следующее сообщение лога будет записано вLog_file.kill -HUP process_id
Того же эффекта можно добиться вызовом log.rotate.
-
В Терминале №1 запишите сообщение "Log Line #3" в файл лога.
log.info('Log Line #3') -
В Терминале №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