【问题标题】:How to view JSON logs of a managed VM in the Log Viewer?如何在日志查看器中查看托管 VM 的 JSON 日志?
【发布时间】:2015-03-13 09:16:51
【问题描述】:

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

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

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

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

这也与另一篇最近的文章相矛盾,该文章指出file names must end in .log and its contents are treated as plain text

据我所知,Google 在日志查看器中使用了fluentd to index the log files。在 GitHub 存储库中,我找不到任何证据表明 .log.json 文件正在被索引。

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

【问题讨论】:

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


    【解决方案1】:

    这是为托管 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 的名称。

    【讨论】:

    • 谢谢,乔希!我还没有尝试过您的答案,但在我尝试之前我会将其标记为答案。在应用引擎的问题跟踪器中,您提到了很多空白日志。这是否意味着它仍然存在一些问题?
    • @Arjen 你是对的。我发布这个是因为它是谷歌的回应,它“应该”以这种方式工作。随着我继续取得进展,我会更新答案。
    【解决方案2】:

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

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

    【讨论】:

    • 我们将日志写入目录/var/log/app_engine/custom_logs。为了简化测试,您可以通过 SSH 连接到 VM 实例,然后使用 docker 在正在运行的映像中启动 bash 提示符,然后使用一些测试数据创建文件 /var/log/app_engine/custom_logs/app.log。您的虚拟机是由 Google 还是由用户管理并不重要。
    • 非常感谢阿杰!我的问题是我忘了用 Docker 启动 bash 提示符。我在托管 VM 而不是容器中进行测试...顺便说一下,这里是启动 docker 提示符的命令:“docker ps”来检索 id,然后是“docker exec -i -t bash”。我还可以确认 .log.json 文件不可见。
    • 这个问题不久前提交给谷歌,请给它你的+1:code.google.com/p/googleappengine/issues/detail?id=11678
    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2016-08-05
    相关资源
    最近更新 更多