简体   繁体   English

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

[英]how can i log system status in JSON format using ruby

I have a ruby script where I am logging system status using GET method, the output which is returned in logs is something like this:我有一个 ruby 脚本,我在其中使用 GET 方法记录系统状态,日志中返回的输出是这样的:

1.2.3.111 - - [00/Jan/2016:08:21:24 +0000] "GET /service/sys/status HTTP/1.1" 200 15 0.0006 

I want to log these in JSON format.我想以 JSON 格式记录这些。 Is there any way this is can be done, though i got know this can be somehow done with thin webserver but i have no idea how to do that.有什么方法可以做到这一点,虽然我知道这可以通过网络服务器以某种方式完成,但我不知道该怎么做。

Use custom Logger::Formatter :使用自定义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!"}

Whether you expect messages to have a double quote, it might be better to delegate jsoning to an expert (credits @aidan):无论您是否希望消息有双引号,最好将 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!"}

gem log_formatter is your choice, as the formatter group, now support json formatter for ruby and log4r. gem log_formatter是你的选择,作为格式化程序组,现在支持 ruby 和 log4r 的 json 格式化程序。

simple to get stated for ruby.很容易为 ruby 声明。

gem 'log_formatter'

require 'log_formatter'
require 'log_formatter/ruby_json_formatter'

logger.debug({data: "test data", author: 'chad'})

result结果

{
  "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:对于 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'} )

Advance usage: README高级用法: README

Full Example Code: examples完整示例代码: 示例

per comments above with @aidan 's recommendation:根据上面的评论和@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

Notable additions:值得注意的补充:

  1. $stdout.sync -- not strictly required in every case and possibly undesirable in others $stdout.sync并非在所有情况下都严格要求,在其他情况下可能不受欢迎
  2. the $/ or "\n" (newline). $/"\n" (换行符)。 Without this, logging will work in native Docker, but probably not in Kubernetes ( kubectl logs... ).如果没有这个,日志记录将在本机 Docker 中工作,但可能不会在 Kubernetes 中工作( kubectl logs... )。

HTH HTH

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM