没有Java里的log4j那样的组件,调试程序的时候很难受,模仿Log4j的使用方法写的一个Ruby logger:
配置文件:
dev:
level: debug
stdout: 1
file: ./dev.log
roll_type: file_size
roll_param: 500K # support K/M
pro:
level: info
stdout: 1
file: ./pro.log
roll_type: daily
roll_param: # if use daily, this param should be null
default: pro
比较粗糙,自己感觉是差不多够当下用就可以了。
配置文件的顶级keys是 dev, pro, ..., default,default的值应该是前面的某一个
stdout 为 1 表示会向终端输出,file没什么好说的。 roll_type 类似于 log4j 里的 roll file type(大概是这名字),这个值设置为 daily 的时候,下面的roll_param是不用填的,而把type设置为file size 的话,param 就需要填了,程序没有写默认值,这个值支持以K或者M作计量单位。
default 这个东东是,logger会自行创建一个全局变量:@@log,这个变量对应的配置,就是default后的那个。
打印出来的消息格式:
//这个是普通的debug消息,也有配合了 active_record-2.2.2 运行时 ar 产生的 sql 消息。
DEBUG 09-06-10 13:04:56 my_logger.rb:151: debug msg.
DEBUG 09-06-10 13:04:57 abstract_adapter.rb:189:in `log_info': Lang Load (0.1ms) SELECT * FROM `langs` WHERE (`langs`.`id` = 88)
// 这个是带异常的消息:
ERROR 09-06-10 13:37:08 my_logger.rb:153: this is the error --asnvzxjvasjfs--:
Connection refused - connect(2) /usr/lib/ruby/1.8/net/http.rb:560:in `initialize'
/usr/lib/ruby/1.8/net/http.rb:560:in `open'
/usr/lib/ruby/1.8/net/http.rb:560:in `connect'
/usr/lib/ruby/1.8/timeout.rb:53:in `timeout'
/usr/lib/ruby/1.8/timeout.rb:93:in `timeout'
/usr/lib/ruby/1.8/net/http.rb:560:in `connect'
/usr/lib/ruby/1.8/net/http.rb:553:in `do_start'
/usr/lib/ruby/1.8/net/http.rb:542:in `start'
/usr/lib/ruby/1.8/net/http.rb:1035:in `request'
/usr/lib/ruby/1.8/net/http.rb:845:in `post'
my_logger.rb:151
使用方式和log4j的完全相同: log.debug(msg); log.error(msg, e)
使用方式:
- my_logger.rb 的 130 行左右,require 'yaml' 附近,写的程序是读取配置文件的,这个根据应用,需要 **定制 ** 配置文件路径
- 配置yml里的logger时,假定配置了一个名为 dblog 的logger,在程序里可以用 MyLogger.get("dblog") 的方法取得 logger
- 配合 rails 使用的话, MyLogger这个类里面可能需要添加更多的方法