2

我一直在使用Stackdriver记录很长一段时间,现在我想利用错误报告。如果可能的话(出于各种原因)而不是使用error_reporting库,我宁愿使用Python的日志记录机制并从日志文件中删除异常。话虽如此,文件很混乱。例如,文件说: https://cloud.google.com/error-reporting/docs/setup/compute-engine#log_exceptions如何记录错误到Stackdriver错误报告通过Stackdriver登录Python

首先,安装流利记录器 - Python库:

须藤PIP安装谷歌云 - 错误报告--upgrade

导致我相信谷歌云错误报告是fluent-logger-python的一个分支,但是当我初始化google-cloud-error-reporting时,它直接调用GCE元数据服务器而不是连接到本地fluentd。这两个不相关的软件包或文档是错误还是误导?如果我将JSON格式的异常发送到fluentd或通过fluentd监视的日志文件,错误报告会理解它们吗?

感谢您的任何澄清

回答

1

该文档是错误的。
TL; DR你要输出的东西,看起来像https://cloud.google.com/error-reporting/docs/formatting-error-messages

这里是我的解决方案:

#Parse raw log entries to expose severity field so that 
#StackDriver log viewer can properly categorize (and so we can filter) 
<source> 
    @type tail 
    path /var/log/conductor 
    pos_file /var/log/td-agent/conductor.pos 
    format multiline 
    format_firstline /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/ 
    format1 /^(?<message>(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),\d*\s*[a-zA-Z_]*\s*(?<severity>[A-Z]*).*)/ 
    read_from_head true 
    multiline_flush_interval 3s 
    tag conductor.app 
</source> 

#Add hostname field 
<filter conductor.app> 
    @type record_transformer 
    <record> 
    hostname ${hostname} 
    </record> 
</filter> 

#Filter and tag log entries of severity ERROR or CRITICAL 
<match conductor.app> 
    @type rewrite_tag_filter 
    rewriterule1 severity ERROR|CRITICAL conductor.err 
    rewriterule2 severity .+ conductor.info 
</match> 

#Process entries with tracebacks differently than those without 
<match conductor.err> 
    @type rewrite_tag_filter 
    rewriterule1 message .*Traceback conductor.err.traceback 
    rewriterule2 message .+ conductor.err.message 
</match> 

#Parse out the traceback 
<match conductor.err.traceback> 
    @type parser 
    key_name message 
    format multiline 
    format1 /^(?<message>(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),\d*\s*(?<log>[a-zA-Z_]*)\s*(?<severity>[A-Z]*).*(? 
<traceback>Traceback .*))/ 
    tag conductor.err.traceback.report 
</match> 

#Format traceback reports 
<filter conductor.err.traceback.report> 
    @type record_transformer 
    <record> 
     serviceContext { 
     "service": "${record[\"log\"]}" 
     } 
     message ${record["traceback"]} 
    </record> 
    remove_keys traceback 
</filter> 

#Process errors that don't have tracebacks 
<match conductor.err.message> 
    @type parser 
    key_name message 
    format multiline 
    format1 /^(?<message>(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),\d*\s*(?<log>[a-zA-Z_]*)\s*(?<severity>[A-Z]*):\s*(?<report>.*))/ 
    tag conductor.err.message.report 
</match> 

#For errors without tracebacks we have to stub out some fields that 
#error reporting requires, but we don't have 
<filter conductor.err.message.report> 
    @type record_transformer 
    <record> 
     serviceContext { 
     "service": "${record[\"log\"]}" 
     } 
     message ${record["report"]} 
     reportLocation { 
     "filePath": "None", 
     "lineNumber": 0, 
     "functionName": "None" 
     } 
    </record> 
</filter> 

#Send to StackDriver logging! 
<match conductor.**> 
    @type google_cloud 
    buffer_chunk_limit 2M 
    flush_interval 5s 
    max_retry_wait 300 
    disable_retry_limit 
    num_threads 8 
</match>