关于#Python#的问题,日志出错如何解决?

在调用日志文件时出现报错
这个是日志代码

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,请确认是否可以解决你的问题:
这个报错是由于日志配置文件中有几处小问题导致的。以下是需要修正的地方:

  1. 'class ': 'logging.StreamHandler''class ': 'logging.handlers.RotatingFileHandler' 中的空格需要去掉,修改为 'class': 'logging.StreamHandler''class': 'logging.handlers.RotatingFileHandler'

  2. '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)