簡體   English   中英

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

[英]How to view JSON logs of a managed VM in the Log Viewer?

我正在嘗試將計算引擎VM實例上的JSON格式日志顯示在Google Developer Console的日志查看器中。 根據此文檔 ,應該可以這樣做:

使用App Engine托管VM的應用程序應將自定義日志文件寫入VM的日志目錄/ var / log / app_engine / custom_logs。 這些文件會自動收集並在日志查看器中可用。

自定義日志文件必須具有后綴.log或.log.json。 如果后綴為.log.json,則日志必須為JSON格式,每行一個JSON對象。 如果后綴為.log,則將日志條目視為純文本。

這對我來說似乎不起作用:以.log結尾的日志在日志查看器中可見,但顯示為純文本。 .log.json結尾的日志.log.json不可見。

它還與最近的另一篇文章相矛盾,該文章指出文件名必須以.log結尾,其內容被視為純文本

據我所知,谷歌使用流利的將日志文件索引到日志查看器中。 在GitHub存儲庫中,我找不到任何證據表明.log.json文件正在編入索引。

有誰知道如何使這個工作? 或者文檔是否已過時,是否因某種原因刪除了此功能?

以下是為托管VMs日志查看器生成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名稱。

我目前正在處理在托管VM上運行的NodeJS應用程序,我還試圖將我的日志打印在Google Developper Console上。 我按照文檔中的描述在'/ var / log / app_engine'目錄中創建了我的日志文件。 不幸的是,即使對於'.log'文件,這似乎也不適合我。

你能描述一下你的日志創建地點嗎? 此外,您的托管VM是否配置為“由Google管理”或“由用戶管理”? 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM