后台运行的程序,必须要记录日志,否则看不到问题发生的过程,解决问题就无从谈起。
python记录日志可以使用logging模块。logging有一个方法叫basicConfig,可以很方便的定义格式,文件名等设置。然而实际上,这个方法并不可靠。
我遇到的情况是,主程序master.py调用了basicConfig,可以正确写日志,但是我提供的web api app.py同样调用了basicConfig,但却得不到任何的日志内容。
日志虽然不是我们要实现的功能,但却对我们维护程序,解决问题起到关键作用。通过查阅资料和实验,我发现有2种方式都很可靠。
1. FileHandler
import logging
# 定义fileHandler
fh = logging.FileHandler(filename="xxx.log", mode="a")
fh.setLevel(logging.INFO)
# 设置格式
logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
logger = logging.getLogger("for test")
logger. addHandler(fh)
# 真正记录日志
logger.info("test log")
这种写法,如果是在一个类里用也就罢了,如果整个程序的各个部分都要写日志,就太啰嗦了。如果你还要在其他文件写日志,不再这么设置一番,恐怕还是不能正常记录。
2. fileConfig
这种做法其实就是通过配置文件的方式,把上面的工作都预先设置好了。代码写起来很方便。
我们可以写新建一个ini格式的配置文件,logging.conf,代码如下:
[loggers]
keys=root,simpleExample
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=fileHandler
[logger_simpleExample]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=simpleExample
propagate=0
[handler_consoleHandler] # 控制台日志
class=StreamHandler
level=WARNING
formatter=simpleFormatter
args=(sys.stdout,)
[handler_fileHandler] # 文件日志
class=FileHandler
level=DEBUG # 这里修改日志记录级别
formatter=simpleFormatter
args=('bin.log','a+') # 这里修改日志名
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
然后再在程序里用2行代码完成加载
import logging
from logging import config
# 加载配置
config.fileConfig('logging.conf')
logger = logging.getLogger("mudule1")
# 使用
logger.info("test log")
小结
使用logging记录日志时,basicConfig方法似乎不那么可靠。虽然可以用fileHandler来设置,但是这里更推荐使用fileConfig来设置。设置文件可以直接从上文粘贴。
网友评论