python中的logging模块——将日志保存到文件中

本文介绍了Python的logging模块,用于程序运行状态的查看和分析。通过创建logger、handler及formatter,实现日志输出到控制台和文件。示例代码展示了如何配置logging模块,包括设置日志级别、定义输出格式以及使用FileHandler和StreamHandler。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python中的logging模块可以轻松实现日志的打印和输出,方便对程序运行状态的查看和分析,logging模块使用的一般步骤如下:

#导入logging模块
import logging

# 创建一个loggger,并设置日志级别
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# 创建一个handler,用于将日志输出到控制台,并设置日志级别
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

# 定义handler的输出格式
formatter = logging.Formatter(
    '%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]''-%(levelname)s-[日志信息]: %(message)s')
ch.setFormatter(formatter)

# 给logger添加handler
logger.addHandler(ch)

使用实例:

#导入logging模块
import logging

def logger(file_log):
    '''
    打日志
    :param file_log: 日志文件名,类型string;
    '''
    # 创建一个loggger,并设置日志级别
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    
    # 创建一个handler,用于写入日志文件,并设置日志级别,mode:a是追加写模式,w是覆盖写模式
    fh = logging.FileHandler(filename=file_log, encoding='utf-8', mode='w')
    fh.setLevel(logging.INFO)
    
    # 创建一个handler,用于将日志输出到控制台,并设置日志级别
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
    
    # 定义handler的输出格式
    formatter = logging.Formatter(
        '%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]''-%(levelname)s-[日志信息]: %(message)s')
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    # 给logger添加handler
    logger.addHandler(fh)
    logger.addHandler(ch)

    return logger

if __name__=='__main__':
	test_path = 'test'
	logger = logger('./{}.log'.format(test_path))
	logger.info("----------------日志输出----------------\n")

说明:logging的日志级别一般有‘DEBUG’,‘INFO’,‘WARNING’,‘ERROR’, 'CRITICAL’几种,级别依次从低到高,DEBUG显示的信息最为详细,ERROR则只显示报错信息,上面代码中logging.getLogger()的优先级最高,logging.FileHandler(), logging.StreamHandler()的优先级次之。

### Python Logging 模块配置日志输出到指定文件 要将日志记录到指定文件,可以使用 `logging` 模块中的 `FileHandler` 或者通过 `basicConfig` 函数进行简单配置。以下是详细的说明以及代码示例。 #### 使用 basicConfig 配置日志输出到文件 `logging.basicConfig()` 是一种快速配置方式,适用于简单的场景。它允许直接指定日志级别、格式化器和目标文件路径[^1]。 ```python import logging # 配置日志基本参数 logging.basicConfig( filename='app.log', # 日志文件名 filemode='w', # 文件模式 'a' 表示追加, 'w' 表示覆盖写入 level=logging.DEBUG, # 设置最低的日志等级为 DEBUG format='%(asctime)s - %(levelname)s - %(message)s' # 定义日志格式 ) # 测试不同级别的日志消息 logging.debug('这是一个调试信息') logging.info('这是普通的信息') logging.warning('这是一个警告信息') logging.error('这是一个错误信息') logging.critical('这是一个严重问题') ``` 上述代码会将所有的日志消息按照定义的格式写入名为 `app.log` 的文件中,并且每次运行程序都会重新创建该文件(`filemode='w'`)。如果希望保留之前的日志并继续追加新日志,则应改为 `filemode='a'`。 #### 手动添加 FileHandler 和 Formatter 对于更复杂的场景,比如需要多个处理器或将相同的消息发送给不同的目的地,推荐手动实例化 Logger 对象及其组件: ```python import logging # 创建 logger 实例 logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # 创建一个用于处理文件输出的 handler 并设置其日志等级 fh = logging.FileHandler('detailed_app.log') fh.setLevel(logging.INFO) # 创建 formatter 来规定日志条目的布局形式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 将 formatter 添加至 fh 中 fh.setFormatter(formatter) # 把 fh 加入到 logger 当前管理的手柄列表里 logger.addHandler(fh) # 记录一些日志事件 logger.debug('Debug Message') logger.info('Info Message') logger.warning('Warning Message') logger.error('Error Message') logger.critical('Critical Message') ``` 在这个例子中,我们先创建了一个自定义名称的空间 (`my_logger`) ,接着设置了它的整体日志阈值为DEBUG级。之后又单独针对文件处理器设定了更高的门槛——INFO及以上才会被真正写入磁盘上的文档。最后还定制了一套时间戳加上其他元数据的形式作为每一条记录的标准样式。 #### 同时输出到控制台与文件 有时可能既想把日志存档下来也希望能实时查看它们的内容,在这种情况下就需要同时注册两个 Handler —— ConsoleHandler 和 FileHandler: ```python import sys import logging # 初始化一个新的Logger对象 logger = logging.getLogger() logger.setLevel(logging.DEBUG) # 建立第一个handler负责打印到屏幕(stdout) ch = logging.StreamHandler(sys.stdout) ch.setLevel(logging.WARNING) # 构建第二个handler专门用来存储进硬盘里的txt档案当中去 fh = logging.FileHandler('/path/to/your/log.txt') fh.setLevel(logging.ERROR) # 设定统一的日志展示模板 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') ch.setFormatter(formatter) fh.setFormatter(formatter) # 绑定两者都成为当前这个logger的一部分成员变量之一 logger.addHandler(ch) logger.addHandler(fh) # 发布几类不同程度的通知供观察效果差异之处在哪里? logger.debug("This is a debug message.") logger.info("This is an info message.") logger.warn("This is a warning message.") logger.error("This is an error message.") logger.fatal("And finally this fatal one too!") ``` 这里值得注意的是,虽然我们将 ch (console handler) 的 loglevel 调整成了 WARNING 只有当遇到同等或者更加严重的状况下才会有东西显示出来;而另一方面则保持了较低的要求让所有类型的提示都能顺利进入我们的持久性储存介质之中[^2]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值