<jupyter_start><jupyter_text>日志记录{mod}`logging` 模块提供功能齐全且灵活的日志记录系统。在最简单的情况下，日志消息被发送到文件或 `sys.stderr`<jupyter_code>import logging
# 示例
logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')<jupyter_output>WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down<jupyter_text>默认情况下，informational 和 debugging 消息被压制，输出会发送到标准错误流。其他输出选项包括将消息转发到电子邮件，数据报，套接字或 HTTP 服务器。新的过滤器可以根据消息优先级选择不同的路由方式：`DEBUG`，`INFO`，`WARNING`，`ERROR` 和 `CRITICAL`。`level` 指定了日志的级别，这样，便可以显示 `DEBUG` 信息：<jupyter_code>import logging
logging.basicConfig(encoding='utf-8', # Python3.9 新加的
                    level=logging.DEBUG)

logging.debug('Debugging information')<jupyter_output>DEBUG:root:Debugging information<jupyter_text>日志系统可以直接从 Python 配置，也可以从用户配置文件加载，以便自定义日志记录而无需更改应用程序。可以将日志写入文件：<jupyter_code>import logging
logging.basicConfig(filename='example.log',
                    encoding='utf-8', # Python3.9 新加的
                    level=logging.DEBUG)<jupyter_output><empty_output><jupyter_text>对 {func}`~logging.basicConfig` 的调用应该在 {func}`~logging.debug` ， {func}`~logging.info` 等的前面。因为它被设计为一次性的配置，只有第一次调用会进行操作，随后的调用不会产生有效操作。如果多次运行 {func}`~logging.basicConfig` 脚本，则连续运行的消息将追加到文件 `example.log`。 如果你希望每次运行重新开始，而不是记住先前运行的消息，则可以通过将上例中的调用更改为来指定 `filemode` 参数：<jupyter_code>import logging
logging.basicConfig(filename='example.log',
                    filemode='w',
                    level=logging.DEBUG)<jupyter_output><empty_output><jupyter_text>输出将与之前相同，但不再追加进日志文件，因此早期运行的消息将丢失。 常用设置 更改显示消息的格式要更改用于显示消息的格式，你需要指定要使用的格式：<jupyter_code>import logging

logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')<jupyter_output>DEBUG:This message should appear on the console
INFO:So should this
WARNING:And this, too<jupyter_text>在消息中显示日期/时间要显示事件的日期和时间，你可以在格式字符串中放置 `'%(asctime)s'`：<jupyter_code>import logging

logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')<jupyter_output>2022-04-29 15:22:16,950 is when this event was logged.<jupyter_text>控制日期/时间的格式，请为 {func}`~logging.basicConfig` 提供 `datefmt` 参数，如下例所示：<jupyter_code>import logging

logging.basicConfig(format='%(asctime)s %(message)s',
                    datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')<jupyter_output>04/29/2022 03:23:58 PM is when this event was logged.
{'fraction_non_alphanumeric': 0.13001124016485574, 'fraction_numerical': 0.013862869988759834, 'mean_word_length': 7.2153846153846155, 'pattern_counts': {'":': 0, '<': 24, '<?xml version=': 0, '>': 24, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '66827', 'license': 'Apache-2.0', 'n_tokens_mistral': 1223, 'n_tokens_neox': 1279, 'n_words': 143, 'path': 'doc/python-study/basic/logging.ipynb', 'repo_name': 'xinetzone/d2py', 'size': '2669'}