【问题标题】:writing logs on appengine java to stackdriver-logging将 appengine java 上的日志写入 stackdriver-logging
【发布时间】:2017-03-23 13:30:14
【问题描述】:

我有一个在 appengine 上运行的 java 应用程序。

我在 json 结构中记录我的日志,然后我可以在 stack driver 上看到我的日志(如在 docs 中)

package com.foo.bar;

public class MyClass {

    private static final Logger log = Logger.getLogger(MyClass.class.getName());

    public void myFunc() {
        log.info("{msg: 'hello', corId: '123'}");
    }

这是我在 stackdriver-logging 上收到的消息:

com.foo.bar.MyClass myFunc: {msg: 'hello', corId: '123'}

在日志请求对象中:

protoPayload.line[].logMessage = "com.foo.bar.MyClass myFunc: {msg: 'hello', corId: '123'}"

如何使日志消息成为我正在记录的消息 - 没有类前缀: {msg: 'hello', corId: '123'}

protoPayload.line[].logMessage = "{msg: 'hello', corId: '123'}"

【问题讨论】:

    标签: java google-app-engine logging


    【解决方案1】:

    我最终通过 logstash 将日志从 stackdriver 发送到 alasticsearch

    在logstash中我解析了我的日志,我还分离了我的日志,因为每个日志都作为自己的记录,而不是嵌套数组 看: How to ship logs from pods on Kubernetes running on top of GCP to elasticsearch/logstash?

    我在 logstash 中用于解析日志的配置:

    filter {
      if [resource][type] == "gae_app" {
        # split the protoPayload.line array, so each log message is a separate entry in Elasticsearch
        split {
          field => "[protoPayload][line]"
          target => "line"
          remove_field => [  "httpRequest", "operation", "protoPayload"]
        }
        # extract `line.logMessage` and `line.severity` fields
        mutate {
          add_field => {"logMessage" => "%{[line][logMessage]}"}
          replace => {"severity" => "%{[line][severity]}"}
          remove_field => ["line"]
        }
        # remove the `com.example.MyClass myFunc: ` prefix from log
        grok {
          match => { "logMessage" => "^%{DATA}: %{GREEDYDATA:parsedMessage}"}
        }
        # parse the log message into json, json fields will be located in root
        json {
          source => "parsedMessage"
          target => "jsonPayload"
          add_field => {"[jsonPayload][level]" => "%{severity}"}
          remove_field => ["parsedMessage", "logMessage"]
        }
    
        # uniform GAE logs to the structure of GKE logs
        grok {
          match => {  # check..
            "[resource][labels][version_id]" =>
            "^%{DATA:[resource][labels][container_name]}-%{GREEDYDATA:[resource][labels][namespace_id]}"}
        }
    
    
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 2018-02-09
      • 2019-07-22
      • 1970-01-01
      • 2018-07-20
      相关资源
      最近更新 更多