我正在尝试在计算引擎VM实例上获取JSON格式的日志,以显示在Google Developer Console的日志查看器中。根据{{3}},应该可以这样做:
使用App Engine托管VM的应用程序应编写自定义日志 文件到VM的日志目录/ var / log / app_engine / custom_logs。 这些文件会自动收集并在日志中可用 查看器。
自定义日志文件必须具有后缀.log或.log.json。如果是后缀 是.log.json,日志必须是JSON格式,每个JSON对象一个 线。如果后缀为.log,则日志条目将被视为纯文本。
这对我来说似乎不起作用:以.log
结尾的日志在日志查看器中可见,但显示为纯文本。以.log.json
结尾的日志根本不可见。
这也与最近的另一篇文章相矛盾,该文章指出this documentation。
据我所知,Google使用file names must end in .log and its contents are treated as plain text进入日志查看器。在GitHub存储库中,我找不到任何证据表明.log.json
文件正在编入索引。
有谁知道如何让这个工作?或者文档是否已过时,是否因某种原因删除了此功能?
答案 0 :(得分:3)
以下是为托管虚拟机日志查看器生成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
的名称。
答案 1 :(得分:0)
我目前正在处理在托管VM上运行的NodeJS应用程序,我还试图将我的日志打印在Google Developper Console上。我按照文档中的描述在'/ var / log / app_engine'目录中创建了我的日志文件。不幸的是,即使对于'.log'文件,这似乎也不适合我。
您能描述一下您的日志创建地点吗?此外,您的托管VM是否配置为“由Google管理”或“由用户管理”?谢谢!