我正在尝试为Flask应用配置日志记录,为此,我需要使用logging.config.dictConfig()
,因为我需要指定过滤器。在我需要过滤器之前,我使用了logging.config.fileConfig()
,一切正常。但是现在,我已更改为字典和配置,并且我的日志都没有显示在任何地方。就像字典配置被完全忽略了一样。我不知道自己在做什么错,因为我没有任何错误。这就是我原来的日志记录配置:
[loggers]
keys=root,rasa_core.agent,rasa_core.tracker_store,rasa_core.processor,test,run
[handlers]
keys=rootHandler,agentHandler,trackerHandler,convHandler,testHandler
[formatters]
keys=basic
[logger_root]
level=NOTSET
handlers=rootHandler
[logger_rasa_core.agent]
level=NOTSET
handlers=agentHandler
qualname=rasa_core.agent
[logger_rasa_core.tracker_store]
level=NOTSET
handlers=trackerHandler
qualname=rasa_core.tracker_store
[logger_rasa_core.processor]
level=NOTSET
handlers=convHandler
qualname=rasa_core.processor
[logger_test]
level=NOTSET
handlers=testHandler
qualname=my_app.trainer_app.routes
[logger_run]
level=NOTSET
handlers=rootHandler
qualname=__main__
[handler_rootHandler]
class=StreamHandler
level=INFO
formatter=basic
args=(sys.stdout,)
[handler_agentHandler]
class=FileHandler
level=NOTSET
formatter=basic
args=('my_app/logs/agent.log', 'a')
[handler_trackerHandler]
class=FileHandler
level=NOTSET
formatter=basic
args=('my_app/logs/tracker.log', 'a')
[handler_convHandler]
class=FileHandler
level=NOTSET
formatter=basic
args=('my_app/logs/conv.log', 'a')
[handler_testHandler]
class=StreamHandler
level=NOTSET
formatter=basic
args=(sys.stdout,)
[formatter_basic]
format=%(asctime)s - %(levelname)s - %(funcName)s - %(pathname)s - %(threadName)s - %(message)s
这是新的字典配置:
CONFIG = {
'version': 1,
'formatters': {
'standard': {
'format': '%(asctime)s - %(levelname)s - %(funcName)s - %(pathname)s - Session:%(session_id)s - %(message)s'
}
},
'handlers': {
'rootHandler': {
'class': 'logging.StreamHandler',
'level': 'INFO',
'formatter': 'standard',
'stream': 'ext://sys.stdout',
'filters': ['sessionFilter']
},
'agentHandler' :{
'class': 'logging.handlers.RotatingFileHandler',
'level': 'NOTSET',
'filename': 'my_app/logs/agent.log',
'maxBytes': 1024,
'backupCount': 3,
'formatter': 'standard',
'filters': ['sessionFilter']
},
'trackerHandler': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'NOTSET',
'filename': 'my_app/logs/tracker.log',
'maxBytes': 1024,
'backupCount': 3,
'formatter': 'standard',
'filters': ['sessionFilter']
},
'convHandler': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'NOTSET',
'filename': 'my_app/logs/conv.log',
'maxBytes': 1024,
'backupCount': 3,
'formatter': 'standard',
'filters': ['sessionFilter'],
},
'testHandler': {
'class': 'logging.StreamHandler',
'level': 'NOTSET',
'formatter': 'standard',
'stream': 'ext://sys.stdout',
'filters': ['sessionFilter']
}
},
'loggers': {
'root': {
'level': 'NOTSET',
'handlers': ['rootHandler', 'testHandler']
},
'rasa_core.agent': {
'level': 'NOTSET',
'handlers': ['agentHandler'],
},
'rasa_core.tracker_store': {
'level': 'NOTSET',
'handlers': ['trackerHandler'],
},
'rasa_core.processor': {
'level': 'NOTSET',
'handlers': ['convHandler', 'testHandler'],
},
'my_app.trainer_app.routes': {
'level': 'NOTSET',
'handlers': ['testHandler'],
}
},
'filters': {
'sessionFilter': {
'()': 'my_app.logging.filters.SessionFilter'
}
},
'disable_existing_loggers': False
}
这是我在配置中加载的代码:
import sys
import logging
from my_app.logging.dict_config import CONFIG
from my_app.trainer_app import routes
from my_app.trainer_app.app import app, app_config
from my_app.trainer_app.cherry import run_cp
print(CONFIG)
logging.config.dictConfig(CONFIG)
logger = logging.getLogger(__name__)
# logging.config.fileConfig(fname='my_app/config/logging.conf')
我注释掉了原始logging.config.fileConfig
,以显示原始位置。
我真的不明白为什么原来的日志记录配置可以正常工作,但是这种新的配置什么也没做。
答案 0 :(得分:0)
我知道了。由于某种原因,根记录器在文件配置中用''
代替名称'root'
来表示。使用此文件可解决此问题:
CONFIG = {
'version': 1,
'formatters': {
'standard': {
'format': '%(asctime)s - %(levelname)s - Session: %(session_id)s - %(message)s'
}
},
'handlers': {
'rootHandler': {
'class': 'logging.StreamHandler',
'level': 'INFO',
'formatter': 'standard',
'stream': 'ext://sys.stdout',
'filters': ['sessionFilter']
},
'agentHandler' :{
'class': 'logging.FileHandler',
'level': 'NOTSET',
'filename': 'my_app/logs/agent.log',
'formatter': 'standard',
'filters': ['sessionFilter']
},
'trackerHandler': {
'class': 'logging.FileHandler',
'level': 'NOTSET',
'filename': 'my_app/logs/tracker.log',
'formatter': 'standard',
'filters': ['sessionFilter']
},
'convHandler': {
'class': 'logging.FileHandler',
'level': 'NOTSET',
'filename': 'my_app/logs/conv.log',
'formatter': 'standard',
'filters': ['sessionFilter'],
},
'testHandler': {
'class': 'logging.StreamHandler',
'level': 'NOTSET',
'formatter': 'standard',
'stream': 'ext://sys.stdout',
'filters': ['sessionFilter']
},
'testHandlerNoFilter': {
'class': 'logging.StreamHandler',
'level': 'NOTSET',
'formatter': 'standard',
'stream': 'ext://sys.stdout'
}
},
'loggers': {
'': {
'level': 'NOTSET',
'handlers': ['rootHandler']
},
'rasa_core.agent': {
'level': 'NOTSET',
'handlers': ['agentHandler'],
},
'rasa_core.tracker_store': {
'level': 'NOTSET',
'handlers': ['trackerHandler'],
},
'rasa_core.processor': {
'level': 'NOTSET',
'handlers': ['convHandler', 'testHandler'],
},
'my_app.trainer_app.routes': {
'level': 'NOTSET',
'handlers': ['testHandler'],
}
},
'filters': {
'sessionFilter': {
'()': 'my_app.logging.filters.SessionFilter'
}
},
'disable_existing_loggers': False
}
唯一重要的区别是我将'root'
替换为''
。任何其他区别都与这个问题无关。