python logging 写入本地文件

import logging
hander = logging.FileHandler('app.log', encoding='UTF-8')
logging_format = logging.Formatter('%(asctime)s - %(levelname)s -'
                                   ' %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
hander.setFormatter(logging_format)
app.logger.addHandler(hander)
app.logger.info("上传文件")

显示结果:
2018-09-21 19:58:35,130 - INFO - app.py - upload_file - 51 - 上传文件
2018-09-21 19:58:35,134 - INFO - app.py - upload_file - 80 - 上传失败
2018-09-21 20:00:35,436 - INFO - app.py - upload_file - 51 - 上传文件
2018-09-21 20:00:35,438 - INFO - app.py - upload_file - 75 - 上传成功
日志级别

日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL。
DEBUG:详细的信息,通常只出现在诊断问题上
INFO:确认一切按预期运行
WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)。这个软件还能按预期工作。
ERROR:更严重的问题,软件没能执行一些功能
CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行
这5个等级,也分别对应5种打日志的方法: debug 、info 、warning 、error 、critical。默认的是WARNING,当在WARNING或之上时才被跟踪。
日志格式说明

logging.basicConfig函数中,可以指定日志的输出格式format,这个参数可以输出很多有用的信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
我在工作中给的常用格式在前面已经看到了。就是:
format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
这个格式可以输出日志的打印时间,是哪个模块输出的,输出的日志级别是什么,以及输入的日志

 

<think>嗯,用户问的是如何在Python中使用logging模块将日志写入指定的文件路径。我需要先回忆一下logging模块的基本用法,特别是关于文件处理的部分。 首先,我记得logging模块有几个主要的组件,比如Logger、Handler、Formatter。用户需要的是将日志输出到文件,所以应该使用FileHandler。但需要确认是否需要指定路径,比如如果用户给的路径不存在,是否需要自动创建目录,或者应该提醒用户先确保目录存在。 然后,可能需要一个基本的示例代码。例如,先导入logging模块,然后创建一个logger实例,设置日志级别。接着创建FileHandler,指定文件路径,设置处理器的日志级别,再定义日志格式,最后将处理器添加到logger中。这样用户就可以通过logger记录日志到指定文件了。 不过,有可能用户会遇到路径问题,比如权限不足,或者目录不存在导致文件无法创建。这时候是否需要提醒用户处理异常,或者在代码中自动创建目录?比如使用os.makedirs来创建目录结构,但需要先检查是否存在,避免重复创建。 另外,用户可能想知道如何同时输出到控制台和文件,这时候可以添加StreamHandler。不过用户的问题明确是写入文件,所以可能不需要这部分,但作为扩展内容可能有帮助。 还有日志的轮转问题,比如使用RotatingFileHandler或TimedRotatingFileHandler,但用户的问题可能只是基础的文件写入,所以先介绍基本的FileHandler,再提到更高级的处理器作为补充。 需要确保代码示例正确,比如logger的命名,避免使用root logger,而是使用getLogger(__name__)这样的方式。设置logger的propagate属性可能会影响日志的传递,但基础示例可能不需要涉及这些。 还有,设置日志级别的时候,处理器的级别和logger的级别需要匹配,否则可能不会记录预期的日志。例如,logger设置为DEBUG,但handler设置为INFO,那么DEBUG级别的日志不会被处理。 最后,提醒用户测试代码,检查文件是否生成,是否有写入权限,以及日志内容是否正确。可能还需要提到多进程下的日志处理,但可能超出当前问题的范围,暂时不需要涉及。 总结步骤应该是:导入模块,创建logger,创建FileHandler并指定路径,设置格式,添加处理器,然后记录日志。示例代码要简洁,注释清楚,并说明可能出现的问题,如路径不存在需要手动创建或捕获异常。</think>在 Python 中使用 `logging` 模块将日志写入指定文件路径的步骤如下: --- ### 1. 基础配置示例 ```python import logging # 创建 Logger 实例 logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 设置最低日志级别 # 创建 FileHandler 并指定文件路径 file_handler = logging.FileHandler('/指定路径/your_log.log') # 替换为实际路径 file_handler.setLevel(logging.DEBUG) # 设置处理器日志级别 # 定义日志格式 formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) file_handler.setFormatter(formatter) # 将 Handler 添加到 Logger logger.addHandler(file_handler) # 测试日志输出 logger.debug('这是一条调试信息') logger.info('这是一条普通信息') logger.warning('这是一条警告信息') ``` --- ### 2. 关键参数说明 - **`FileHandler` 路径** 📁 使用绝对路径 (如 `/home/user/logs/app.log`),或确保相对路径正确 ❗ 如果目录不存在会报错,建议先创建目录: ```python import os os.makedirs('/指定目录', exist_ok=True) # 自动创建目录 ``` - **日志级别匹配** ✅ Logger 的级别 ≥ Handler 的级别才会记录 (例如 Logger 设为 `INFO`,Handler 设为 `DEBUG` 时,Handler 只处理 `INFO` 及以上级别) --- ### 3. 高级用法扩展 #### (1) 同时输出到控制台和文件 ```python # 添加 StreamHandler console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) console_handler.setFormatter(formatter) logger.addHandler(console_handler) ``` #### (2) 自动分割日志文件 ```python from logging.handlers import RotatingFileHandler # 每个文件最大 5MB,保留 3 个备份 rotating_handler = RotatingFileHandler( 'app.log', maxBytes=5*1024*1024, backupCount=3 ) logger.addHandler(rotating_handler) ``` --- ### 4. 常见问题排查 - **权限问题** 🔒 检查程序是否有目标文件的写入权限 - **日志未生成** 🔍 检查路径是否正确,确认 `logger.addHandler()` 已调用 - **日志内容缺失** ✅ 确保 Logger 和 Handler 的日志级别设置合理 --- 通过以上配置,您可以将日志准确写入指定路径。建议根据实际需求调整日志格式和处理器类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值