4

我正在尝试在 Compute Engine VM 实例上获取 JSON 格式的日志,以显示在 Google Developer Console 的日志查看器中。根据此文档,应该可以这样做:

使用 App Engine 托管虚拟机的应用程序应将自定义日志文件写入位于 /var/log/app_engine/custom_logs 的虚拟机日志目录。这些文件会自动收集并在日志查看器中提供。

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

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

它还与另一篇最近的文章相矛盾,该文章指出文件名必须以 .log 结尾,并且其内容被视为纯文本

据我所知,谷歌使用fluentd 将日志文件索引到日志查看器中。在 GitHub 存储库中,我找不到任何.log.json文件被索引的证据。

有谁知道如何让这个工作?还是文档已过时并且由于某种原因已删除此功能?

4

2 回答 2

3

这是为托管 VM 日志查看器生成 JSON 日志的一种方法:

所需的 JSON 格式

目标是为每个日志行创建一个单行 JSON 对象,其中包含:

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

(信息来源于谷歌: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日志的名称。

于 2015-07-23T20:40:43.610 回答
0

我目前正在开发在托管 VM 上运行的 NodeJS 应用程序,并且我也在尝试将我的日志打印在 Google Developerper 控制台上。如文档中所述,我在“/var/log/app_engine”目录中创建了我的日志文件。不幸的是,这似乎对我不起作用,即使对于“.log”文件也是如此。

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

于 2015-03-17T10:35:52.113 回答