我正在尝试在Compute Engine VM实例上获取JSON格式的日志,以显示在Google Developer Console的日志查看器中。根据此文档,应该可以这样做:
使用App Engine托管VM的应用程序应将自定义日志文件写入/ var / log / app_engine / custom_logs的VM日志目录中。这些文件将自动收集并在Logs Viewer中可用。
自定义日志文件的后缀必须为.log或.log.json。如果后缀为.log.json,则日志必须为JSON格式,每行一个JSON对象。如果后缀为.log,则将日志条目视为纯文本。
这似乎对我不起作用:以结尾.log
的日志在“日志查看器”中可见,但显示为纯文本。以结尾的日志.log.json
根本不可见。
它还与最近的另一篇文章相反,该文章指出文件名必须以.log结尾,并且其内容被视为纯文本。
据我所知,Google使用Fluentd将日志文件编入了Log Viewer。在GitHub存储库中,我找不到任何.log.json
正在对文件建立索引的证据。
有谁知道如何使它工作?还是文档过时了,并且由于某些原因已删除了此功能?
这是为托管VM logviewer生成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
日志的名称。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句