在调用日志文件时出现报错
这个是日志代码
LOGGING_DIC = {
'version': 1.0,
'disable_existing_loggers': True,
# 日志格式
'formatters': {
'standard': {
'format': '%(asctime)s %(threadName)s:%(thread)d [%(name)s] %(levelname)s [%(pathname)s: %(lineno)d] %(message)s',
'datefmt': ' %Y-%m-%d %H:%M:%S',
},
'simple': {
'format': ' %(asctime) s[%(name)s] % (levelname)s % (message)s',
'datefmt': ' %Y-%m-%d %H:%M:%S',
},
'test': {'format': '%(asctime)s %(message)s',
},
},
'filters': {},
# 日志处理器
'handlers': {
'console_debug_handler': {
'level': 'DEBUG', # 日志处理的级别限制
'class ': 'logging.StreamHandler', # 输出到终端
'formatter': 'test' # 日志格式
},
'file_info_handler': {
'level': 'INFO',
'class ': 'logging.handlers.RotatingFileHandler', # 保存到文件,日志轮转
'filename': 'user.log',
'maxBytes': 1024 * 1024 * 10, # 日志大小 10M
'backupCount': 10, # 日志文件保存数量限制
'encoding': 'utf - 8',
'formatter': 'standard',
},
'file_debug_handler': {
'level': 'DEBUG',
'class ': 'logging.FileHandler', # 保存到文件
'filename': 'test.log', # 日志存放的路径
'encoding': 'utf - 8', # 日志文件的编码
'formatter': 'test',
},
},
# 日志记录器
'loggers': {
'logger1': { # 导入时logging.getLogger时使用的app_name'
'handlers': ['console_debug_handler'], # 日志分配到哪个handlers中
'level': 'DEBUG', # 日志记录的级别限制
'propagate': False, # 默认为True,向上(更高级别的logger)传递,设置为False即可,否则会一份日志向上层层传递
},
'logger2': {
'handlers': ['console_debug_handler', 'file_debug_handler'],
'level': 'INFO',
'propagate': False,
},
}
}
这个是调用代码
```python
import logging.config
from conf.setting import LOGGING_DIC
logging.config.dictConfig(LOGGING_DIC)
logger1 = logging.getLogger('logger1')
logger1.debug('xxx充值五毛钱')
```
出错的内容:
```python
Traceback (most recent call last):
File "C:\Users\r9000p\AppData\Local\Programs\Python\Python311\Lib\logging\config.py", line 562, in configure
handler = self.configure_handler(handlers[name])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\r9000p\AppData\Local\Programs\Python\Python311\Lib\logging\config.py", line 724, in configure_handler
klass = self.resolve(cname)
^^^^^^^^^^^^^^^^^^^
File "C:\Users\r9000p\AppData\Local\Programs\Python\Python311\Lib\logging\config.py", line 382, in resolve
name = s.split('.')
^^^^^^^
AttributeError: 'NoneType' object has no attribute 'split'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "E:\桌面\wgt python\catalogue\log\日志调用.py", line 3, in
logging.config.dictConfig(LOGGING_DIC)
File "C:\Users\r9000p\AppData\Local\Programs\Python\Python311\Lib\logging\config.py", line 812, in dictConfig
dictConfigClass(config).configure()
File "C:\Users\r9000p\AppData\Local\Programs\Python\Python311\Lib\logging\config.py", line 569, in configure
raise ValueError('Unable to configure handler '
ValueError: Unable to configure handler 'console_debug_handler'
'''
以下回答参考了GPT,请确认是否可以解决你的问题:
这个报错是由于日志配置文件中有几处小问题导致的。以下是需要修正的地方:
'class ': 'logging.StreamHandler'
和 'class ': 'logging.handlers.RotatingFileHandler'
中的空格需要去掉,修改为 'class': 'logging.StreamHandler'
和 'class': 'logging.handlers.RotatingFileHandler'
。
'encoding': 'utf - 8'
和 'encoding': 'utf - 8'
的空格也需要去掉,修改为 'encoding': 'utf-8'
。
修正后的代码如下:
LOGGING_DIC = {
'version': 1.0,
'disable_existing_loggers': True,
# 日志格式
'formatters': {
'standard': {
'format': '%(asctime)s %(threadName)s:%(thread)d [%(name)s] %(levelname)s [%(pathname)s: %(lineno)d] %(message)s',
'datefmt': ' %Y-%m-%d %H:%M:%S',
},
'simple': {
'format': ' %(asctime) s[%(name)s] % (levelname)s % (message)s',
'datefmt': ' %Y-%m-%d %H:%M:%S',
},
'test': {'format': '%(asctime)s %(message)s'},
},
'filters': {},
# 日志处理器
'handlers': {
'console_debug_handler': {
'level': 'DEBUG', # 日志处理的级别限制
'class': 'logging.StreamHandler', # 输出到终端
'formatter': 'test' # 日志格式
},
'file_info_handler': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,日志轮转
'filename': 'user.log',
'maxBytes': 1024 * 1024 * 10, # 日志大小 10M
'backupCount': 10, # 日志文件保存数量限制
'encoding': 'utf-8',
'formatter': 'standard',
},
'file_debug_handler': {
'level': 'DEBUG',
'class': 'logging.FileHandler', # 保存到文件
'filename': 'test.log', # 日志存放的路径
'encoding': 'utf-8', # 日志文件的编码
'formatter': 'test',
},
},
# 日志记录器
'loggers': {
'logger1': { # 导入时logging.getLogger时使用的app_name
'handlers': ['console_debug_handler'], # 日志分配到哪个handlers中
'level': 'DEBUG', # 日志记录的级别限制
'propagate': False, # 默认为True,向上(更高级别的logger)传递,设置为False即可,否则会一份日志向上层层传递
},
'logger2': {
'handlers': ['console_debug_handler', 'file_debug_handler'],
'level': 'INFO',
'propagate': False,
},
}
}
修复以上问题后再次运行应该就不会报错了。希望能对你有帮助!
【以下回答由 GPT 生成】
问题解决思路: 1. 检查代码中的拼写错误和语法错误。 2. 检查代码中的引号和括号是否匹配。 3. 检查日志文件是否存在,并确认该文件是否有写入权限。 4. 检查文件路径是否正确,并确认文件路径是否存在。 5. 检查文件名和文件编码是否正确。 6. 检查日志处理器的级别是否正确配置。 7. 检查日志记录器的级别是否正确配置。 8. 检查其他相关的配置项是否正确配置。
解决方法: 根据以上思路,逐一排查并解决可能的问题。
在分析代码之前,首先注意到在 handlers
字典中,class
后面的冒号后有空格,需要去除这些空格,确保与类名连在一起。 同时,在格式化字符串中使用的 %
字符需要进行转义为 %%
。
然后,检查文件名和文件路径是否正确。可以使用绝对路径或者相对路径。如果是相对路径,需要注意相对路径是相对于哪个目录。
接下来,检查日志文件的权限。使用 ls -l
命令或者 stat
命令来查看文件的权限,并使用 chmod
命令修改权限。确保当前用户对文件具有读写权限。
最后,检查依赖的库是否正确安装,确保代码中引用的模块存在,并且版本正确。
在排查问题之后,可以尝试在终端中运行代码,查看是否还存在问题。可以使用以下命令运行 Python 脚本:
python your_script.py
如果以上方法都未能解决问题,请提供更多错误信息以供准确分析问题。
代码修改后的版本:
LOGGING_DIC = {
'version': 1.0,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s %(threadName)s:%(thread)d [%(name)s] %(levelname)s [%(pathname)s: %(lineno)d] %(message)s',
'datefmt': ' %Y-%m-%d %H:%M:%S',
},
'simple': {
'format': ' %(asctime) s[%(name)s] % (levelname)s % (message)s',
'datefmt': ' %Y-%m-%d %H:%M:%S',
},
'test': {'format': '%(asctime)s %(message)s',
},
},
'filters': {},
'handlers': {
'console_debug_handler': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'test'
},
'file_info_handler': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/path/to/user.log', # 替换为正确的文件路径
'maxBytes': 1024 * 1024 * 10,
'backupCount': 10,
'encoding': 'utf-8',
'formatter': 'standard',
},
'file_debug_handler': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/path/to/test.log', # 替换为正确的文件路径
'encoding': 'utf-8',
'formatter': 'test',
},
},
'loggers': {
'mylogger': {
'handlers': ['console_debug_handler', 'file_info_handler', 'file_debug_handler'],
'level': 'DEBUG',
'propagate': False,
},
},
}
请注意将 '/path/to/user.log'
和 '/path/to/test.log'
替换为实际的文件路径。
你的代码整体没问题,就是class后面带着空格,删掉就行:
'class': 'logging.StreamHandler', # 输出到终端
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,日志轮转
'class': 'logging.FileHandler', # 保存到文件
根据error log, 可以看这里:^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\r9000p\AppData\Local\Programs\Python\Python311\Lib\logging\config.py", line 724, in configure_handler
klass = self.resolve(cname)
^^^^^^^^^^^^^^^^^^^
底层code中,会将class字段pop出去,加上空格后,没有pop出去,走到后续代码里失败了:
cname = config.pop('class')
klass = self.resolve(cname)