python LOG学习

日志可以记录程序运行时所发生的事件,也可以通过分析日志快速定位问题

python中的logging模块可以实现对日志的操作


更新写在前面

学了一些关于python logging的使用,就产生了疑问:为什么不直接用print语句输出信息呢?

后来了解到,使用print的方法对于简单的脚本型程序可用,但是复杂的系统最好别用这种方式,不然可能忘了移除这些print,或者print影响从标准输出中查看其它数据…

1
2
3
4
5
6
7
8
9
10
11
12
import logging
logging.basicConfig(filename='C:/Users/腾飞/Desktop/string.txt',level=logging.DEBUG)
a = 'hello'
logging.debug('创建了字符串a: %s'%a)
b = 'world'
logging.debug('创建了字符串b: %s',b) #两种写法均可
c = a + b
logging.debug('字符串a与b相加,得到c:%s',c)
try:
d = a - b
except:
logging.error('字符串a与b不能相减')

LOG基本方法

logging模块的日志等级(从低到高):

DEBUG : 最详细的日志信息
INFO : 只记录关键节点信息
WARNING : 当某些不期望的事情发生时记录的信息
ERROR : 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL : 发生严重错误,程序不能继续运行时记录的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import logging

logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")

#或
'''
logging.log(logging.DEBUG, "This is a debug log.")
logging.log(logging.INFO, "This is a info log.")
logging.log(logging.WARNING, "This is a warning log.")
logging.log(logging.ERROR, "This is a error log.")
logging.log(logging.CRITICAL, "This is a critical log.")
'''

输出:

WARNING:root:This is a warning log.
ERROR:root:This is a error log.
CRITICAL:root:This is a critical log.

logging模块提供的日志记录函数所使用的日志器设置的日志级别是WARNING,因此只有WARNING级别的日志记录以及大于它的ERROR和CRITICAL级别的日志记录才会被输出

logging模块也可以指定日志记录器的日志级别,只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃。

LOG配置

logging.basicConfig()为logging日志系统做一些基本配置

level

指定日志器的日志级别

1
2
3
4
5
6
7
8
9
import logging

logging.basicConfig(level=logging.DEBUG)

logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")

输出:

DEBUG:root:This is a debug log.
INFO:root:This is a info log.
WARNING:root:This is a warning log.
ERROR:root:This is a error log.
CRITICAL:root:This is a critical log.

filename

指定日志输出目标文件的文件名,指定该设置项后日志就不会被输出到控制台了

1
2
3
4
5
6
7
8
9
import logging

logging.basicConfig(filename='log.txt', level=logging.DEBUG)

logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")

可以在当前py文件目录下找到log.txt这个文件,再次运行程序,会发现信息被追加到上次记录的日志后面,因为默认是以追加方式’a’打开的文件

可以使用filemode 指定日志文件的打开模式,默认为’a’。需要注意的是,该选项要在filename指定时才有效

format

指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。

常用format格式字符串的字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import logging

#设置字段格式
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"

#设置日期格式
DATE_FORMAT = "%m/%d/%Y %H:%M:%S %p"

logging.basicConfig(filename='my.log', level=logging.DEBUG, format=LOG_FORMAT, datefmt=DATE_FORMAT)

logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")

捕捉异常

使用参数 exc_info=true,会输出traceback

1
2
3
4
5
6
7
8
9
10
11
12
import logging
logging.basicConfig(filename='C:/Users/腾飞/Desktop/string.txt',level=logging.DEBUG)
a = 'hello'
logging.debug('创建了字符串a: %s'%a)
b = 'world'
logging.debug('创建了字符串b: %s',b)
c = a + b
logging.debug('字符串a与b相加,得到c:%s',c)
try:
d = a - b
except Exception as e:
logging.error('a与b不能相减',exc_info=True)