• Python logging 学习


    基本用法:
    import logging
    
    #初始化logger 对象
    logger = logging.getLogger("main")
    #设置logger对象基础级别,后面的handle的级别是基于此级别上的:及如果基础级别为 warning,则后面的handle最小级别就是handle了;如果基础是info,后面handle的级别是warning,则是warning
    logger.setLevel(logging.WARNING)
    
    # 建立一个filehandler来把日志记录在文件里,级别为debug以上
    filehandle = logging.FileHandler("test.log")
    filehandle.setLevel(logging.DEBUG)
    
    # 建立一个streamhandler来把日志打在CMD窗口上,级别为info以上
    consolehandle = logging.StreamHandler()
    consolehandle.setLevel(logging.INFO)
    
    # 分别为两个handle设置日志格式
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s")
    filehandle.setFormatter(formatter)
    consolehandle.setFormatter(formatter)
    
    #将两个handler添加在logger对象中
    logger.addHandler(consolehandle)
    logger.addHandler(filehandle)
    
    # 开始打日志
    logger.debug("debug message")
    logger.info("info message")
    logger.warn("warn message")
    logger.error("error message")
    logger.critical("critical message")
    注:

    1. logger:提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。

    2. handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。

    3. filter:提供一种优雅的方式决定一个日志记录是否发送到handler。

    4. formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。

     
    5. format:定义了最终log信息的顺序,结构和内容:
     
    %(message)s', '%Y-%m-%d %H:%M:%S'
    %(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创建以 来的毫秒数
    %(thread)d 线程ID。可能没有
    %(threadName)s 线程名。可能没有
    %(process)d 进程ID。可能没有
    ===========================================================
    当一个项目比较大的时候,不同的文件中都要用到Log,可以考虑将其封装为一个类来使用:
    class Logger(object):
        def __init__(self,loggerName,fileLog):
            basic_level = logging.DEBUG
            console_level = logging.INFO
            file_level = logging.INFO
    
            formatter = logging.Formatter("%(asctime)s - %(name)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s")
    
            self.logger = logging.getLogger(loggerName)
            self.logger.setLevel(basic_level)
    
            file_handle = logging.FileHandler(fileLog)
            file_handle.setLevel(file_level)
            file_handle.setFormatter(formatter)
    
            console_handle = logging.StreamHandler()
            console_handle.setLevel(console_level)
            console_handle.setFormatter(formatter)
    
            self.logger.addHandler(file_handle)
            self.logger.addHandler(console_handle)
    
        def debug(self, message):
            self.logger.debug(message)
    
        def info(self, message):
            self.logger.info(message)
    
        def warn(self, message):
            self.logger.warn(message)
    
        def error(self, message):
            self.logger.error(message)
    
        def critical(self, message):
            self.logger.critical(message)
    
    if __name__ == '__main__':
        import datetime
        dt = datetime.datetime.now()
        logfilename = "../logs/test_%s.log" % dt.strftime('%Y%m%d')
        logger = Logger("Python.utils.Log",logfilename)
        logger.debug("this is a test for debug")
        logger.info("this is a test for info")
        logger.warn("this is a test for warn")
        logger.error("this is a test for error")
    在另外一个 .py 文件里,只要导入这个模块,并实例化类 Logger 就可以在整个project 范围内 输出日志了。
     
    另外注意一点的是:自定义Logger类可以和 logging 混合运用,也可以在整个project 范围内用。但有一点要注意的是 当自定义Logger类和 logging 混用,在实例化logger时 ( = logging.getLogger(loggerName) ) loggerName 要有一个规范: 就是必需有层级关系,譬如 按照 project.package.module的 形式, 当在不同的 py文件 中 loggerName 中的 project 是一样时,
    都可以用logger 来输出日志。譬如 在 main.py 中 = logging.getLogger("pytest.test.main") 以及另外一个文件中的 =logging.getLogger("pytest.utils.ApiTestRunner")
     
  • 相关阅读:
    Linux实战教学笔记49:Zabbix监控平台3.2.4(一)搭建部署与概述
    数据库SQLITE3初识
    多功能聊天室-项目规划实现图
    多功能电子通讯录(涉及到了双向链表的使用,Linux文件编程等等)
    学生信息管理系统(C语言版本)
    Linux笔记-Makefile伪指令解析
    Linux笔记-vim 配置
    Linux笔记-Linux下编辑器的简介
    C/C++编码规范
    Linux笔记-Linux命令初解2
  • 原文地址:https://www.cnblogs.com/tomweng/p/6609959.html
Copyright © 2020-2023  润新知