python将日志同时输出到控制台(屏幕)与文件

Python日志记录技巧
本文介绍了在Python中使用logging模块和自定义print函数记录日志的两种方法,包括设置日志等级、输出到控制台和文件,适用于长时间运行任务的日志管理和监控。

当使用python训练模型或者做其他比较耗时又需要时刻观察变量的任务时, 通常会在屏幕上print一些信息. 然而当信息很多的时候, 或者电脑死机了, 一种比较好的方式就是把日志保存到本地.


1.使用logging模块
logging有不同的日志等级, 参考

日志等级(level)描述
DEBUG最详细的日志信息,典型应用场景是 问题诊断
INFO信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL当发生严重错误,导致应用程序不能继续运行时记录的信息

示例代码:

import datetime
import logging
# 输出到console
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG) # 指定被处理的信息级别为最低级DEBUG,低于level级别的信息将被忽略
# 输出到file
fh = logging.FileHandler("log_%s.txt"%(datetime.datetime.now().strftime('%Y%m%d-%H-%M-%S')), mode='w', encoding='utf-8')  # 不拆分日志文件,a指追加模式,w为覆盖模式
fh.setLevel(logging.DEBUG)
        
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(ch)
logger.addHandler(fh)


for i in range(10):
    logger.debug(i)



2.使用两个print
示例代码:

import datetime

# 自定义print函数, 先输出到console, 再输出到日志文件
def cprint(s, end='\n', log_file=None):
    print(s, end=end)
    if log_file is not None:
        print(s, end=end, file=log_file)


    
log_file = open("log_%s.txt"%(datetime.datetime.now().strftime('%Y%m%d-%H-%M-%S')), 'w')
for i in range(10):
    cprint(i, end='-', log_file=log_file)
cprint('', end='\n', log_file=log_file) # 另起一行
for i in range(10):
    cprint(i, end='-', log_file=log_file)
if log_file is not None:
    log_file.close()



 

<think> 我们正在处理用户关于Python logging模块的问题。用户希望了解如何同时日志输出文件控制台。 根据引用[1]引用[2],我们知道可以使用logging模块来实现这个功能。具体来说,我们需要配置logger,添加两个handler:一个用于控制台(StreamHandler),一个用于文件(FileHandler)。 步骤: 1. 导入logging模块。 2. 创建一个logger对象。 3. 设置logger的日志级别(例如DEBUG)。 4. 创建控制台处理器(StreamHandler),设置其日志级别格式。 5. 创建文件处理器(FileHandler),设置其日志级别格式。 6. 将两个处理器添加到logger中。 7. 使用logger记录日志。 注意:格式化字符串可以使用引用[2]中提供的各种属性,例如%(asctime)s、%(levelname)s等。 下面我们将给出具体的代码实现,并解释每一步。 </think>### 使用 Python logging 模块实现日志输出文件控制台 以下是完整的实现方法,通过配置 logging 模块同时输出日志控制台文件: ```python import logging import sys def setup_logging(log_file='app.log'): # 创建 Logger 对象 logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 设置最低日志级别 # 创建格式化器 formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 创建文件处理器 (输出文件) file_handler = logging.FileHandler(log_file) file_handler.setLevel(logging.DEBUG) # 文件记录所有级别日志 file_handler.setFormatter(formatter) # 创建控制台处理器 (输出屏幕) console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) # 控制台仅显示INFO及以上级别 console_handler.setFormatter(formatter) # 添加处理器到Logger logger.addHandler(file_handler) logger.addHandler(console_handler) return logger # 初始化日志记录器 logger = setup_logging('application.log') # 使用示例 logger.debug('调试信息 - 仅写入文件') logger.info('普通信息 - 输出控制台文件') logger.warning('警告信息') logger.error('错误信息') logger.critical('严重错误信息') ``` ### 关键配置说明: 1. **日志级别控制**: - `DEBUG`:最详细的日志信息(通常仅用于开发) - `INFO`:确认程序按预期运行 - `WARNING`:潜在问题提示 - `ERROR`:严重问题(部分功能失效) - `CRITICAL`:致命错误(程序可能崩溃) 2. **输出位置控制**: - `FileHandler`:日志写入指定文件(示例中为 application.log) - `StreamHandler`:日志输出控制台(stdout) 3. **格式化符号说明**: - `%(asctime)s`:日志时间 - `%(name)s`:Logger名称 - `%(levelname)s`:日志级别名称 - `%(message)s`:日志内容 - 其他可用符号:`%(filename)s`(文件名)、`%(lineno)d`(行号)、`%(funcName)s`(函数名)等[^2] ### 使用注意事项: 1. **避免重复日志**: ```python # 在程序入口处调用一次即可 logger = setup_logging() ``` 2. **模块化使用**: ```python # 在其他模块中获取Logger import logging logger = logging.getLogger(__name__) logger.info('跨模块日志') ``` 3. **日志轮转(高级)**: 使用 `RotatingFileHandler` 可自动分割日志文件: ```python from logging.handlers import RotatingFileHandler # 替换FileHandler为以下代码 file_handler = RotatingFileHandler( 'app.log', maxBytes=5*1024*1024, backupCount=3 ) ``` 此配置会同时记录日志文件控制台,不同处理器可设置不同的日志级别,文件保留所有调试信息,控制台只显示重要信息[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值