Python 日志向控制台和文件输出

本文介绍了如何使用Python的logging模块创建logger实例,设置日志级别,使用不同类型的handler(如StreamHandler、FileHandler、RotatingFileHandler)将日志输出到控制台和文件,并通过Formatter定制日志格式。示例代码展示了如何实现这一过程。

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

python中有日志记录模块logging,具体可能考官方API Logging

1.创建logger实例

logging模块是依靠调用Logger类的方法来实现的,Logger并不直接创建实例,而是通过调用logging.getLogger([name])创建logger实例,

每个实例都有自己的名字.

logger = logging.getLogger("mylogger")

如果没有指定name,返回root logger.name和logger实例是一一对应的,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例.

    2.日志的级别

 logging模块通过事件的严重程度提供6种不同级别的日志记录,提示日志的重要程度.

   Level     数值

              CRITICAL                      50

     ERROR                         40

              WARNING                     30

               INFO                             20

               DEBUG                         10

               NOTSET                        0

模块默认设置的级别是WARNING 即当且仅当等于或高于WARNING的事件会被记录下来,

更改logger的默认level

logger.setLevel("INFO")  //此时小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出.

例如:

logger.debug("this is debug message")    # 不输出  
logger.info("this is info message")        # 输出 
logger.warning("this is warning message")  # 输出 


3.创建一个handle对象,并为handler设置 level

通过handler对象可以将日志记录(log record)写到不同的地方(destination),比如文件,socket, 控制台.

python提供了十几种实用handler,比较常用有:

StreamHandler: 输出到控制台

FileHandler:   输出到文件

BaseRotatingHandler 可以按时间写入到不同的日志中。比如将日志按天写入不同的日期结尾的文件文件。
SocketHandler 用TCP网络连接写LOG
DatagramHandler 用UDP网络连接写LOG
SMTPHandler 把LOG写成EMAIL邮寄出去

RotatingFileHandler  指定了单个log文件的size的最大值和log文件的数量的最大值,

如果文件大于最大值,将分割为多个文件,如果log文件的数量多于最多个数,最老的log文件将被删除

fh = logging.FileHandler(logName) //logName是在某个路径下的log文件名mylogger
fh.setLevel(logLevel)   //logLevel是传入的日志级别参数.

ch = logging.StreamHandler()

rh = logging.RotatingFileHandler(logName,maxBytes=  ,backupCount= )


4.formatter对象,定义handler 格式化输出

formatter对象 可以指定日志记录的时间格式、进程号、文件名、函数名等信息.

几种常用格式:

%(asctime)s  //默认的日期格式精确到微秒,例如‘2016-03-16 8:20:34,896'

%(name)s   //logName mylogger

%(levelname)s  // logLevel 

%(message)s  //日志信息logger.debug("this is debug message")   this is debug message

%(filename)s //log.py

%(lineno)d  //源文件中log日志被调用的行号,logger.info("this is info message") 
log_format=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s-[%(filename)s:%(lineno)d]")

为创建的handler对象添加输出格式

fh.setFormatter(log_format)


5.为logger实例添加handler对象

每个logger可以拥有多个handler,通过addHandler()添加

logger.addHandler(fh)


6.调用logger实例对应级别的目志消息输出函数:

logger.debug("debug message")     
logger.info(" info message")      
logger.warning("warning message") 
logger.critical("critical message")

logger.error("error message")


代码如下:

#coding=utf-8
import loggingimport logging.handlers
logDir=r"D:\logs"
 def getLog():
   #创建一个logger实例
   logger = logging.getLogger("mylogger")
   llogger.setLevel("DEBUG") #设置级别为DEBUG,覆盖掉默认级别WARNING
 #创建一个handler,用于写入日志文件,handler可以把日志内容写到不同的地方
   logName = logDir + r"\\" + "test.log"
   fh = logging.FileHandler(logName)
   fh.setLevel("WARNING")
 #再创建一个handler,用于输出控制台
   ch = logging.StreamHandler()
   ch.setLevel("ERROR") 
#定义handler的格式输出
   log_format=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s-[%(filename)s:%(lineno)d]") 
   fh.setFormatter(log_format) #setFormatter() selects a Formatter object for this handler to use
   ch.setFormatter(log_format) 
 #为logger添加handler
   logger.addHandler(fh) 
   logger.addHandler(ch)
   
   logger.debug("debug message")
   logger.info("info message") 
   logger.warning("warning message")  
   logger.error("error message")   
   logger.critical("critical message")

 if __name__ = "__main__":
     getLog()

控制台输出: 
2016-03-17 15:02:44,065-mylogger-ERROR-error message-[log.py:26]
2016-03-17 15:02:44,065-mylogger-CRITICAL-critical message-[log.py:27]
test.log文件输出:
2016-03-17 15:02:44,065-mylogger-WARNING-warning message-[log.py:25]
2016-03-17 15:02:44,065-mylogger-ERROR-error message-[log.py:26]
2016-03-17 15:02:44,065-mylogger-CRITICAL-critical message-[log.py:27]

也可以封装成一个类调用

#coding=utf-8
class Logger():
    def __init__(self, lognName, logLevel, logger):

        # 创建一个logger
        self.logger = logging.getLogger(logger)
        self.logger.setLevel(logging.DEBUG)

        # 创建一个handler,用于写入日志文件
        fh = logging.FileHandler(logName)
        fh.setLevel(logLevel)

        # 再创建一个handler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logLevel)

        # 定义handler的输出格式    
        log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s

        -[%(filename)s:%(lineno)d]')
        fh.setFormatter(log_format)
        ch.setFormatter(log_format)

        # 给logger添加handler
        self.logger.addHandler(fh)
        self.logger.addHandler(ch)
   
    def getlog(self):
        return self.logger


 
在另一个test.py文件中调用
from log import Logger
logger = Logger(logname='log.txt', loglevel="INFO", logger="test.py").getlog()

另:logging.basicConfig函数

basicConfig()是为root logger 创建一个句柄(StreamHandler),当未给root logger 创建一个句柄时,logging的debug() info() warning() error()和critical()函数会自动调用系统默认的basicConfig()函数

#coding=utf-8
import logging
LOG_FILENAME="D:\test\log.txt"
logging.basicConfig(logName=LOG_FILENAME,level=logging.INFO,format = '%(asctime)s - %(levelname)s: %(message)s')
logging.info("info message")

LOG_FILENAME="D:\test\log2.txt"
<pre name="code" class="python">logging.basicConfig(logName=LOG_FILENAME,level=logging.WARNING,format = '%(asctime)s - %(levelname)s: %(message)s')
logging.error("error message")

 

注:error message不会记录到D:\test\log2.txt,会全部记录到log.txt文件下

因为logger已经有一个句柄了,basicConfig不会创造一个新的句柄了,所以日志信息会输出到第一个日志文件下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值