初尝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