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
.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格式记录,则可以将其登录到某些文件而不是