Google compute engine Google Stackdriver错误报告未拾取错误

Google compute engine Google Stackdriver错误报告未拾取错误,google-compute-engine,fluentd,stackdriver,google-cloud-stackdriver,google-cloud-error-reporting,Google Compute Engine,Fluentd,Stackdriver,Google Cloud Stackdriver,Google Cloud Error Reporting,错误和报告工具无法识别严重性为“错误”的日志。应用程序日志通过fluentd代理直接指向Google Stackdriver日志,其中一些是第三方java组件 { insertId: "14sf3lvg3ccncgh" jsonPayload: { class: "o.a.w.MarkupContainer" message: "Unable to find component with id 'search2' in [Form [Component id

错误和报告工具无法识别严重性为“错误”的日志。应用程序日志通过fluentd代理直接指向Google Stackdriver日志,其中一些是第三方java组件

{
 insertId:  "14sf3lvg3ccncgh"   
 jsonPayload: {
   class:  "o.a.w.MarkupContainer"    
   message:  "Unable to find component with id 'search2' in [Form [Component id = form]]
              Expected: 'form:search2'.
              Found with similar names: 'form:search'
        at org.apache.wicket.markup.MarkupStream.throwMarkupException(MarkupStream.java:526) ~[wicket-core-6.22.0.jar:6.22.0]
        at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1438) ~[wicket-core-6.22.0.jar:6.22.0]
        at org.apache.wicket.MarkupContainer.renderAll(MarkupContainer.java:1557) ~[wicket-core-6.22.0.jar:6.22.0]
        at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1532) ~[wicket-core-6.22.0.jar:6.22.0]
        at org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1487) ~[wicket-core-6.22.0.jar:6.22.0]"    
   milsec:  "576"    
   reportLocation: {…}    
   serviceContext: {…}    
   tag:  "test.gui"    
   thread:  "[ajp-apr-8009-exec-5]"    
 }
 labels: {…}   
 logName:  "projects/myservice/logs/test.gui"   
 receiveTimestamp:  "2017-08-29T15:20:16.847782870Z"   
 resource: {…}   
 severity:  "ERROR"   
 timestamp:  "2017-08-29T15:20:11Z"   
}
使用以下配置可以将我的应用程序日志正确转发到Googles Stackdriver日志,并正确标识所有条目

<source>
  @type tail
  path /var/log/test/test_gui/test_gui.log
  pos_file /var/lib/google-fluentd/pos/test_gui-multiline.pos
  read_from_head true
  tag test.gui
  format multiline
  time_format %Y-%m-%d %H:%M:%S
  format_firstline /\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2},\d{1,3}\s(?<severity>\S*)/
  format1 /^(?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}),(?<milsec>\d{1,3})\s(?<severity>\S*)\s(?<class>\S*)\s(?<thread>\[\S*\])\s(?<message>.*)/
</source>

@型尾
路径/var/log/test/test\u gui/test\u gui.log
pos_文件/var/lib/google fluentd/pos/test_gui-multiline.pos
从你的头上读出来是真的
tagtest.gui
格式化多行
时间\u格式%Y-%m-%d%H:%m:%S
格式_firstline/\d{4}-\d{1,2}-\d{1,2}\d{1,2}:\d{1,2}:\d{1,2}、\d{1,3}\s(?\s*)/
格式1/^(?\d{4}-\d{1,2}-\d{1,2}\d{1,2}:\d{1,2}:\d{1,2}),(?\d{1,3})\s(?\s*)\s(?\s*)\s(?\[\s*\)\s(?.*)/
但是,对于严重性错误,错误报告从未注意到这些条目

输出被标识为textPayLoad,我使用了以下过滤器,确保输出为jsonPayload

<filter test.gui>
  @type record_transformer
  <record>
    serviceContext {"service": "test.gui", "version": "1"}
    reportLocation {"filePath": "test_gui.log", "lineNumber": "unknown", "functionName": "unknown"}
   tag ${tag}
  </record>
</filter>

@型记录变压器
serviceContext{“服务”:“test.gui”,“版本”:“1”}
reportLocation{“filePath”:“test_gui.log”,“lineNumber”:“unknown”,“functionName”:“unknown”}
标记${tag}
仍然忽略了错误jsonPayload

如果使用过滤器替换消息,则错误报告会突然起作用

 <filter test.gui>
      @type record_transformer
      <record>
        serviceContext {"service": "test.gui", "version": "1"}
        reportLocation {"filePath": "test_gui.log", "lineNumber": "unknown", 
        "functionName": "unknown"}
        message "java.lang.TestError: msg
           at com.example.TestClass.test (TestClass.java:51)
           at com.example.AnotherClass (AnotherClass.java:25)"
       tag ${tag}
     </record>
    </filter>

@型记录变压器
serviceContext{“服务”:“test.gui”,“版本”:“1”}
reportLocation{“filePath”:“test_gui.log”,“lineNumber”:“unknown”,
“functionName”:“未知”}
消息“java.lang.TestError:msg
位于com.example.TestClass.test(TestClass.java:51)
位于com.example.AnotherClass(AnotherClass.java:25)”
标记${tag}

我如何强制错误报告选择这些错误条目,因为我的下一步是实现某种形式的警报。

第三方没有生成正确的Java堆栈跟踪。我需要reportLocation,但这需要上下文

我更改了以下行:

reportLocation {"filePath": "test_gui.log", "lineNumber": "unknown", "functionName": "unknown"}

这确保了Stackdriver错误报告现在可以提取日志

这是我的过滤器的最终版本:

<filter test.gui>
  @type record_transformer
  <record>
    serviceContext {"service": "test.gui", "version": "1"}
    context { "reportLocation" : {"filePath": "test_gui.log", "lineNumber": 1, "functionName": "unknown"} }
   tag ${tag}
  </record>
</filter> 

@型记录变压器
serviceContext{“服务”:“test.gui”,“版本”:“1”}
上下文{“reportLocation”:{“filePath”:“test_gui.log”,“lineNumber”:1,“functionName”:“unknown”}
标记${tag}
<filter test.gui>
  @type record_transformer
  <record>
    serviceContext {"service": "test.gui", "version": "1"}
    context { "reportLocation" : {"filePath": "test_gui.log", "lineNumber": 1, "functionName": "unknown"} }
   tag ${tag}
  </record>
</filter>