首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Rails 4.2和lograge,如何在每个记录的行之前启用日期/时间?

使用Rails 4.2和lograge,如何在每个记录的行之前启用日期/时间?
EN

Stack Overflow用户
提问于 2021-11-13 01:42:38
回答 4查看 289关注 0票数 0

我使用gem“Lograge”0.3.6和Rails 4.2。我在config/environment/development.rb文件中对此进行了配置

代码语言:javascript
运行
复制
  config.lograge.enabled = true
  config.lograge.formatter = CustomLogstash.new

但是,我注意到log/development.log文件中的输出没有在每行前面包含日期/时间。如何配置lograge (或者可能只配置我的Rails记录器?)在该文件的每一行添加日期和时间前缀?

EN

回答 4

Stack Overflow用户

发布于 2021-11-16 12:29:47

如果有帮助,你可以在config中添加以下内容吗?

代码语言:javascript
运行
复制
config.lograge.formatter = ->(data) { data.reverse_merge({time: Time.now}) }# data is a ruby hash.

它将为您提供如下输出

代码语言:javascript
运行
复制
{:time=>2021-11-16 12:26:24.65362 +0000, :method=>"GET", :path=>"/", :format=>:html, :controller=>"Controller", :action=>"index", :status=>200, :duration=>393.41, :view=>85.55, :db=>1.38}
票数 0
EN

Stack Overflow用户

发布于 2021-11-18 09:32:37

根据logrageofficial documentation,您可以使用custom_options

EDIT 1:使用time: Time.nowtime:event.time编辑custom_options

代码语言:javascript
运行
复制
Rails.application.configure do
  config.lograge.enabled = true
  config.lograge.formatter = Lograge::Formatters::Logstash.new

  # add time to lograge
  config.lograge.custom_options = lambda do |event|
    { time: Time.now } #or use time:event.time 
  end
end

注意:使用logstash输出时,需要添加额外的gem logstash-event。您可以简单地将其添加到Gemfile中,如下所示

代码语言:javascript
运行
复制
      gem "logstash-event"

EDIT 2:基于使用:time => event.time的注释custom_options的更新

代码语言:javascript
运行
复制
#config/environments/production.rb
MyApp::Application.configure do
  config.lograge.enabled = true

  # add time to lograge
  config.lograge.custom_options = lambda do |event|
    {:time => event.time}
  end
end

OR以下自定义选项,这是使用time: event.time.to_s(:db)记录的lograge issue to ensure both 日期和时间中的一个修复

代码语言:javascript
运行
复制
config.lograge.custom_options = lambda do |event|
      unwanted_keys = %w[format action controller utf8]
      params = event.payload[:params].reject { |key,_| unwanted_keys.include? key }
      {time: event.time.to_s(:db), user: event.payload[:user], params: params}
    end

ALTERNATIVELY您可以使用此Custom logger

代码语言:javascript
运行
复制
# Define a setter to pass in a custom log formatter

class ActiveSupport::BufferedLogger

  def formatter=(formatter)

    @log.formatter = formatter

  end

end



# Defines a custom log format (time, severity, message, PID, backtrace)... all with color!

class Formatter

  SEVERITY_TO_TAG   = {'DEBUG'=>'meh', 'INFO'=>'fyi', 'WARN'=>'hmm', 'ERROR'=>'wtf', 'FATAL'=>'omg', 'UNKNOWN'=>'???'}

  SEVERITY_TO_COLOR = {'DEBUG'=>'37',  'INFO'=>'32',  'WARN'=>'33',  'ERROR'=>'31',  'FATAL'=>'31',  'UNKNOWN'=>'37'}

  HUMOR_FOR_ENV     = {development: true, test: true, production: false}

  DEPTH_FOR_ENV     = {development: 3,    test: 3,    production: 1}

  EXCLUSION_REGEX   = /log|active_support|active_record/



  def humorous?

    return @is_humorous if defined? @is_humorous

    @is_humorous = HUMOR_FOR_ENV[ Rails.env.to_sym ]

  end



  def depth

    @depth ||= DEPTH_FOR_ENV[ Rails.env.to_sym ]

  end



  def call(severity, time, progname, msg)

    t     = time.strftime("%Y-%m-%d %H:%M:%S.") << time.usec.to_s[0..2].rjust(3)

    color = SEVERITY_TO_COLOR[severity]

    sev   = humorous? ? "%-3s" % SEVERITY_TO_TAG[severity] # pad to at least 3 characters

                      : "%-5s" % severity                  # pad to at least 5 characters



    # 2013-05-01 19:16:00.785 [omg] oh noes! (pid:30976) (admin/user.rb:45:in `block (4 levels) in <top (required)>') <- `call' <- `content_for' <- `block (2 levels) in row' <- `block in build_tag'

    "\033[0;37m#{t}\033[0m [\033[#{color}m#{sev}\033[0m] #{msg.strip} (pid:#{$$}) #{whodunit}\033[0m\n"

  end



  def whodunit

    latest, *others = caller.select{ |a| a !~ EXCLUSION_REGEX }[0, depth]

    latest = latest[/(lib|app)\/(.*)/,-1] || latest

    string = ""

    string << "\033[36m(#{latest})"

    string << "\033[35m <- " + others.map{ |s| s[/`.*/] }.join(' <- ') if others.any?

    string

  end



end



Rails.logger.formatter = Formatter.new

对于Rails4.2,不要忘记添加ActiveSupport::TaggedLogging,以便能够像调用默认Rails记录器一样调用自定义记录器

ActiveSupport::TaggedLogging用于包装任何标准记录器实例,以便将“标记”添加到日志语句中。在这种情况下,“标签”通常描述一个子域,默认Rails.logger使用它来允许您在多用户、多实例生产应用程序中使用子域、请求ids等来标记日志语句。

代码语言:javascript
运行
复制
include 
ActiveSupport::TaggedLogging::Formatter

Formatter类的
。

票数 0
EN

Stack Overflow用户

发布于 2021-11-18 19:35:56

你能粘贴CustomLogstash类的内容吗?从文档中,这个类应该响应调用方法并返回散列

这对我来说很有效:

代码语言:javascript
运行
复制
class CustomLogstash
  def call(data)
    { time: Time.now, controller: data[:controller] } # this can be anything as long it is Hash, eg. data.merge(time: Time.now)

  end
end

上面的输出示例:

代码语言:javascript
运行
复制
{:time=>"2021-11-18T20:31:41.486+01:00", :controller=>"calendar_events"}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69950804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档