python中logging模块使用

1、logging模块使用场景

       在写程序的时候,尤其是大型的程序,在程序中加入日志系统是必不可少的,它能记录很多的信息。刚刚接触python的时候肯定都在用print来输出信息,这样是最简单的输出,正是因为这样,在调试的时候还要去逐个的去更新print后面的内容,代码少的时候还好,但是当代码量到达一定数量时,使用logging就是一种好的选择

2、loggging对应日志的级别

# coding:utf-8
import logging

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

回显信息:

结果说明:

默认生成的日志root logger的level是logging.WARNING,低于该级别的就不输出了

日志级别优先级:CRITICAL > ERROR > WARNING > INFO > DEBUG

debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上

info : 打印info,warning,error,critical级别的日志,确认一切按预期运行

warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作

error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能

critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行

如何需要展低于waring级别下的日志信息:则需要设置NOTSET级别来显示

import logging

logging.basicConfig(level=logging.NOTSET)
logging.debug("test debug")

回显信息:

3、常见方法和参数说明

 logging.Formatter():这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容

Logging.Logger:Logger是Logging模块的主体,进行以下三项工作:
1. 为程序提供记录日志的接口
2. 判断日志所处级别,并判断是否要过滤
3. 根据其日志级别将该条日志分发给不同handler
常用函数有:
Logger.setLevel() 设置日志级别
Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler
Logger.addFilter() 添加一个Filter,过滤作用
Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。
常用函数有:
setLevel() 设置级别
setFormatter() 设置Formatter

4、日志输出---控制台

import logging  # 引入logging模块
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')  # logging.basicConfig函数对日志的输出格式及方式做相关配置
# 由于日志基本配置中级别设置为DEBUG,所以一下打印信息将会全部显示在控制台上
logging.info('loggging info message')
logging.debug('loggging debug message')
logging.warning('loggging a warning message')
logging.error('loggging error message')
logging.critical('loggging critical message')

5、日志输出--日志文件和控制台

 1、初始化 logger = logging.getLogger("endlesscode"),getLogger()方法后面最好加上所要日志记录的模块名字,后面的日志格式中的%(name)s 对应的是这里的模块名字

2、设置级别 logger.setLevel(logging.DEBUG),Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志

3、设置Filehandler和StreamHandler来把日志记录到文件里,同时设置记录文件的日志级别和控制台打印日志的文件级别--Handler,常用的是StreamHandler和FileHandler,windows下你可以简单理解为一个是console和文件日志,一个打印在CMD窗口上,一个记录在一个文件上

4、设置日志格式

--------------------------------------------------------------------

及常见日志格式说明:

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

# getLogger()方法后面加上所要日志记录的模块名字
logger = logging.getLogger("Y_Test")
logger.setLevel(logging.DEBUG)
# 建立一个filehandler来把日志记录在文件里,级别为debug以上
fh = logging.FileHandler("spam.log")
fh.setLevel(logging.DEBUG)
# 建立一个streamhandler来把日志打在CMD窗口上,级别为error以上
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 设置日志格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# 将相应的handler添加在logger对象中
logger.addHandler(ch)
logger.addHandler(fh)
# 开始打日志
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")

6、当一个项目比较大的时候,不同的文件中都要用到Log,可以考虑将其封装为一个类来使用

# coding:utf-8
import logging

__author__ = 'YangJun'


# 普通logging控制台输出和文件日志输出格式及调用
# logger = logging.getLogger('Clarence')
# logger.setLevel(logging.INFO)
# # logging.basicConfig(level=logging.INFO,
# #                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')  # 控制台日志输出日志格式
#
# Format = logging.Formatter(fmt="%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
# fh = logging.FileHandler("test.log")
# fh.setLevel(logging.DEBUG)
# fh.setFormatter(Format)
# logger.addHandler(fh)
#
# sh = logging.StreamHandler()
# sh.setLevel(logging.INFO)
# sh.format(Format)
# logger.addHandler(sh)


# 重新封装logging中控制台和文件日志输出,当项目中存在多处日志打印时,可封装日志模块
class Logger:
    def __init__(self, name, sh_level, ft_level, path):
        self.logger = logging.getLogger(name)
        self.logger.setLevel(logging.INFO)
        Format = logging.Formatter(
            fmt="%(asctime)s - %(name)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
#定义日志内容格式时,必须通过logging.Formatter(曾有遗漏) sh
= logging.StreamHandler() sh.setLevel(sh_level) sh.setFormatter(Format) fh = logging.FileHandler(path) fh.setLevel(ft_level) fh.setFormatter(Format) self.logger.addHandler(sh) self.logger.addHandler(fh) def logging_info(self, message): self.logger.info(message) def logging_debug(self, message): self.logger.debug(message) def logging_warning(self, message): self.logger.warning(message) def logging_error(self, message): self.logger.error(message) def logging_critical(self, message): self.logger.critical(message) if __name__ == "__main__": test_log = Logger("clarence", logging.INFO, logging.DEBUG, 'test.log') test_log.logging_error("just test")

 

 

原文地址:https://www.cnblogs.com/clarenceyang/p/9675117.html