添加客户端IP地址到烧瓶记录

问题描述 投票:0回答:1

import logging from flask import request, has_request_context class RequestFormatter(logging.Formatter): def format(self, record): if has_request_context(): record.remote_addr = request.remote_addr else: record.remote_addr = 'unknown' return super().format(record) stream_handler = logging.StreamHandler() formatter = RequestFormatter('{"logger": "%(name)s", "level": "%(levelname)s", "timestamp": "%(asctime)s", "message": "%(message)s", "ip": "%(remote_addr)s", "filename": "%(filename)s", "function": "%(funcName)s", "line": %(lineno)d}') stream_handler.setFormatter(formatter) logging.basicConfig(level=logging.NOTSET, handlers=[stream_handler]) loggers = [logging.getLogger(name) for name in logging.root.manager.loggerDict] for logger in loggers: logger.handlers = [] logger.addHandler(stream_handler) logger.propagate = False logging.getLogger().handlers = [] logging.getLogger().addHandler(stream_handler)

现在,请求Formatter将Record.Remote_Addr设置为Unknown,因为HAS_REQUEST_CONTEXT()始终返回false。我尝试将请求构造类移至app.py文件中,但这无济于事。我在做什么错?

你几乎是正确的。我认为,请求上下文在

werkzeug

中不可用,这就是为什么IP为
python flask
1个回答
0
投票
。您还应该更改Flask默认处理程序的格式化器。您也可以使用

.clear()

删除所有处理程序。我还建议使用烧瓶应用的记录器(例如
app.logger.info(...)
.
我是我编辑的代码:
import logging

from flask.logging import default_handler
from flask import Flask, request, has_request_context


LOGGING_FORMAT: str = '{"logger": "%(name)s", "level": "%(levelname)s", "timestamp": "%(asctime)s", "message": "%(message)s", "ip": "%(remote_addr)s", "filename": "%(filename)s", "function": "%(funcName)s", "line": %(lineno)d}'


class RequestFormatter(logging.Formatter):
    def format(self, record):
        if has_request_context():
            record.remote_addr = request.remote_addr
        else:
            record.remote_addr = "unknown"
        return super().format(record)


def setup_logging() -> None:
    stream_handler = logging.StreamHandler()
    logging.basicConfig(level=logging.NOTSET, handlers=[stream_handler])

    formatter = RequestFormatter(LOGGING_FORMAT)

    stream_handler.setFormatter(formatter)
    default_handler.setFormatter(formatter)

    for logger_name in logging.root.manager.loggerDict:
        logger = logging.getLogger(logger_name)
        logger.handlers.clear()
        logger.addHandler(stream_handler)
        logger.propagate = False


def make_app() -> Flask:
    app = Flask(__name__)

    @app.route("/")
    def root():
        app.logger.info("Logging works!")

        return "hello"

    return app


if __name__ == "__main__":
    setup_logging()
    make_app().run(debug=True, port=2121)

,我没有完全理解您的方法。如果需要JSON格式记录,则可以将其登录到某些文件而不是

stdout中,您可以轻松地通过记录/监视解决方案集成。但是看上去很糟糕。 See

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.