在Ruby Application中正确使用Log4r

Spe*_*cer 7 ruby logging log4r

我必须真的遗漏一些明显的东西,但是我在Ruby应用程序中普遍使用Log4r时遇到了麻烦.我可以毫无问题地登录,但开销似乎很笨拙我设置的方式.我基本上将完整路径传递给文件名以登录我的应用程序中的每个类.调用的ruby脚本从ARGV中的一个参数中提取日志文件,然后传递给我并在我在ruby中调用的每个类中设置.在每个类中,我使用patternFormatter将类/文件名插入到日志语句中.

有没有更好的方法来使这项工作?感觉就像我想的那样需要将某些东西传递给我的ruby应用程序中的每个类.我可以在yaml配置文件中设置日志文件,但是我也会将配置文件传递给每个类.

有什么建议?如果这没有意义,我可以尝试发布一些更具体的代码示例,以进一步解释我的意思.

谢谢!

C G*_*G-K 14

我是log4r的维护者,

对于单个脚本(不同的.rb文件),您可以通过几种不同的方式(拟合,我知道)来处理它,首先,请注意我在这里介绍的功能在> = 1.1.4中可用.

一种方法是为每个脚本设置不同的PatternFormatter字符串(如果创建yaml或xml配置文件,则可以基于每个类名指定不同的模式).

另一种方法是在PatternFormatter中使用GDC,NDC或MDC之一.

GDC将设置一个"全局诊断上下文",也就是说,它是运行脚本的所有线程都可以使用的值.您可以通过将%g放在模式中并通过GDC.set(String)设置值来获取更多详细信息,请参阅:http://log4r.rubyforge.org/manual.html

NDC和MDC分别是嵌套和映射诊断上下文.这些模式是使用%x和%X {Symbol | Object},并通过NDC.set(String)和MDC.put(Symbol | Object,Object)设置它们

另一种方法是使用Pattern%t,它打印出调用所在的文件名和行号.

每种方法之间的权衡是它们在CPU资源使用中逐渐变得更加昂贵.我倾向于首先使用GDC来满足您的要求.


Mla*_*vić 12

嗯,你没有Log4r::Logger在脚本开头实例化类并传递实例的任何原因?你甚至不必传递它,你总是可以从Logger类中获取它:

run.rb:

require 'log4r'
require 'class_a'

logger = Log4r::Logger.new('test')
logger.outputters << Log4r::Outputter.stdout
logger.outputters << Log4r::FileOutputter.new('logtest', :filename =>  'logtest.log')
logger.info('started script')
a = A.new
a.do_something
logger.info('finishing')
Run Code Online (Sandbox Code Playgroud)

class_a.rb:

class A
  def do_something
    logger = Log4r::Logger['test']
    logger.info('in do_something')
    puts 'hi!'
  end
end
Run Code Online (Sandbox Code Playgroud)

当你跑步时,run.rb你得到:

$ ruby run.rb 
 INFO test: started script
 INFO test: in do_something
hi!
 INFO test: finishing
Run Code Online (Sandbox Code Playgroud)

logtest.log磁盘上命名的日志文件.

  • 如果您有许多连接的ruby脚本不在同一个实例中运行(例如一个脚本在外部调用另一个脚本,或者一个批处理器按顺序运行10个脚本),那么您将需要分别在每个脚本中实例化记录器.如果您正在讨论通过'require'包含的其他脚本,那么您可能需要在需要这些外部文件之前创建Log4r实例,如果它们在第一次通过文件期间记录(而不是在以后使用它们时). (2认同)