Python logging只写入到文件,不显示在控制台

本文深入讲解Python的logging模块,包括其核心组件Logger、Handler、Formatter和Filter的功能与使用方法。探讨了不同日志级别的设定及如何自定义日志输出,同时提供了一个日志管理类的实现,帮助开发者有效管理和配置日志。
摘要由CSDN通过智能技术生成

关于logging模块的详细使用,可以参考博客python logging 替代print 输出内容到控制台和重定向到文件

logging中有几个模块:Logger,Handler,Formatter,Filter

Logger       对象提供应用程序可直接使用的接口,
Handler      发送日志到适当的目的地,
Filter          提供了过滤日志信息的方法,
Formatter   指定日志显示格式。

其中Logger比较不好理解

Logger是一个树形层级结构,输出信息之前都要获得一个Logger(如果没有显示的获取则自动创建并使用root Logger

logger = logging.getLogger()    返回一个默认的Logger也即root Logger,并应用默认的日志级别、Handler和Formatter设置
当然也可以通过Logger.setLevel(lel)指定最低的日志级别,可用的日志级别有:
logging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、logging.CRITICAL。
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()
输出不同级别的日志,只有日志等级大于或等于设置的日志级别的日志才会被输出。

通过logger = logging.getLogger()显示的创建了root Logger,
而logger1 = logging.getLogger('mylogger')创建了root Logger的孩子

logger3 = logging.getLogger('mylogger.child1')创建了(root.)mylogger.child1
logger4 = logging.getLogger('mylogger.child1.child2')创建了(root.)mylogger.child1.child2
logger5 = logging.getLogger('mylogger.child1.child2.child3')创建了(root.)mylogger.child1.child2.child3
而孩子,孙子,重孙……既会将消息分发给他的handler进行处理也会传递给所有的祖先Logger处理

所以有时候log会显示多次。

而使用默认的logger即root Logger,如上所说会有默认的handler,formatter设置

所以关键就在于你要使用新的logger,自己进行配置。默认的logger会一直将日志输出到控制台

self.logger = logging.getLogger("mylogger"),获取自己的logger

#!usr/bin/python
# -*- coding: utf-8 -*-
import logging
import time
import sys
import os

'''
日志logger类
'''

# 创建logs文件夹
cur_path = os.path.dirname(os.path.realpath(__file__))
log_path = os.path.join(cur_path, 'logs')
# 如果不存在这个logs文件夹,就自动创建一个
if not os.path.exists(log_path): os.mkdir(log_path)


class Log(object):
    def __init__(self):
        # 文件的命名
        self.logname = os.path.join(log_path, '%s.log' % time.strftime('%Y_%m_%d'))
        logging.basicConfig()
        self.logger = logging.getLogger("mylogger")
        self.logger.setLevel(logging.INFO)
        self.logger.propagate = False
        # 日志输出格式
        self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s] - %(levelname)s: %(message)s')

    def __console(self, level, message):
        # 创建一个FileHandler,用于写到本地
        fh = logging.FileHandler(self.logname, 'a', encoding='utf-8')  # 这个是python3的
        fh.setLevel(logging.INFO)
        fh.setFormatter(self.formatter)
        self.logger.addHandler(fh)

        # 创建一个StreamHandler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.ERROR)
        ch.setFormatter(self.formatter)
        self.logger.addHandler(ch)

        if level == 'info':
            self.logger.info(message)
        elif level == 'debug':
            self.logger.debug(message)
        elif level == 'warning':
            self.logger.warning(message)
        elif level == 'error':
            self.logger.error(message)
        # 这两行代码是为了避免日志输出重复问题
        self.logger.removeHandler(ch)
        self.logger.removeHandler(fh)
        # 关闭打开的文件
        fh.close()

    def debug(self, message):
        self.__console('debug', message)

    def info(self, message):
        self.__console('info', message)

    def warning(self, message):
        self.__console('warning', message)

    def error(self, message):
        self.__console('error', message)


log = Log()

if __name__ == '__main__':
    pass

 

 

 

 

### 回答1: Python提供了输出重定向的功能,可将控制台输出保存到文件中。 在Python中,使用sys库的stdout属性可以重定向输出。通过将stdout属性设置为一个文件对象,程序的所有输出都将被输出文件中。 举个例子,以下是将print语句的输出保存到文件中的代码: ```python import sys # Open a file for writing with open("output.txt", "w") as f: # Redirect stdout to the file sys.stdout = f # Print something print("Hello world!") # Reset stdout to the console sys.stdout = sys.__stdout__ ``` 在这个例子中,我们打开了一个名为“output.txt”的文件以便写入,然后重定向了stdout属性以将输出写入文件。我们打印了一个简单的“Hello world!”的消息,然后将stdout重置为控制台。 当代码运行后,输出将被写入到名为“output.txt”的文件中。 需要注意的是,如果同时使用了print和其他输出函数,例如logging或matplotlib,那么还需要重定向它们的输出。可以使用sys库的stderr属性来处理这种情况。 ```python import sys # Open a file for writing with open("output.txt", "w") as f: # Redirect stdout and stderr to the file sys.stdout = f sys.stderr = f # Print something print("Hello world!") # Reset stdout and stderr to the console sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ ``` 在这个例子中,我们将stderr属性设置为与stdout相同的文件,以便将所有输出写入同一个文件中,并在程序结束后重置stdout和stderr。 ### 回答2: Python 是一款多用途的脚本语言,广泛用于数据分析,网络编程,机器学习等领域。其中,在数据处理方面它特别出色。在实际开发中,我们常常需要将程序运行结果保存到文件中,方便我们查看和分析。本文将介绍如何将控制台输出保存到文件中。 在 Python 中,我们可以使用 sys 模块来实现将控制台输出保存到文件中的功能。sys 模块是 Python 的一个内置模块,可以提供对 Python 解释器进行访问和控制。 具体实现方法如下: 1. 首先,我们需要引入 sys 模块。 ```python import sys ``` 2. 接着定义一个文件对象 file,并将标准输出 sys.stdout 重定向到该文件对象中。 ```python file = open('output.txt', 'w') sys.stdout = file ``` 其中,'output.txt' 为文件名,'w' 表示以写入模式打开文件。 3. 此时,所有通过 print() 打印出来的内容都会被输出文件中。 ```python print("Hello World") print("Python is great") ``` 4. 最后,我们需要将标准输出重定向回控制台,否则后续 print() 函数的调用仍然会将结果输出文件中。 ```python sys.stdout = sys.__stdout__ # 将标准输出重定向回控制台 file.close() # 关闭文件 ``` 以上就是将控制台输出保存到文件中的完整步骤。通过这种方法,我们可以将 Python 程序输出的结果保存到文件中,方便我们查看和分析。 ### 回答3: 有时候我们需要在程序运行结束后查看运行过程中的控制台输出。将控制台输出保存到文件是一种常见的方式。 Python提供了将控制台输出保存到文件的方法,可以使用标准库中的sys模块以及文件读写模块进行实现。具体步骤如下: 1. 引入sys模块 首先要导入sys模块,因为在sys模块中有一个stdout属性,可以用于重定向标准输出。 ``` import sys ``` 2. 打开文件 接下来需要打开一个文件,用于保存控制台输出。 ``` output_file = open('output.txt', 'w') ``` 其中,'output.txt'为文件名,'w'表示以写入方式打开文件,如果文件不存在则创建,如果文件存在则覆盖原有内容。 3. 重定向标准输出 接下来需要将标准输出重定向至文件。 ``` sys.stdout = output_file ``` 4. 将控制台输出保存至文件 接下来就可以运行程序,所有标准输出都会被重定向至文件。程序运行结束后,需要将sys.stdout重新指向控制台输出。 ``` #运行程序 print('Hello, World!') #将sys.stdout重新指向控制台输出 sys.stdout = sys.__stdout__ ``` 5. 关闭文件 最后要记得关闭文件。 ``` output_file.close() ``` 将控制台输出保存到文件是一种非常实用的技巧,在程序调试和输出结果查看方面都具备一定的帮助作用。掌握这种方法能为你的Python开发带来很大的便利。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值