如何在日志查看器中查看托管VM的JSON日志?

时间:2015-03-13 09:16:51

标签: google-app-engine logging google-compute-engine google-cloud-platform fluentd

我正在尝试在计算引擎VM实例上获取JSON格式的日志,以显示在Google Developer Console的日志查看器中。根据{{​​3}},应该可以这样做:

  

使用App Engine托管VM的应用程序应编写自定义日志   文件到VM的日志目录/ var / log / app_engine / custom_logs。   这些文件会自动收集并在日志中可用   查看器。

     

自定义日志文件必须具有后缀.log或.log.json。如果是后缀   是.log.json,日志必须是JSON格式,每个JSON对象一个   线。如果后缀为.log,则日志条目将被视为纯文本。

这对我来说似乎不起作用:以.log结尾的日志在日志查看器中可见,但显示为纯文本。以.log.json结尾的日志根本不可见。

这也与最近的另一篇文章相矛盾,该文章指出this documentation

据我所知,Google使用file names must end in .log and its contents are treated as plain text进入日志查看器。在GitHub存储库中,我找不到任何证据表明.log.json文件正在编入索引。

有谁知道如何让这个工作?或者文档是否已过时,是否因某种原因删除了此功能?

2 个答案:

答案 0 :(得分:3)

以下是为托管虚拟机日志查看器生成JSON日志的一种方法:

所需的JSON格式

目标是为包含以下内容的每个日志行创建单行JSON对象:

{
    "message": "Error occurred!.",
    "severity": "ERROR",
    "timestamp": {
        "seconds": 1437712034000,
        "nanos": 905
    }
}

(来自Google的信息:https://code.google.com/p/googleappengine/issues/detail?id=11678#c5

使用python-json-logger

请参阅:https://github.com/madzak/python-json-logger

def get_timestamp_dict(when=None):
    """Converts a datetime.datetime to integer milliseconds since the epoch.

    Requires special handling to preserve microseconds.

    Args:
        when:
            A datetime.datetime instance. If None, the timestamp for 'now'
            will be used.

    Returns:
    Integer time since the epoch in milliseconds. If the supplied 'when' is
    None, the return value will be None.
    """
    if when is None:
        when = datetime.datetime.utcnow()

    ms_since_epoch = float(time.mktime(when.utctimetuple()) * 1000.0)
    return {
        'seconds': int(ms_since_epoch),
        'nanos': int(when.microsecond / 1000.0),
    }

def setup_json_logger(suffix=''):
    try:

        from pythonjsonlogger import jsonlogger

        class GoogleJsonFormatter(jsonlogger.JsonFormatter):

            FORMAT_STRING = "{message}"

            def add_fields(self, log_record, record, message_dict):
                super(GoogleJsonFormatter, self).add_fields(log_record,
                                                            record,
                                                            message_dict)

                log_record['severity'] = record.levelname
                log_record['timestamp'] = get_timestamp_dict()
                log_record['message'] = self.FORMAT_STRING.format(
                                            message=record.message,
                                            filename=record.filename,
                                            )

        formatter = GoogleJsonFormatter()

        log_path = '/var/log/app_engine/custom_logs/worker'+suffix+'.log.json'
        make_sure_path_exists(log_path)
        file_handler = logging.FileHandler(log_path)

        file_handler.setFormatter(formatter)
        logging.getLogger().addHandler(file_handler)

    except OSError:
        logging.warn("Custom log path not found for production logging")

    except ImportError:
        logging.warn("JSON Formatting not available")

要使用,只需致电setup_json_logger - 您可能还想更改日志worker的名称。

答案 1 :(得分:0)

我目前正在处理在托管VM上运行的NodeJS应用程序,我还试图将我的日志打印在Google Developper Console上。我按照文档中的描述在'/ var / log / app_engine'目录中创建了我的日志文件。不幸的是,即使对于'.log'文件,这似乎也不适合我。

您能描述一下您的日志创建地点吗?此外,您的托管VM是否配置为“由Google管理”或“由用户管理”?谢谢!