我使用gem“Lograge”0.3.6和Rails 4.2。我在config/environment/development.rb文件中对此进行了配置
config.lograge.enabled = true
config.lograge.formatter = CustomLogstash.new
但是,我注意到log/development.log文件中的输出没有在每行前面包含日期/时间。如何配置lograge (或者可能只配置我的Rails记录器?)在该文件的每一行添加日期和时间前缀?
发布于 2021-11-16 12:29:47
如果有帮助,你可以在config中添加以下内容吗?
config.lograge.formatter = ->(data) { data.reverse_merge({time: Time.now}) }# data is a ruby hash.
它将为您提供如下输出
{: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}
发布于 2021-11-18 09:32:37
根据lograge
的official documentation,您可以使用custom_options
EDIT 1:使用time: Time.now
或time:event.time
编辑custom_options
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中,如下所示
gem "logstash-event"
EDIT 2:基于使用:time => event.time
的注释custom_options的更新
#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 日期和时间中的一个修复
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
# 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等来标记日志语句。
include
ActiveSupport::TaggedLogging::Formatter
Formatter
类的
。
发布于 2021-11-18 19:35:56
你能粘贴CustomLogstash类的内容吗?从文档中,这个类应该响应调用方法并返回散列。
这对我来说很有效:
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
上面的输出示例:
{:time=>"2021-11-18T20:31:41.486+01:00", :controller=>"calendar_events"}
https://stackoverflow.com/questions/69950804
复制相似问题