[英]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對象,其中包含:
{
"message": "Error occurred!.",
"severity": "ERROR",
"timestamp": {
"seconds": 1437712034000,
"nanos": 905
}
}
(來自Google的信息: https : //code.google.com/p/googleappengine/issues/detail?id = 11678#c5 )
請參閱: 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.