Python–logging模块知多少

我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志。
介绍一下logging模块,logging模块就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不同的工作:

Logger 记录器,暴露了应用程序代码能直接使用的接口;简单点说就是一个创建一个办公室,让人在里头工作

Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地;这个简单点说就是办事的人,你可以指定是让在控制输出日志,还是在文件里面打印日志,常用的有4种:

StreamHandler 控制台输出

FileHandler 文件输出

下面两种需要导入

handlers
                        from logging import handlers

TimedRotatingFileHandler 按照时间自动分割日志文件

RotatingFileHandler 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件

Filter
过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。(不常用)

Formatter
格式化器,指明了最终输出中日志记录的布局。指定输出日志的格式

1

2

3

4

5

6

7

8

9

10

11

12

13

import logging

from logging import handlers

#只在控制台打印日志

logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别

format=

‘%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s‘

#日志格式

)

logging.debug(‘debug级别,最低级别,一般开发人员用来打印一些调试信息‘)

logging.info(‘info级别,正常输出信息,一般用来打印一些正常的操作‘)

logging.warning(‘waring级别,一般用来打印警信息‘)

logging.error(‘error级别,一般用来打印一些错误信息‘)

logging.critical(‘critical级别,一般用来打印一些致命的错误信息‘)

日志级别 debug < info < warning < error < critical
设置了日志级别之后,会打印该级别以及比该级别高的所有日志,举个例子,如果日志级别是warning,那么就会打印warning、error、critical,这三个级别的日志,不会打印debug和info级别的,如果是debug,最低级别的日志,那么所有的日志都会打印。
上面的只是在控制台打印日志,并没有把日志写在文件里面,一般我们都会把日志写在日志文件里面,也很简单,只需要加个参数指定文件名就行了。

1

2

3

4

5

6

7

8

9

10

11

12

13

logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别

filename=‘log.txt‘,#文件名

filemode=‘a‘,#模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志

#a是追加模式,默认如果不写的话,就是追加模式

format=

‘%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s‘

#日志格式

)

logging.debug(‘debug级别,最低级别,一般开发人员用来打印一些调试信息‘)

logging.info(‘info级别,正常输出信息,一般用来打印一些正常的操作‘)

logging.warning(‘waring级别,一般用来打印警信息‘)

logging.error(‘error级别,一般用来打印一些错误信息‘)

logging.critical(‘critical级别,一般用来打印一些致命的错误信息‘)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

可以指定日志的输出格式format,这个参数可以输出很多有用的信息,如下面的几种格式:

%(levelno)s: 打印日志级别的数值

%(levelname)s: 打印日志级别名称

%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]

%(filename)s: 打印当前执行程序名

%(funcName)s: 打印日志的当前函数

%(lineno)d: 打印日志的当前行号

%(asctime)s: 打印日志的时间

%(thread)d: 打印线程ID

%(threadName)s: 打印线程名称

%(process)d: 打印进程ID

%(message)s: 打印日志信息

我在工作中给的常用格式在前面已经看到了。就是:

format=‘%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s‘

这个格式可以输出日志的打印时间,是哪个文件第几行输出的,输出的日志级别是什么,以及输入的日志内容。

加上文件名之后就会发现控制台不会输出日志了,日志文件也产生了,那么如何既在控制台输出日志,也在文件中写入呢?

怎么实现呢,就得有个办公室,里面塞俩人,一个给负责往控制台输出日志,一个负责写文件,你把他俩往办公室一塞,他俩就能干活了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

import logging

from logging import handlers

logger = logging.getLogger(‘my_log‘)

#先创建一个logger对象,相当于这个办公室,也就是上面说的Logger

logger.setLevel(logging.INFO)#设置日志的总级别

fh = logging.FileHandler(‘test.log‘,mode=‘a‘,encoding=‘utf-8‘)#创建一个文件处理器,也就是把日志写到文件里头

fh.setLevel(logging.INFO)#设置文件输出的级别

sh = logging.StreamHandler()#创建一个控制台输出的处理器,这两个就是上面说的Handler

sh.setLevel(logging.INFO)

#设置控制台输出的日志级别,这两个级别都可以单独设置,他们俩和logger的级别区别是如果logger设置的级别比里面的handler级别设置的高,那么就以logger的级别为准

th = handlers.TimedRotatingFileHandler(‘time‘,when=‘S‘,interval=1,backupCount=2)

#指定间隔时间自动生成文件的处理器

#interval是时间间隔,backupCount是备份文件的个数,如果超过这个超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:

# S 秒

# M 分

# H 小时、

# D 天、

# W 每星期(interval==0时代表星期一)

# midnight 每天凌晨

th.setLevel(logging.INFO)

formater = logging.Formatter(‘%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s‘)

#指定日志格式,上面咱们写了常用的格式,直接指定了就行了,这也就是咱们上面说的Formatter

sh.setFormatter(formater)

fh.setFormatter(formater)

th.setFormatter(formater)

#设置两个处理器的日志格式

logger.addHandler(sh)

logger.addHandler(fh)

logger.addHandler(th)

#把两个handler加入容器里头,相当于把工作人员培训完了,你们可以上班了

logger.debug(‘debug级别,最低级别,一般开发人员用来打印一些调试信息‘)

logger.info(‘info级别,正常输出信息,一般用来打印一些正常的操作‘)

logger.warning(‘waring级别,一般用来打印警信息‘)

logger.error(‘error级别,一般用来打印一些错误信息‘)

logger.critical(‘critical级别,一般用来打印一些致命的错误信息‘)

这样logger这个日志办公室已经搞好了,咱们就可以直接用了,运行完发现文件也产生了,控制台也有日志。如果不设置日志级别的话,默认级别是waring。
下面我们自己封装一个类来使用logging模块,方便使用,默认加一些配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

import logging

from logging import handlers

class Logger(object):

level_relations = {

‘debug‘:logging.DEBUG,

‘info‘:logging.INFO,

‘warning‘:logging.WARN,

‘error‘:logging.ERROR,

‘crit‘:logging.CRITICAL

}#日志级别关系映射

def __init__(self,fp,level=‘debug‘,when=‘midnight‘,interval=1,backCount=5,encoding=‘utf-8‘):

‘‘‘

:param fp:日志文件路径

:param level: 日志级别 默认是debug

:param when: 分割日志的单位 S 秒、M 分、 H 小时、 D 天、 W 每星期(interval==0时代表星期一)、midnight 每天凌晨

:param interval: 时间间隔 默认每天凌晨

:param backCount: 备份文件个数 默认5个

:param encoding: 日志文件编码

‘‘‘

self.level = self.level_relations.get(level)

self.logger = logging.getLogger(fp)

self.logger.setLevel(self.level)

fmt = logging.Formatter(‘%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s‘)

sh = logging.StreamHandler()

sh.setFormatter(fmt)

sh.setLevel(self.level)

th = handlers.TimedRotatingFileHandler(fp,when=when,interval=interval,backupCount=backCount,encoding=encoding)

th.setFormatter(fmt)

th.setLevel(self.level)

self.logger.addHandler(th)

self.logger.addHandler(sh)

def debug(self,msg):

self.logger.debug(msg)

def info(self,msg):

self.logger.info(msg)

def warning(self,msg):

self.logger.warning(msg)

def error(self,msg):

self.logger.error(msg)

def crit(self,msg):

self.logger.critical(msg)

if __name__ == ‘__main__‘:

l = Logger(‘a.log‘)#实例化

l.info(‘hehehe‘)#调用

原文地址:https://www.cnblogs.com/chunyanxu/p/8732706.html

时间: 2024-08-14 07:25:37

Python–logging模块知多少的相关文章

Python logging模块实例教程

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

python logging模块使用

近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- import logging import sys class LogRecord(object): def __init__(self): self.mylogger = logging.getLogger('iplog') self.mylogger.setLevel(logging.WARNING) #创建一个han

python logging模块可能会令人困惑的地方

python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调用,而每个文件设置了对应的logging方式不同,可能会产生的令人困惑的现象. 下面以自己在开发的时候遇到的问题作为叙述的背景: 有三个python模块A.B.C.主模块A会import B和C模块,主模块有对应的logging方式, A使用logging的模块的方式为: import loggin

python logging模块小记

1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') 屏幕上打印: WARNING:root:This is warning message 默认情况下,logging将日志打印到屏幕,日志级别为WARNING:日志级别大小关系为:CRITICAL > ER

python logging—模块

python logging模块 python logging提供了标准的日志接口,python logging日志分为5个等级: debug(), info(), warning(), error() and critical() 简单用法 import logging logging.warning("warning.........") logging.critical("server is down") print: WARNING:root:warning

读懂掌握 Python logging 模块源码 (附带一些 example)

搜了一下自己的 Blog 一直缺乏一篇 Python logging 模块的深度使用的文章.其实这个模块非常常用,也有非常多的滥用.所以看看源码来详细记录一篇属于 logging 模块的文章. continue Reference: https://juejin.im/post/5b13fdd0f265da6e0b6ff3dd  Pycon2018 利用logging模块轻松地进行Python日志记录 原文地址:https://www.cnblogs.com/piperck/p/9634133.

python logging模块

很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug(), info(), warning(), error() and critical() 5个级别,下面我们看一下怎么用. 1 import logging 2 logging.debug('debug message') 3 logging.info('info me

python logging模块详解

转载至http://blog.chinaunix.net/uid-26000296-id-4372063.html 一.简单将日志打印到屏幕: [python] view plaincopy import logging logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.criti

python logging模块详解[转]

一.简单将日志打印到屏幕: [python] view plaincopy import logging logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message') 输出: WARNING:root:warning messageER