50.python之日志 logging模块

日志

  • 用来记录程序行为
  • 可以记录一些重要信息,比如哪里报错,以及报错原因等

日志等级(由低到高):

  • debug:在开发时查看一些输出信息是否正确,可以替代print函数
  • info:消息类信息,记录一些程序的行为
  • warnning:警告,提示程序可能存在的潜在风险
  • error:业务中出现错误,比如异常
  • critical:比error更高级别的错误

logging模块的使用

使用logging.basicConfig配置基本设置

参数:

  • level:日志记录的最低等级,比如level=logging.DEBUG,因为debug是最低等级的日志,这里就表示记录所有等级的日志;若是level=logging.ERROR则表示记录error和critical等级的日志,低于error等级的不会记录
  • format:日志输出格式
  • filename:日志文件的地址,比如:filename=‘d://1.log’
  • filemode:日志文件的模式,w或a

format格式:
在这里插入图片描述

初始化 logger = logging.getLogger(“myloger”),getLogger()方法后面最好加上所要日志记录的模块名字,后面的日志格式中的%(name)s 对应的是这里的模块名字

常用格式:日志时间,日志文件名称,日志行数、日志级别名称,日志具体信息

format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'

1.日志打印到控制台

# coding:utf-8

import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s %(name)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'
)
logger = logging.getLogger('mylog')

# 打印最低等级是info,所以debug的不会打印
logger.info('这是一个info')
logger.debug('这是一个debug')
logger.warning('这是一个warnning')
logger.error('这是一个error')
logger.critical('这是一个critical')

结果:
在这里插入图片描述

2.日志保存到文件中

# coding:utf-8

import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s %(name)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    filename='my.log',
    filemode='a'
)
logger = logging.getLogger('mylog')

# 打印最低等级是info,所以debug的不会打印
logger.info('这是一个info')
logger.debug('这是一个debug')
logger.warning('这是一个warnning')
logger.error('这是一个error')
logger.critical('这是一个critical')

查看文件,结果:
在这里插入图片描述

3.打印在控制台并写入文件中

日志添加方式:
logging有一个日志处理的主对象,其他处理方式都是通过addHandler添加进去,有以下几种方式:

  • logging.StreamHandler;日志输出到流,可以是sys.stderr,sys.stdout或者文件
  • logging.FileHandler;日志输出到文件
  • logging.handlers.BaseRotatingHandler;基本的日志回滚方式
  • logging.handlers.RotatingHandler;日志回滚方式,支持日志文件最大数量和日志文件回滚
  • logging.handlers.TimeRotatingHandler;日志回滚方式,在一定时间区域内回滚日志文件
  • logging.handlers.SocketHandler;远程输出日志到TCP/IP sockets
  • logging.handlers.DatagramHandler;远程输出日志到UDP sockets
  • logging.handlers.SMTPHandler;远程输出日志到邮件地址
  • logging.handlers.SysLogHandler;日志输出到syslog
  • logging.handlers.NTEventLogHandler;远程输出日志到Windows NT/2000/XP的事件日志
  • logging.handlers.MemoryHandler;日志输出到内存中的指定buffer
  • logging.handlers.HTTPHandler;通过"GET"或者"POST"远程输出到HTTP服务器

例:

# coding:utf-8

import logging

logger = logging.getLogger('mylog')
logger.setLevel(logging.INFO)
format = logging.Formatter('%(asctime)s %(name)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')

# 写入文件
write_log = logging.FileHandler('my.log')
write_log.setLevel(logging.INFO)
write_log.setFormatter(format)

# 控制台输出
console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(format)

logger.addHandler(write_log)
logger.addHandler(console)

# 打印最低等级是info,所以debug的不会打印
logger.info('这是一个info')
logger.debug('这是一个debug')
logger.warning('这是一个warnning')
logger.error('这是一个error')
logger.critical('这是一个critical')

修改封装到类中:

# coding:utf-8

import logging


class Logger():
    def __init__(self, logger=logging.getLogger('mylog')):
        self.logger = logger

    def log(self, path):
        self.logger.setLevel(logging.INFO)
        # 打印格式
        format = logging.Formatter('%(asctime)s %(name)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')

        # 日志输出到文件
        write_log = logging.FileHandler(path)
        write_log.setLevel(logging.INFO)
        write_log.setFormatter(format)
        self.logger.addHandler(write_log)

        # 控制台输出日志
        console = logging.StreamHandler()
        console.setLevel(logging.INFO)
        console.setFormatter(format)
        self.logger.addHandler(console)

        return self.logger


if __name__ == '__main__':
    log = Logger().log('my.log')

    # 打印最低等级是info,所以debug的不会打印
    log.info('这是一个info')
    log.debug('这是一个debug')
    log.warning('这是一个warnning')
    log.error('这是一个error')
    log.critical('这是一个critical')

结果:
在这里插入图片描述

日志回滚

  • 日志文件随着输入的内容越来越多,文件的也会越来越大,进而影响到性能,因此要进行日志回滚。
  • 日志回滚就是当日志文件符合条件后,将日志文件重新命名,然后创建新的日志文件(还是原来的名称),后面产生的日志则输入到新文件中
  • 当分割的日志文件达到指定数目的上限个数时,最老的日志文件就会被删除
  • 日志回滚触发有2种情况:文件大小和时间

按照文件大小回滚:RotatingFileHandler

用法:

from logging.handlers import RotatingFileHandler

rf = RotatingFileHandler(path,maxBytes,backupCount )

参数:

  • path:日志文件地址
  • maxBytes:日志文件最大内存
  • backupCount :最多备份的文件数量

例:

# coding:utf-8

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger('mylog')
logger.setLevel(logging.INFO)
format = logging.Formatter('%(asctime)s %(name)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')

# 设置日志回滚,每个文件最大1k,最多备份3个日志文件
rf = RotatingFileHandler('my3.log', maxBytes=1*1024, backupCount=3)
# 设置最低打印日志等级
rf.setLevel(logging.INFO)
# 设置日志格式
rf.setFormatter(format)


# 控制台输出
console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(format)

logger.addHandler(rf)
logger.addHandler(console)

# 打印最低等级是info,所以debug的不会打印
logger.info('这是一个info')
logger.debug('这是一个debug')
logger.warning('这是一个warnning')
logger.error('这是一个error')
logger.critical('这是一个critical')

多运行几次,当文件中内容大于1k时就会触发回滚,然后查看文件目录可以看到有多个 日志文件:
在这里插入图片描述

按照时间回滚:TimedRotatingFileHandler

用法:

from logging.handlers import TimedRotatingFileHandler

trf = TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])

参数:

  • filename 是日志文件的地址
  • when 是一个字符串的定义如下:
    “S”: Seconds
    “M”: Minutes
    “H”: Hours
    “D”: Days
    “W”: Week day (0=Monday)
    “midnight”: Roll over at midnight
  • interval是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以有些情况suffix要定义的不能因为when而重复。
  • backupCount 是保留日志个数。默认的0是不会自动删除掉日志。若设3,则在文件的创建过程中库会判断是否有超过这个3,若超过,则会从最先创建的开始删除。

例:

# coding:utf-8

import logging
from logging.handlers import TimedRotatingFileHandler
import os

logger = logging.getLogger('mylog')
logger.setLevel(logging.INFO)
format = logging.Formatter('%(asctime)s %(name)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')

# 获取当前目录地址
current_path = os.getcwd()
# 获取日志文件地址
path = os.path.join(current_path, 'my.log')
# 设置日志回滚,每1秒回滚一次,最大备份3个文件,若是生成新的会将最早的一个文件删除
trf = TimedRotatingFileHandler(path, when='S', interval=1, backupCount=3)

# 设置备份文件后缀名称,跟strftime的格式一样
# filehanlder.suffix的格式必须这么写,才能自动删除旧文件
# 如果设定是天,就必须写成“%Y-%m-%d.log”,写成其他格式会导致删除旧文件不生效。
trf.suffix = "%Y-%m-%d_%H-%M-%S.log"


# 设置最低打印日志等级
trf.setLevel(logging.INFO)
# 设置日志格式
trf.setFormatter(format)

logger.addHandler(trf)


# 打印最低等级是info,所以debug的不会打印
logger.info('这是一个info')
logger.debug('这是一个debug')
logger.warning('这是一个warnning')
logger.error('这是一个error')
logger.critical('这是一个critical')

多运行几次,可以看到生成了多个文件:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值