如何使用ruby以JSON格式记录系统状态

时间:2016-01-06 09:03:32

标签: ruby json web-services logging thin

我有一个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格式记录这些内容。 有没有办法可以做到这一点,虽然我知道这可以用网络服务器以某种方式完成,但我不知道该怎么做。

3 个答案:

答案 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

值得注意的补充:

  1. $stdout.sync-并非在每种情况下都严格要求,而在其他情况下则可能不希望 $/"\n"(换行符)。否则,日志记录将无法在本地Docker中运行,但可能无法在Kubernetes(kubectl logs ...)中运行。

HTH