【问题标题】:Log4r : logger inheritance, yaml configuration, alternatives?Log4r:记录器继承、yaml 配置、替代方案?
【发布时间】:2011-02-20 19:44:13
【问题描述】:

我对 ruby​​ 环境还很陌生,我一直在寻找一个不错的日志记录框架,以便在我的 ruby​​ 和 rails 应用程序中使用它。

在我之前的经验中,我已经成功使用了 log4j 和 log4p(perl 端口),并且期望与 log4r 具有相同级别的可用性(和成熟度)。

但是我必须说,log4r 框架中有很多东西是完全不清楚的。

1 记录器继承

logger 继承似乎根本没有被管理!

如果我声明一个名为“myapp”的记录器,然后尝试获取一个记录器名称“myapp::engine”,则查找将以 NameError 结束。

我希望框架根据命名方案返回根记录器并使用“myapp”记录器。

Q1:当然我可以解决这个问题并使用查找方法自己管理名称,但是有没有更简洁的方法可以做到这一点而无需任何额外的编码?

2 YAML 配置

让我感到困惑的第二件事是 yaml 配置。在 log4r 网站上几乎没有关于这个系统的信息,文档链接到丢失的页面,所以我能找到的所有信息都包含在 gem 的示例目录中。

我很困惑 yaml 配置必须包含 pre_config 部分,并且我需要定义自己的级别。

如果我删除 pre_config 部分,或将所有“自定义”级别替换为标准级别(调试、信息、警告、致命),该示例将引发以下错误:

log4r/yamlconfigurator.rb:68:in `decode_yaml': Log level must be in 0..7 (ArgumentError)

所以似乎没有办法使用一个简单的文件,我们只声明框架的记录器和附加程序。

Q2:我真的认为我错过了一些东西,这一定是提供简单 yaml conf 文件的一种方式。你有这种用法的例子吗?

XML 文件中的 3 个变量替换

Q3:Yaml 配置系统似乎提供了这样的功能,但是我无法找到与 XML 文件类似的功能。有什么想法吗?

4 种替代方案?

我必须说,与 log4j 和其他 log4j 端口相比,我对 log4r 的功能级别和成熟度感到非常失望。

我在使用其他语言的日志记录 API 方面拥有扎实的背景知识,并发现自己在各种工作中工作只是为了让“基本的东西”在“现实世界的应用程序”中运行。

我的意思是一个复杂的应用程序,由多个 gem、控制台/脚本应用程序和一个 Rails Web 前端组成,其中配置必须相互化,并且我们在其中大量使用命名空间和继承。

为了找到更合适或更成熟的东西,我进行了多次搜索,但没有找到类似的东西。

Q4:你们知道可以在企业级应用程序中使用的 log4r 框架的任何(严肃的)替代方案吗?

感谢阅读所有这些!

非常感谢任何指点,

亲切的问候,

【问题讨论】:

    标签: ruby-on-rails ruby enterprise logging log4r


    【解决方案1】:

    我同意 log4r 文档很差。不过,我们正在使用它,它为我们提供了很好的服务,比如说一个企业应用程序。

    我们没有使用记录器继承,所以我无法为您提供帮助,而且我不知道任何替代软件,但是:

    这是我们用来读取 YAML 配置的代码(实际上,我认为我们将它作为已经加载到 Hash 中的方式传递),它还支持变量替换:

    require 'log4r'
    require 'log4r/yamlconfigurator'
    
    y = "log4r_config:
    
      # define all loggers ...
      loggers:
        - name      : production
          level     : INFO
          trace     : 'false'
          outputters:
            - stdout
    
      # define all outputters (incl. formatters)      
      outputters:
        - type     : StdoutOutputter
          name     : stdout
          formatter:
            date_pattern: '%Y-%m-%d %H:%M:%S'
            pattern     : '%d %l: #\{TEST\} %m '
            type        : PatternFormatter"
    
    h = YAML.load y
    log_cfg = YamlConfigurator
    log_cfg['TEST'] = 'foobar'
    log_cfg.decode_yaml h['log4r_config']
    @log = Logger['production']
    @log.info 'test'
    #=>2010-05-20 14:36:32 INFO: foobar test 
    

    【讨论】:

    • 您好,感谢您的回答,但是此示例在我们的环境中似乎无法正常工作。解析 yaml 文件时,我得到一个 'decode_yaml': undefined method 'each' for nil:NilClass (NoMethodError)'。解析文件或哈希会给出完全相同的错误...您使用的是 1.1.17 版本的 log4r 吗?
    • 我在生产中使用 1.0.6。稍后我会尝试一下并发送一个工作示例。
    • 我直接从 irb 粘贴了示例。
    • 使用 1.1.7,上面的代码适用于我如果我在第二个 require 之后添加 include Log4r。见this gist。除此之外,效果很好,感谢您提供这个很好的例子!
    【解决方案2】:

    由于我仍在与 yaml 配置“战斗”,所以我在 XML 配置的代码中挖掘了一点,并找到了关于参数替换的 Q3 的答案。

    实际上它的工作方式与 yaml 的东西非常相似,你只需要在 xml 文件中使用 #{VARNAME} 引用参数:

    <filename>#{logdir}/processing.log</filename>
    

    并在读取 xml 文件之前在配置器中设置它们:

    Log4r::Configurator['logdir']=log_dir_param
    ...
    Log4r::Configurator.load_xml_file(conf_file_xml)
    

    另外,当我提到 log4r 文档确实很糟糕(很多 404 错误)时,我说的是 ruby​​forge 上提供的文档...

    最后,我查看了 sourceforge 项目并在 http://log4r.sourceforge.net/rdoc 上找到了一个“不错”(以 ruby​​ 方式)的文档。

    【讨论】:

    • 您提到的 sourceforge 链接适用于 Log4r 1.0.5。 OP 使用的是 1.1.7。要查看 Log4r 的 API 文档,请说:gem server 然后转到 localhost:8808,您可以阅读所有 gem 的已安装版本的 API 文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2014-10-22
    • 2015-05-30
    • 1970-01-01
    相关资源
    最近更新 更多