Rails日志中的缩进

Tim*_*try 7 logging ruby-on-rails indentation

在记录自定义信息时,例如在rake-task中,我想缩进日志行以获得更好的可读性.例如:

Seeding database...
  Importing xyz.csv...
    Skipping row 5 due to invalid value 'Unknown' in column 'year'
  Finished importing xyz.csv
Finished seeding database
Run Code Online (Sandbox Code Playgroud)

在我seeds.rb,我使用以下日志记录:

logger = Logger.new(STDOUT)
logger.info('Seeding database...')
Run Code Online (Sandbox Code Playgroud)

但是,日志记录Skipping row 5...发生在服务中,不一定要从服务中调用seeds.rb,但可以从任何地方调用.因此,我不能硬编码正确的缩进(这听起来像一个坏主意,无论如何).

一种可能性是保留"缩进计数器",我可以在开始导入文件时增加并在完成时减少.我不确定如何从我的应用程序的任何地方访问它,或者如果这是最好的解决方案.有任何想法吗?

Vas*_*fed 1

更好的解决方案是为您的服务对象提供记录器对象以及要处理的数据。这样它就不必知道有关您的记录器首选项的任何信息。

并使用类似的东西:

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"
Run Code Online (Sandbox Code Playgroud)

对于服务电话 -YourService.new(some_data, logger: logger.indented).process_or_whatever