我有一个ruby脚本,我使用GET方法记录系统状态,在日志中返回的输出是这样的:
1.2.3.111 - - [00/Jan/2016:08:21:24 +0000] "GET /service/sys/status HTTP/1.1" 200 15 0.0006
我想以JSON格式记录这些内容。 有没有办法可以做到这一点,虽然我知道这可以用瘦网络服务器以某种方式完成,但我不知道该怎么做。
答案 0 :(得分:5)
使用自定义Logger::Formatter
:
require 'logger'
logger = Logger.new(STDOUT) # or retrieve the default application logger
logger.formatter = proc do |severity, datetime, progname, msg|
%Q|{timestamp: "#{datetime.to_s}", message: "#{msg}"}\n|
end
logger.info "Hello, world!"
#⇒ {timestamp: "2016-01-06 10:48:13 +0100", message: "Hello, world!"}
您是否希望消息具有双引号,将jsoning委派给专家可能会更好(来自@aidan):
require 'json'
require 'logger'
logger = Logger.new(STDOUT) # or retrieve the default application logger
logger.formatter = proc do |severity, datetime, progname, msg|
JSON.dump(timestamp: "#{datetime.to_s}", message: msg)
end
logger.info "Hello, world!"
#⇒ {timestamp: "2016-01-06 10:48:13 +0100", message: "Hello, world!"}
答案 1 :(得分:0)
gem log_formatter
是您的选择,因为格式化程序组现在支持ruby和log4r的json格式化程序。
简单地说明了红宝石。
gem 'log_formatter'
require 'log_formatter'
require 'log_formatter/ruby_json_formatter'
logger.debug({data: "test data", author: 'chad'})
结果
{
"source": "examples",
"data": "test data",
"author": "chad",
"log_level": "DEBUG",
"log_type": null,
"log_app": "app",
"log_timestamp": "2016-08-25T15:34:25+08:00"
}
for log4r:
require 'log4r'
require 'log_formatter'
require 'log_formatter/log4r_json_formatter'
logger = Log4r::Logger.new('Log4RTest')
outputter = Log4r::StdoutOutputter.new(
"console",
:formatter => Log4r::JSONFormatter::Base.new
)
logger.add(outputter)
logger.debug( {data: "test data", author: 'chad'} )
提前使用:README
完整示例代码:examples
答案 2 :(得分:0)
上面每个评论中都有@aidan的推荐:
require 'json'
require 'logger'
$stdout.sync = true
logger = Logger.new(STDOUT)
logger.formatter = proc do |severity, datetime, progname, msg|
{
level: severity,
timestamp: datetime.to_s,
app: progname,
message: msg
}.to_json + $/
end
值得注意的补充:
$stdout.sync
-并非在每种情况下都严格要求,而在其他情况下则可能不希望
$/
或"\n"
(换行符)。否则,日志记录将无法在本地Docker中运行,但可能无法在Kubernetes(kubectl logs ...
)中运行。HTH