При регистрации пользовательской информации, например в задаче rake я хотел бы сделать отступы в строках журнала для лучшей читаемости. Например:
Seeding database...
Importing xyz.csv...
Skipping row 5 due to invalid value 'Unknown' in column 'year'
Finished importing xyz.csv
Finished seeding database
В моем seeds.rb для ведения журнала я использую следующее:
logger = Logger.new(STDOUT)
logger.info('Seeding database...')
Однако регистрация Skipping row 5... происходит в сервисе, который не обязательно должен вызываться из seeds.rb, но может быть вызван из любого места. Таким образом, я не могу жестко закодировать правильный отступ (в любом случае, это звучит как плохая идея).
Одна из возможностей - сохранить «счетчик отступов», который я мог бы увеличивать при начале импорта файла и уменьшать при завершении. Однако я не уверен, как получить к нему доступ из любого места в моем приложении, или это лучшее решение. Любые идеи?





Лучшее решение - предоставить объекту службы объект регистратора вместе с данными для обработки. Таким образом, ему не нужно ничего знать о ваших предпочтениях регистратора.
И используйте что-то вроде:
require 'logger'
class IndentedLogger < Logger
INDENTATION_STR = ' '.freeze
attr_accessor :indentation
def initialize(io, *args, **params)
self.indentation = 0
super
end
def indented
return self.dup.tap{|l| l.indentation += 1 } unless block_given?
self.indentation += 1
yield self
self.indentation -= 1
end
protected
def format_message(severity, datetime, progname, msg)
(@formatter || @default_formatter).call(severity, datetime, progname, "#{INDENTATION_STR*indentation}#{msg}")
end
end
# Example:
logger = IndentedLogger.new(STDOUT)
logger.info "Foo"
logger.indented{
logger.info "Foo"
logger.indented.info "Indented even more"
}
logger.info "Foo"
А для вызова сервисной службы - YourService.new(some_data, logger: logger.indented).process_or_whatever
Поднимите палец вверх за блочный подход! Это действительно решает проблему, поскольку вызываемый метод может просто регистрироваться, не зная о текущем уровне отступа, и отступ автоматически сбрасывается после выхода из блока.
Что описывает уровень отступа для чего-то. Это явное или неявное?