Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的自定义格式化程序可以';无法处理格式化的日志消息_Python_Python 3.x_Logging_Formatter - Fatal编程技术网

Python中的自定义格式化程序可以';无法处理格式化的日志消息

Python中的自定义格式化程序可以';无法处理格式化的日志消息,python,python-3.x,logging,formatter,Python,Python 3.x,Logging,Formatter,我的python Flask应用程序中有一个自定义格式化程序,我已将其添加到根记录器中: logger = logging.getLogger() logger.setLevel(logging.INFO) handler = logging.StreamHandler() handler.setLevel(logging.INFO) formatter = CustomLoggingFormatter() handler.setFormatter(formatter) logger.ad

我的python Flask应用程序中有一个自定义格式化程序,我已将其添加到根记录器中:

logger = logging.getLogger()
logger.setLevel(logging.INFO)

handler = logging.StreamHandler()
handler.setLevel(logging.INFO)

formatter = CustomLoggingFormatter()
handler.setFormatter(formatter)

logger.addHandler(handler)
当我想记录一些东西(logger.info()…)时,这种方法非常有效,但我对来自库(例如uwsgi)的日志有一个问题

以下是日志消息的示例:

{@timestamp:“2017-09-25T06:57:45.373Z”,“级别”:“信息”,“消息”: “*在%s://%s:%d/%s上运行”}

我认为我的格式化程序可能有问题,但当我记录CustomLoggingFormatter接收的日志记录时,上面一行的情况如下:

日志记录:werkzeug,20,/lib/python3.5/site-packages/werkzeug//\u internal.py,87,“*在%s://%s:%d/%s上运行”

这是我的CustomLoggingFormatter:

class CustomLoggingFormatter(Formatter):
    data = {}

    def __init__(self):
        super(CustomLoggingFormatter, self).__init__()

    def format(self, record):
        print(record)
        input_data = {}
        input_data['@timestamp'] = datetime.utcnow().isoformat()[:-3] + 'Z'
        input_data['level'] = record.levelname
        if record.msg:
            input_data['message'] = record.msg

        input_data.update(self.data)
        return json.dumps(input_data)

要使我的格式化程序正常工作,似乎必须首先解决字符串格式化问题,但对于一些库来说,这是不可能的。谁知道如何解决这个问题

您需要始终调用
record.getMessage()
;它接受
record.msg
的值并对其应用格式。将结果指定给
record.message
,以便插入到最终字符串中。您是否也在代码中添加了以下内容:

def format(self, record):
    print(record)
    record.message = record.getMessage()
    input_data = {}
    input_data['@timestamp'] = datetime.utcnow().isoformat()[:-3] + 'Z'
    input_data['level'] = record.levelname

    if record.message:
        input_data['message'] = record.message

    input_data.update(self.data)
    return json.dumps(input_data)

请务必显示您的自定义代码
Formatter.format()
始终必须处理
LogRecord
实例;默认实现调用
Formatter.formatMessage()
来处理实际的格式化(通常使用
vars(record)
作为字典)。添加了my CustomLoggingFormatter:),因为格式化程序实现在Python版本之间发生了一些更改,你运行的是什么版本的Python?它使用的是Python 3.5:)非常有魅力!非常感谢:)