代码之家  ›  专栏  ›  技术社区  ›  Robert Jordan

如何通过Python中的Stackdriver登录将错误记录到Stackdriver错误报告中

  •  3
  • Robert Jordan  · 技术社区  · 7 年前

    https://cloud.google.com/error-reporting/docs/setup/compute-engine#log_exceptions

    首先,安装fluent logger python库:

    sudo pip安装google cloud错误报告--升级

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

    2 回复  |  直到 5 年前
        1
  •  3
  •   Robert Jordan    7 年前

    文件错误。
    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>
    
        2
  •  0
  •   Dina Graves Portman    5 年前

    https://cloud.google.com/run/docs/logging#writing_structured_logs

    您可以使用python创建dict并将其记录到Stackdriver,它将与跟踪相关。它应该看起来像这样(来自教程):

    # Build structured log messages as an object.
    global_log_fields = {}
    
    # Add log correlation to nest all log messages
    # beneath request log in Log Viewer.
    trace_header = request.headers.get('X-Cloud-Trace-Context')
    
    if trace_header and PROJECT:
        trace = trace_header.split('/')
        global_log_fields['logging.googleapis.com/trace'] = (
            f"projects/{PROJECT}/traces/{trace[0]}")
    
    # Complete a structured log entry.
    entry = dict(severity='NOTICE',
                 message='This is the default display field.',
                 # Log viewer accesses 'component' as jsonPayload.component'.
                 component='arbitrary-property',
                 **global_log_fields)
    
    print(json.dumps(entry))
    

    https://cloud.google.com/run/docs/error-reporting

    推荐文章