logging:python标准日志处理库

xiaohai 2021-05-05 21:40:59 1091人围观 标签: Python 
简介logging就是针对处理日志的。日常我们都喜欢使用print函数来输出信息调试,但是有时候我们需要将这些保存在文件中,所以可以用Logging进行代替,而且还可以代替部分debug功能,给程序拍错。

  logging就是针对处理日志的。日常我们都喜欢使用print函数来输出信息调试,但是有时候我们需要将这些保存在文件中,所以可以用Logging进行代替,而且还可以代替部分debug功能,给程序拍错。

logging模块6个级别:

  • NOTSET:0
  • DEBUG:10
  • INFO:20
  • WARNING:30
  • ERROR:40
  • CRITICAL:50
    这些级别的用处就是先将自己的日志定义一个级别,logging模块会发出的信息级别高于定义的级别,将标准输出显示出来,发出的信息低于定义级别则略过。如果没有定义级别,默认的级别是WARNING。

先测试下上面的数据

import logging

print(logging.NOTSET)
print(logging.DEBUG)
print(logging.INFO)
print(logging.WARNING)
print(logging.ERROR)
print(logging.CRITICAL)

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

输出:

0
10
20
30
40
50

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

使用logging最简单的方式就是logging.basicConfig。logging.basicConfig的应用方法为:

logging.basicConfig(**kwargs)

该函数的可用参数有:

  • filename:用指定的文件名创建FiledHandler,日志会被存放到指定的文件中
  • filemode:文件的打开方式,默认值为’a’还可以是’w’
  • format:指定Handler使用的日志显示格式
  • datefmt:日期时间格式
  • level:设置日志的级别
  • stream:用于指定stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时针指定了filename和stream,stream参数会被忽略

format参数用到的格式化:

  • %(name)s Logger的名字
  • %(levelno)s 数字形式的日志级别
  • %(levelname)s 文本形式的日志级别
  • %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
  • %(filename)s 调用日志输出函数的模块的文件名
  • %(module)s 调用日志输出函数的模块名|
  • %(funcName)s 调用日志输出函数的函数名|
  • %(lineno)d 调用日志输出函数的语句所在的代码行
  • %(created)f 当前时间,用UNIX标准的表示时间的浮点数表示|
  • %(relativeCreated)d 输出日志信息时的,自Logger创建以来的毫秒数|
  • %(asctime)s 字符串形式的当前时间。默认格式是“2003-07-08 16:49:45,896”。逗号后面的是毫秒
  • %(thread)d 线程ID。可能没有
  • %(threadName)s 线程名。可能没有
  • %(process)d 进程ID。可能没有
  • %(message)s 用户输出的消息

datefmt的日期格式化,常用的格式有:

  • %Y:年份的长格式,如2018
  • %y:年份的短格式,如18
  • %m:月份,01~12
  • %d:日期,01~31
  • %H:小时,0~23
  • %M:分钟,00~59
  • %S:秒钟,00~59
  • %w:星期,0~6,星期天0

示例1

import logging

class TestLogging(object):
    def __init__(self):
        format = "%(asctime)-12s %(levelname)-8s %(name)-1s"  #左右对齐, %±10s: 输出至少10个字符, 不够用空格补齐, +: 右对齐, -: 左对齐
        filename = "./log.txt"
        logging.basicConfig(filename=filename, level=logging.INFO, format=format, filemode='w')
        logging.debug("debug message")
        logging.info("info message")
        logging.warning("warning message")
        logging.error("error message")
        logging.critical("critical message")


if __name__ == '__main__':
    TestLogging()

运行后输出到文件log.txt

2018-07-11 20:07:09,909 INFO     root
2018-07-11 20:07:09,910 WARNING  root
2018-07-11 20:07:09,910 ERROR    root
2018-07-11 20:07:09,910 CRITICAL root

默认的logging级别是logging.INFO,而logging.debug的级别低于loggin.INFO,所以不会显示。

示例2
自定义模块

import logging
import getpass
import sys


class MyLogging(object):
    def __init__(self):
        user = getpass.getuser()
        self.logger = logging.getLogger(user)
        self.logger.setLevel(logging.DEBUG)
        logFileName = "./test.log"
        format = logging.Formatter("%(asctime)-12s %(levelname)-8s %(name)-10s %(message)-12s")

    #文件处理
        logHand = logging.FileHandler(logFileName)
        logHand.setFormatter(format)
        logHand.setLevel(logging.ERROR)  # 错误才会被记录到日志

    #标准输出
        logHandSt = logging.StreamHandler()
        logHandSt.setFormatter(format)

        self.logger.addHandler(logHand)
        self.logger.addHandler(logHandSt)

    def debug(self, msg):
        self.logger.debug(msg)

    def info(self, msg):
        self.logger.info(msg)

    def warn(self, msg):
        self.logger.warning(msg)

    def error(self, msg):
        self.logger.error(msg)

    def critical(self, msg):
        self.logger.critical(msg)


if __name__ == '__main__':
    mylog = MyLogging()
    mylog.debug("debug message")
    mylog.info("info message")
    mylog.warn("warning message")
    mylog.error("error message")
    mylog.critical("critical message")

运行后:

#标准输出里的信息为
2018-07-11 20:23:59,369 DEBUG    zhj        debug message
2018-07-11 20:23:59,369 INFO     zhj        info message
2018-07-11 20:23:59,369 WARNING  zhj        warning message
2018-07-11 20:23:59,369 ERROR    zhj        error message
2018-07-11 20:23:59,370 CRITICAL zhj        critical message

#test.log文件中的信息为
2018-07-11 20:23:59,369 ERROR    zhj        error message
2018-07-11 20:23:59,370 CRITICAL zhj        critical message

可以将上面的这个类导入到其他里面进行使用。在全局只需要实例化一次,否则会重复打印或输出。