日志关联
编辑日志关联编辑
可以通过三种不同的方式设置跟踪/日志关联。
Rails TaggedLogging编辑
使用 ActiveSupport::TaggedLogging
记录器配置的 Rails 应用程序可以将关联 ID 附加到日志输出中。例如,在您的 config/environments/production.rb
文件中,添加以下内容
config.log_tags = [ :request_id, proc { ElasticAPM.log_ids } ] # Logs will then include the correlation IDs: # # [transaction.id=c1ae84c8642891eb trace.id=b899fc7915e801b7558e336e4952bafe] Started GET "/" for 127.0.0.1 at 2019-09-16 11:28:46 +0200 # [transaction.id=c1ae84c8642891eb trace.id=b899fc7915e801b7558e336e4952bafe] Processing by ApplicationController#index as HTML # [transaction.id=c1ae84c8642891eb trace.id=b899fc7915e801b7558e336e4952bafe] Rendering text template # [transaction.id=c1ae84c8642891eb trace.id=b899fc7915e801b7558e336e4952bafe] Rendered text template (Duration: 0.1ms | Allocations: 17) # [transaction.id=c1ae84c8642891eb trace.id=b899fc7915e801b7558e336e4952bafe] Completed 200 OK in 1ms (Views: 0.4ms | Allocations: 171)
**注意:** 由于 Rails 计算日志标签和执行请求的顺序,可能不会包含 span ID。请考虑改用 Lograge
,因为其钩子的时间允许在日志中捕获 span ID。
Lograge编辑
在您的 Rails 应用程序中启用并设置了 lograge
后,修改 Rails 环境配置文件中的 custom_options
块。返回的 Hash
将包含在结构化的 Lograge 日志中。
config.lograge.custom_options = lambda do |event| ElasticAPM.log_ids do |transaction_id, span_id, trace_id| { :'transaction.id' => transaction_id, :'span.id' => span_id, :'trace.id' => trace_id } end end # Logs will then include the correlation IDs: # # I, [2019-09-16T11:59:05.439602 #8674] INFO -- : method=GET path=/ format=html controller=ApplicationController action=index status=200 duration=0.36 view=0.20 transaction.id=56a9186a9257aa08 span.id=8e84a786ab0abbb2 trace.id=1bbab8ac4c7c9584f53eb882ff0dfdd8
您还可以将 ID 嵌套在单独的文档中,如下例所示
config.lograge.custom_options = lambda do |event| ElasticAPM.log_ids do |transaction_id, span_id, trace_id| { elastic_apm: { :'transaction.id' => transaction_id, :'span.id' => span_id, :'trace.id' => trace_id } } end end # Logs will then include the correlation IDs in a separate document: # # I, [2019-09-16T13:39:35.962603 #9327] INFO -- : method=GET path=/ format=html controller=ApplicationController action=index status=200 duration=0.37 view=0.20 elastic_apm={:transaction_id=>"2fb84f5d0c48a296", :span_id=>"2e5c5a7c85f83be7", :trace_id=>"43e1941c4a6fff343a4e018ff7b92000"}
手动格式化日志编辑
您可以直接访问关联 ID 并通过日志格式化程序添加它们。
require 'elastic_apm' require 'logger' logger = Logger.new(STDOUT) logger.progname = 'TestRubyApp' logger.formatter = proc do |severity, datetime, progname, msg| "[#{datetime}][#{progname}][#{severity}][#{ElasticAPM.log_ids}] #{msg}\n" end # Logs will then include the correlation IDs: # # [2019-09-16 11:54:59 +0200][RailsTestApp][INFO][transaction.id=3b92edcccc0a6d1e trace.id=1275686e35de91f776557637e799651e] Started GET "/" for 127.0.0.1 at 2019-09-16 11:54:59 +0200 # [2019-09-16 11:54:59 +0200][RailsTestApp][INFO][transaction.id=3b92edcccc0a6d1e trace.id=1275686e35de91f776557637e799651e] Processing by ApplicationController#index as HTML # [2019-09-16 11:54:59 +0200][RailsTestApp][INFO][transaction.id=3b92edcccc0a6d1e span.id=3bde4e9c85ab359c trace.id=1275686e35de91f776557637e799651e] Rendering text template # [2019-09-16 11:54:59 +0200][RailsTestApp][INFO][transaction.id=3b92edcccc0a6d1e span.id=f3d7e32f176d4c93 trace.id=1275686e35de91f776557637e799651e] Rendered text template (Duration: 0.1ms | Allocations: 17) # [2019-09-16 11:54:59 +0200][RailsTestApp][INFO][transaction.id=3b92edcccc0a6d1e span.id=3bde4e9c85ab359c trace.id=1275686e35de91f776557637e799651e] Completed 200 OK in 1ms (Views: 0.3ms | Allocations: 187)
从日志中提取跟踪 ID编辑
为了使日志关联正常工作,必须从日志消息中提取跟踪 ID 并将其存储在 Elasticsearch 文档中的单独字段中。有很多方法可以实现这一点,例如使用摄取节点并使用 grok 处理器定义管道。您可以像这样从上面生成的 Lograge 输出中提取跟踪 ID
PUT _ingest/pipeline/extract_trace_id { "description": "Extract trace id from Lograge logs", "processors": [ { "grok": { "field": "message", "patterns": ["%{TIME}.*\\| [A-Z]\\, \\[%{TIMESTAMP_ISO8601}.*\\] %{LOGLEVEL:log.level} [-]{2} \\: \\[[0-9A-Fa-f\\-]{36}\\] \\{.*\\\"trace\\.id\\\"\\:\\\"%{TRACE_ID:trace.id}.*\\}"], "pattern_definitions": { "TRACE_ID": "[0-9A-Fa-f]{32}" } } } ] }
有关更多信息,请参阅可观测性集成。