2

私はずっとStackdriver Loggingを使用していましたが、今はエラー報告を利用したいと思います。私はPythonのロギングメカニズムを使用し、error_reportingライブラリを使用するのではなく、可能であれば(さまざまな理由で)ログファイルから例外を取り除きたいと考えています。それは、ドキュメントは非常に混乱していると言われています。例えば、ドキュメントは言う: はhttps://cloud.google.com/error-reporting/docs/setup/compute-engine#log_exceptionsStackdriverにエラーを記録する方法Stackdriver経由でPythonにログインする

まず、流暢-ロガー - Pythonライブラリをインストールします。

sudoのピップ--upgrade

たリードをGoogleのクラウド・エラー報告をインストール私はgoogle-cloud-error-reportingをforkしているとか、fluent-logger-pythonに関連していると信じていますが、私はgoogle-cloud-error-reportingを初期化するとローカルに接続するのではなくGCEメタデータサーバに直接呼び出します流暢。これら2つの関連性のないパッケージ、またはドキュメントが間違っているか誤解を招くことはありますか? 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>