物联网loT从业者物联网物联网之家

0-python库之-logging日志系统

2020-02-16  本文已影响0人  Creator_Ly

一般情况我们可以使用print()进行打印信息,当我们需要打印的信息可以等级显示,加时间戳,保存到文件等的时候,使用print就不太方便,这时候一般使用logging库

1、设置日志级别

我们先做一个测试,如下语句:

import logging  # 引入logging模块

logging.debug(u"debug")
logging.info(u"info")
logging.warning(u"warning")
logging.error(u"error")
logging.critical(u"critical")

运行结果如下:

WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical

所以可以知道logging的默认等级为warning,低于该等级的就不输出了,

那如何设置日志输出的等级呢,如下

import logging  # 引入logging模块

logging.basicConfig(level=logging.NOTSET)  # 设置日志级别

logging.debug(u"debug")
logging.info(u"info")
logging.warning(u"warning")
logging.error(u"error")
logging.critical(u"critical")

使用basicConfig里面的level字段设置,有如下几个等级可以设置

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

2、设置日志显示格式

如果我们想给日志加个打印时间,打印所处的文件行数等,如何设置。

import logging

if __name__ == '__main__':
    logging.basicConfig(level=logging.NOTSET,  # 设置日志级别
                        format="%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")

    logging.debug(u"debug")
    logging.info(u"info")
    logging.warning(u"warning")
    logging.error(u"error")
    logging.critical(u"critical")

可以看到输入结果有时间,有代码文件和行数。

2020-02-16 16:16:43,356 - test.py[line:54] - DEBUG: debug
2020-02-16 16:16:43,356 - test.py[line:55] - INFO: info
2020-02-16 16:16:43,356 - test.py[line:56] - WARNING: warning
2020-02-16 16:16:43,356 - test.py[line:57] - ERROR: error
2020-02-16 16:16:43,356 - test.py[line:58] - CRITICAL: critical

3、设置日志输出文件

同理我们想把文件输出到一个文件里面保存,如下,使用filename参数

import logging

if __name__ == '__main__':
    logging.basicConfig(level=logging.NOTSET,  # 设置日志级别
                        format="%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s",
                        filename="test.log",  # 指定输出的文件
                        )

    logging.debug(u"debug")
    logging.info(u"info")
    logging.warning(u"warning")
    logging.error(u"error")
    logging.critical(u"critical")

这样设置后,我们会发下日志内容是保存在test.log文件里面了,可以没办法实时显示在终端,要看log还得打开文件,我们能否做到日志文件里面有保存,终端也能实时显示呢。

这时候就要用到logging里面的Handler接口

4、同时输出到终端和文件

这边我们一般使用getLogger接口实例化的logging,而不将其直接暴露
如:

import logging

logger = logging.getLogger("") # 实例化logging

logger.debug(u"debug")
logger.info(u"info")
logger.warning(u"warning")
logger.error(u"error")
logger.critical(u"critical")

之后我们就可以使用Handler,handler对象负责将适当的日志消息(基于日志消息的log level)分发给handler的指定目标,如文件、标准输出流等。

logging里面有很多handle

logging.StreamHandler # 日志输出到流,可以是 sys.stderr,sys.stdout 或者文件。
logging.FileHandler  # 日志输出到文件。
logging.handlers.BaseRotatingHandler  # 基本的日志回滚方式。
logging.handlers.RotatingHandler  # 日志回滚方式,支持日志文件最大数量和日志文件回滚。
logging.handlers.TimeRotatingHandler  # 日志回滚方式,在一定时间区域内回滚日志文件。
logging.handlers.SocketHandler  # 远程输出日志到TCP/IP sockets。
logging.handlers.DatagramHandler  # 远程输出日志到UDP sockets。
logging.handlers.SMTPHandler  # 远程输出日志到邮件地址。
logging.handlers.SysLogHandler  # 日志输出到syslog。
logging.handlers.NTEventLogHandler  # 远程输出日志到Windows NT/2000/XP的事件日志。
logging.handlers.MemoryHandler  # 日志输出到内存中的指定buffer。
logging.handlers.HTTPHandler  # 通过”GET”或者”POST”远程输出到HTTP服务器。
logging.NullHandler

我们这边需要使用到的就是StreamHandler和FileHandler这两个

如下例子:

import logging

logger = logging.getLogger("") # 实例化logging

def logging_init():
    # 创建handler
    fh = logging.FileHandler/("test.log", encoding="utf-8")
    ch = logging.StreamHandler()

    # 设置logger日志等级
    logger.setLevel(logging.INFO)

    # 设置输出日志格式
    formatter = logging.Formatter(
        fmt="%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s"
    )

    # 为handler指定输出格式,注意大小写
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)

    # 为logger添加的日志处理器
    logger.addHandler(fh)
    logger.addHandler(ch)
    
    return True
    
    
if __name__ == '__main__':
    logging_init()

    logger.debug(u"debug")
    logger.info(u"info")
    logger.warning(u"warning")
    logger.error(u"error")
    logger.critical(u"critical")
    

参考资料:
https://blog.csdn.net/jeffery0207/article/details/95856490
https://www.cnblogs.com/xianyulouie/p/11041777.html

上一篇下一篇

猜你喜欢

热点阅读