python - 跨多个模块的 Flask 日志记录
问题描述
我在 Flask 中有以下目录结构,我正在尝试将日志记录添加到该系统。我的 API 在 API 中定义main.py
并backend.py
提供了一些后端逻辑。
├── README.md
├── __init__.py
├── main.py
├── module
│ ├── __init__.py
│ └── backend.py
我的 APImain.py
在文件中定义和记录相关组件如下:
from logging.config import dictConfig
import logging
from module import backend
log_level = "DEBUG"
LOGFILENAME = "flask.log"
dictConfig({
'version': 1,
'formatters': {'default': {
'format': '[%(asctime)s] {%(pathname)s:%(funcName)s:%(lineno)d} %(levelname)s - %(message)s',
}},
'handlers': {'default': {
'level': 'DEBUG',
'formatter': 'default',
'class': 'logging.handlers.RotatingFileHandler',
'filename': LOGFILENAME,
'maxBytes': 5000000,
'backupCount': 10
}},
'root': {
'level': log_level,
'handlers': ['default']
}
})
app = Flask(__name__)
logger = logging.getLogger(__name__)
@app.route('/')
def hello():
logger.debug("DEBUG: Inside the home function")
logger.info("INFO: Inside the home function")
backend.test()
return "Welcome"
日志在 main.py 中按预期工作。根据log_level
,日志被写入LOGFILENAME
.
当我尝试通过 backend.py 中的以下步骤启用日志记录时,会出现问题。
import logging
logger = logging.getLogger(__name__)
def test():
logger.info("info test")
logger.debug("debug test")
我没有看到任何日志backend.py
被写入flask.log
. 我觉得我错过了一些东西,但不明白是什么。任何帮助表示赞赏。
解决方案
您的库确实有不同的记录器名称。对于两者,您需要具有相同的记录器名称。例如,参见日志记录手册。
最佳实践是您创建自己的日志记录层次结构,例如 main.py ( logger = logging.getLogger("myapp")
) 中的“myapp”,并在 backend.py 中附加到它,例如myapp.backend
( logger = logging.getLogger(".".join("myapp", __name__))
.
在下面找到您的 main.py 和 backend.py 的略微修改版本。我已经删除了 Flask 部分。我想这不会影响日志记录机制。
主文件
import logging.config
from module import backend
dict_config = {
'version': 1,
'formatters': {
'default': {
'format': '[%(asctime)s] {%(pathname)s:%(funcName)s:%(lineno)d} %(levelname)s - %(message)s',
}
},
'handlers': {'default': {
'level': 'DEBUG',
'formatter': 'default',
'class': 'logging.handlers.RotatingFileHandler',
'filename': "test.log",
'maxBytes': 5000000,
'backupCount': 10
},
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG',
'formatter': 'default',
},
},
'loggers': {
'myapp': {
'handlers': ["default"],
'level': 'DEBUG',
},
},
'root': {
'handlers': ["console"],
'level': 'DEBUG',
},
}
print(__name__)
logger = logging.getLogger("myapp")
logging.config.dictConfig(dict_config)
def hello():
logger.debug("DEBUG: Inside the home function")
logger.info("INFO: Inside the home function")
backend.test()
return "Welcome"
print(hello())
后端.py
import logging
logger = logging.getLogger("myapp")
def test():
logger.info("info test")
logger.debug("debug test")