Rails中使用log4r

初尝log4r。

写在前面

日志的重要性自不用说,Rails中log的存放地址位于log目录下,有develogment.log, production.log等。开发的时候,我通常会单独开个terminal窗口,跑rails s, 出问题了,就在那个窗口看日志。现在看来,这还是挺低级的。

近来看一些前辈写的Rails相关知识,有推荐log4r,尝试了下, 还不错。日志按照日期分开存放,也很好查找。

除了rails,其他的ruby项目也可以用log4r(log for ruby),这里只说一下如何在Rails中使用log4r。

安装

先吐槽下,看了不少轮子,没见过log4r这种的,没有常规的installation,usage,Wiki里面也没有说明。所有的信息,需要自己去doc里面看manual,index, 手法别样,上图感受下:

好,不废话。看看如何在rails用它。

四步走。

  • 在gemfile中添加

    gemfile 'log4r'
    

    终端bundle, 重启服务器。

  • 修改config/application.rb

    require 'rails/all'
    # add these line for log4r
    require 'log4r'
    require 'log4r/yamlconfigurator'
    require 'log4r/outputter/datefileoutputter'
    
    Bundler.require(:default, Rails.env) if defined?(Bundler)
    module my_app
      class Application < Rails::Application
        #...
        # assign log4r's logger as rails' logger.
        include Log4r
        log4r_config= YAML.load_file(File.join(File.dirname(__FILE__),"log4r.yml"))
        YamlConfigurator.decode_yaml( log4r_config['log4r_config'] )
        config.logger = Log4r::Logger[Rails.env]
      end
    end
    
  • 新增配置文件config/log4r.yml

    log4r_config:
      # define all loggers ...
      loggers:
        - name      : production
          level     : WARN
          trace     : 'false'
          outputters :
          - datefile
        - name      : development
          level     : DEBUG
          trace     : 'true'
          outputters :
          - datefile
    
      # define all outputters (incl. formatters)
      outputters:
      - type: DateFileOutputte
        name: datefile
        dirname: "log"
        filename: "my_app.log" # notice the file extension is needed!
        formatter:
          date_pattern: '%H:%M:%S'
          pattern     : '%d %l: %m '
          type        : PatternFormatter
    

    这时,如果重启rails,会发现报错:

    undefined method `formatter' for #<Log4r::Logger:0x007fd97a78e780> (NoMethodError)
    

    我当时也是懵逼,不知道怎么解决,后来Google到了解决方法。对于Rail4.0+ ,需要添加文件,声明formatter这个method

  • 新增文件config/initializers/log4r_patch_for_rails4.rb:

    class Log4r::Logger
      def formatter()
      end
    end
    

配置完成!重启下服务器,然后你会发现不管做了什么操作,terminal终端什么也没有输出,一直保持如下内容:

而log文件夹下会出现按照日期分开的日志文件,类似:my_log_2018-03-08.log, my_log_2018-03-09.log

日志文件内容类似这样:

因为outputters选择了DateFileOutputte,相比之前在rails s窗口查看,多了时间和logger类型。

具体的输出格式也可以在config/log4r.yml进行更换,log4r的GitHub库列出来所有的格式:

OK,大功告成!!

另:建了个gist,上述提到的log4r的配置文件代码,可见using log4r on rails

参考

日志:log4r

using log4r and rails