我在Flask中具有以下目录结构,并且尝试向该系统添加日志记录。我的API在main.py
中定义,backend.py
为API提供了一些后端逻辑。
├── README.md
├── __init__.py
├── main.py
├── module
│ ├── __init__.py
│ └── backend.py
我的API在main.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中工作。根据{{1}},日志会写入log_level
。
当我尝试通过backend.py内部的以下步骤启用日志记录时,会出现问题。
LOGFILENAME
我没有看到import logging
logger = logging.getLogger(__name__)
def test():
logger.info("info test")
logger.debug("debug test")
的任何日志都写入了backend.py
。我感觉我想念一些东西,但不明白。任何帮助表示赞赏。
答案 0 :(得分:2)
您的库确实有一个不同的记录器名称。两者都需要使用相同的记录器名称。例如,请参见the logging cookbook。
最佳实践是您创建自己的日志记录层次结构,例如在main.py(logger = logging.getLogger("myapp")
)中创建“ myapp”,并使用例如myapp.backend
({{ 1}}。
在以下位置找到main.py和backend.py的略微修改版本。我已经删除了烧瓶部分。我想这不会影响测井技术。
logger = logging.getLogger(".".join("myapp", __name__))
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())
答案 1 :(得分:0)
我认为我找到了解决问题的方法。下面给出的是我更新的main.py
和backend.py
,并确认能正常工作
main.py
import logging
from module import backend
log_level = "DEBUG"
LOGFILENAME = "flask.log"
class LoggerConfig:
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__)
logging.config.dictConfig(LoggerConfig.dictConfig)
@app.route('/')
def hello():
app.logger.debug("DEBUG: Inside the home function")
app.logger.info("INFO: Inside the home function")
backend.test()
return "Welcome"
backend.py
import logging
logger = logging.getLogger()
def test():
logger.info("info test")
logger.debug("debug test")
如果您注意到,backend.py
的第二行基本上是logging.getLogger()
,没有名称。这在backend side
上起到了作用。
此外,API方面(app.logger
方面的main.py
也有帮助。
总体而言,我能够同时将main.py
和backend.py
写入dictConfig
中给定的相同文件中。