欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 日志模块logging

程序员文章站 2022-07-14 23:11:29
...

Python日志级别

import  logging
logging.info("Start print log")
logging.debug("Do something")
logging.warning("Something maybe fail.")
logging.info("Finish")
logging.critical("asd")

python日志级别主要分为5个级别。可以通过logging.basicConfig()更改默认日志的配置
其中:
filename : 写入的文件名
filemode :打开文件方式
format : 指定handler使用的日志显示格式
datefmt: 指定日期时间格式
stream : 指定日志写入文件还是在控制台输出

定制自定义日志对象

import logging

logger=logging.getLogger("NAME")                                    、
"""log对象是树形结构
NAME是对象名,相同的对象名指向一个对象,可以通过
 NAME.son的形式给NAME添加子树对象
 
 不传递名字时候,log的对象是根节点
 
 注意:当父节点在输出时,子节点也会输出,此时log会输出父亲节点的输出和自己的输出,
 出现重复输出的现象"""



logger.setLevel("DEBUG")
fm=logging.Formatter("%s(asctime)   %s(messages)")                    #设置日志打印格式


fh=logging.FileHandler("lianxian.txt")                              #写入到文件的对象
fh.setFormatter(fm)                                                 #设置写入文件对象的输出格式


ch=logging.StreamHandler()                                          #在屏幕打印的对象
ch.setFormatter(fm)                                                 #屏幕打印的对象的输出格式

logger.addHandler(ch)                    #将写入文件和打印屏幕的对象都加入logger
logger.addHandler(fh)



多次实例化对象出现日志重复输出解决方法

def my_log():
    logger = logging.getLogger('mysql')
    # 判断logger是否已经添加过handler,是则直接返回logger对象,否则执行handler设定以及addHandler(ch)
    if not logger.handlers:
        ch = logging.StreamHandler()
        ch.setLevel(logging.ERROR)
        fmt = logging.Formatter('%(asctime)s  - %(message)s')
        ch.setFormatter(fmt)

        logger.addHandler(ch)

    return logger

判断handler是否已经存在,存在则直接返回对象