python-应用logging打印日志

今日份的更新,是如何实现打印日志的功能。仍然是靠临摹实现最基本的功能,开发可真难啊~

在程序运行过程中,打印日志可以帮助了解程序运行情况及问题定位,python提供了一个标准库模块logging,可以实现一个灵活的事件日志系统。

它一共有两种方式记录日志,这里应用的是使用logging日志系统的四大组件。还有一种是使用logging提供的模块级别的函数,本篇未做介绍。logging模块无需下载,文件中可以直接引入。

import logging

logging日志级别

logging模块提供5个日志等级,级别依次递增,DEBUG<INFO<WARNING<ERROR<CRITICAL。但信息量依次递减,前两个通常是在开发期间应用,输出的信息比较详细,后三个则是在生产环境应用较多。

应用程序设置日志级别或是logging模块设置日志级别之后,日志会输出大于等于此等级的日志。

logging模块定义等级函数的用法如下:

logging.debug(msg,*args,**kwargs)# 定义一个严重级别为debug的函数
logging.info(msg,*args,**kwargs)# 定义一个严重级别为info的函数
logging.warning(msg,*args,**kwargs)# 定义一个严重级别为warning的函数
logging.error(msg,*args,**kwargs)# 定义一个严重级别为error的函数
logging.critical(msg,*args,**kwargs)# 定义一个严重级别为critical的函数

logging日志格式

logging模块中,日志输出的内容及格式均可以进行自定义,下面列举部分输出信息。

内容 格式
日志输出时间 %(asctime)s
日志级别 %(levelname)s
日志器名称 %(name)s
文件名称带后缀 %(filename)s
调用日志记录代码所在行号 %(lineno)s
日志记录的文本内容 %(message)s

logging四大组件

组件名称 类名 作用
日志器 Logger 直接应用的日志接口
处理器 Handler 将Logger创建的日志发送到目标位置
格式器 Formatter 日志输出格式
过滤器 Filter 设置输出日志的过滤条件

这几个组件可以理解为,一个日志器可以有多个处理器,不同的处理器可以有不同的格式器以及不同的过滤器,并且把日志输出到不同的位置。

logging组件类

接下来,就可以应用logging四个组件对应的类进行日志的输出了。

logger类

想要创建一个日志器对象,语法为

logger=logging.getLogger()

括号内name为可选参数,不指定则默认日志器名称为root。

创建的logger对象可以设置日志级别,添加日志处理器及过滤器,设置完成后即可创建日志记录。

  • 设定日志级别
logger.setLevel(level=logging.INFO)
# 设定日志器的级别为INFO,大于等于该级别的日志均会输出
  • 添加处理器
logger.addHandler(handler)
# handler为下方创建的处理器名称
  • 创建日志记录
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()

handlers类

handlers类属于基类,它提供了一些子类可以直接应用,方便定义不同的日志输出位置,下面列举四个常用的子类。

类名 作用
logging.StreamHandler 将日志直接发送到Stream,例如控制台
logging.FileHandler 将日志发送到磁盘文件,默认会无限增大
logging.handlers.RotatingFileHandler 将日志发送到磁盘文件,支持按大小切割文件
logging.hanlders.TimedRotatingFileHandler 将日志发送到磁盘文件,支持按时间切割文件
创建一个处理器对象

选择一个比较常用,即以创建可按照时间切割的处理器对象为例进行实现。

from logging.handlers import TimedRotatingFileHandler
handler=TimedRotatingFileHandler(filename=file,when='D',interval=1,backupCount=7)

其中,filename为输出的日志文件位置;
when代表切割单位,周(W),天(D),时(H),每天凌晨(midnight)等;
interval代表切割间隔,上述代码为1天切割为1个文件;
backupCount为最多保存的日志文件个数,超过即会删除最早创建的文件。

处理器对象配置

处理器对象同样可以设置日志级别、日志格式以及添加过滤器。

  • 设置日志级别
level=logging.INFO
handler.setLevel(level)
# 设定日志器的级别为INFO,大于等于该级别的日志均会输出
  • 设置日志格式
handler.setFormatter(format)
# format为下方Formatter类的实例化对象

Formatter类

logging模块的Formatter类主要用于自定义日志的输出格式。

log_format = '%(asctime)s - %(name)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s'
format=logging.Formatter(log_format)

Filter类

可以用于指定仅显示符合规则的日志,比如日志器name为test的日志才会被输出到文件。
目前我没有应用这个,所以就先不举例了~

logging应用

首先,建立一个日志初始化文件,创建日志器及对应的处理器。下方主要有两个处理器,一个实现向指定文件中以时间切割的方式输出日志,另一个实现直接在控制台输出日志。

#log.py
import logging
import os
from logging.handlers import TimedRotatingFileHandler

basepath = os.path.abspath(os.path.dirname(__file__))
log_level = logging.DEBUG
log_format = '%(asctime)s - %(name)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s'
log_file = os.path.join(basepath, 'log', 'log.txt')

def log_init():
    logger = logging.getLogger()  # 创建一个日志器
    logger.setLevel(level=log_level)  # 日志器的级别设置
    formatter = logging.Formatter(log_format)  # 日志格式

    handler = TimedRotatingFileHandler(filename=log_file, when='D', interval=1, backupCount=7)  # 创建一个按时间切割文件的处理器
    handler.setLevel(log_level)  # 处理器的级别设置
    handler.setFormatter(formatter)  # 处理器的格式
    logger.addHandler(handler)  # 给日志器增加处理器

    console = logging.StreamHandler()
    # 创建向控制台输出日志内容的第二个处理器
    console.setLevel(log_level)
    console.setFormatter(formatter)
    logger.addHandler(console)

在其他文件中,引用上述文件方法并进行初始化,定义日志器,打印日志。

test01.py
import logging
from log import log_init
import time

log_init()
logger = logging.getLogger('t01')
logger.info('log test')
t = time.strftime('%Y%m%d_%H%M%S', time.localtime())
print(t)

运行test01文件,控制台输出结果如图:


控制台输出结果

日志文件如图:


log.txt

以上,就实现了初步的日志打印,至于在日志中如何打印出代码中的变量等等,还需要下一步学习,我们下次见~

自我记录,有错误欢迎指正~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容