Python logging遇DeprecationWarning及日志文件空问题咨询
Python logging模块问题解答
1. DeprecationWarning警告问题
- 警告含义:你导入的
formatter是Python已废弃的旧模块,官方不再维护,所以抛出该警告提示你停止使用。 - 你的格式化方式没问题:你实际用到的
logging.Formatter是logging模块的标准用法,完全没有过时。 - 解决方法:直接删掉代码第一行的
import formatter,这个导入完全多余,你根本没用到该模块的内容。
2. 日志文件为空的问题
- 核心原因:你创建了
file_logging文件处理器,但没有将它添加到logger实例中,只添加了控制台处理器console_logging,导致日志只会输出到控制台,不会写入文件。 - 解决方法:在
logger.addHandler(console_logging)后面添加一行:logger.addHandler(file_logging) - 额外提示:代码里还有几处逻辑小问题,比如
user_name函数的循环逻辑不完整,user_password里的日志内容写错(把Pin写成了Username),这些可以顺手修正。
修正后的完整代码
import logging, sys logger = logging.getLogger(__name__) console_logging = logging.StreamHandler(sys.stdout) # 日志输出到控制台 file_logging = logging.FileHandler('log_to_file.log') # 日志写入文件 formatter = logging.Formatter('%(asctime)s - %(message)s - %(levelname)s') # 定义日志格式 console_logging.setFormatter(formatter) file_logging.setFormatter(formatter) # 同时添加控制台和文件处理器 logger.addHandler(console_logging) logger.addHandler(file_logging) logger.setLevel(logging.INFO) # 设置日志级别为INFO及以上 def user_name(): while True: name = input("\nEnter your username: ") valid = True for letter in name: if letter not in 'abcdefghijklmnopqrstuvwxyz': logger.error('Username has to contain only letters') valid = False break if valid: logger.info(f'Username Entered: {name}') break name = input('\nTry again: ') def user_password(): while True: try: password = int(input("\nEnter account pin: ")) while password != 1234: logger.error("Invalid pin.") password = int(input("\nTry again: ")) logger.info(f'Pin Entered: {password}') break except ValueError: logger.error("Pin must be a number.") user_name() user_password()
内容的提问来源于stack exchange,提问作者gginchev
相关产品推荐
相关产品推荐

