zoukankan      html  css  js  c++  java
  • 13 python logging模块

    原文:http://www.cnblogs.com/dahu-daqing/p/7040764.html

    1 logging模块简介

    logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

    可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;

    print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,

    logging的日志可以分为 debug(), info(), warning(), error() and critical()5个级别,下面我们看一下怎么用。

    默认级别是WARNING,表示只有WARING和比WARNING更严重的事件才会被记录到日志内,低级别的信息会被忽略。
    
    因此,默认情况下,DEBUG和INFO会被忽略,WARING、ERROR和CRITICAL会被记录。
    
    有多种方法用来处理被跟踪的事件。最简单的方法就是把它们打印到终端控制台上。或者将它们写入一个磁盘文件内。
    import logging
    
    logging.warning('Watch out!')  # 消息会被打印到控制台上
    logging.info('I told you so')  # 这行不会被打印,因为级别低于默认级别warning

    2 logging模块使用

    2.1 配置logging基本的设置,记录到文件里

    import logging
    
    logging.basicConfig(filename='example.log',level=logging.INFO)
    logging.debug(
    'This message should go to the log file') logging.info('So should this') logging.warning('And this, too')
    其中下面这句中的level
    =loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,
    在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了。 logging.basicConfig(filename
    ='example.log',level=logging.INFO)

    2.2python logging模块 basicConfig配置文件

    logging.basicConfig(level=log_level,
                        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                        datefmt='%a, %d %b %Y %H:%M:%S',
                        filename='parser_result.log',
                        filemode='w')#默认为a
    logging.basicConfig函数各参数:
    filename: 指定日志文件名
    filemode: 和file函数意义相同,指定日志文件的打开模式,'w''a'
    format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
     %(levelno)s: 打印日志级别的数值
     %(levelname)s: 打印日志级别名称
     %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
     %(filename)s: 打印当前执行程序名
     %(funcName)s: 打印日志的当前函数
     %(lineno)d: 打印日志的当前行号
     %(asctime)s: 打印日志的时间
     %(thread)d: 打印线程ID
     %(threadName)s: 打印线程名称
     %(process)d: 打印进程ID
     %(message)s: 打印日志信息
    datefmt: 指定时间格式,同time.strftime()
    level: 设置日志级别,默认为logging.WARNING
    stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
    
    logging打印信息函数:
    
    logging.debug('This is debug message')
    logging.info('This is info message')
    logging.warning('This is warning message')

    2.2把日志同时输出至文件和控制台

    #引入日志模块
    import logging
    
    #1 生成 logger 对象
    logger_user = logging.getLogger('atm_user')
    
    #每个程序在输出信息之前都要获得一个Logger。
    # Logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的Logger:
    #LOG=logging.getLogger(”chat.gui”)
    
    # 2 logger.setLevel()指定日志最低级别
    logger_user.setLevel(level = logging.DEBUG)
    
    # 3 FileHandler()日志输出至文件
    handler_user = logging.FileHandler('test.log',encoding='utf-8')
    
    # handler对象负责发送相关的信息到指定目的地
    # 4 指定被处理的信息最低级别 Handler.setLevel()
    handler_user.setLevel(logging.DEBUG)
    
    # 5 给这个输出设定一个格式
    formatter = logging.Formatter('%(asctime)s--%(name)s--%(levelname)s--%(message)s')
    handler_user.setFormatter(formatter)
    
    # 6 增加指定的文件
    logger_user.addHandler(handler_user)
    
    #  StreamHandler()输出至屏幕
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    
    # 增加指定的文件  Handler()
    logger_user.addHandler(handler_user)
    #或者控制台 Handler()
    logger_user.addHandler(console)
    #------------------------------------------------
    logger_user.info("Start print log")
    logger_user.debug("Do something")
    logger_user.warning("Something maybe fail.")
    logger_user.info("Finish")

    简洁的方法:输出到文件的简单方法

    import logging
    logging.basicConfig(level = logging.INFO,
                        format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                        filename='test2.log',
                        
    
                        )
    
    logger_user = logging.getLogger('user')
    
    logger_user.info("Start print log")
    logger_user.debug("Do something")
    logger_user.warning("Something maybe fail.")
    logger_user.info("Finish")

    #-----------------------------------------------------------------------

    # 函数
    import logging


    logging.basicConfig(filename='log_test.log',
    level=logging.WARNING,
    format='%(asctime)s:%(levelname)s:%(filename)s:%(module)s %(message)s',
    datefmt='%Y-%m-%d %I:%M:%S %p'
    )

    def sayhi():
    logging.error('from sayhi...')

    sayhi()

    logging.debug('so should this')
    logging.info('I told you so')
    logging.warning('Watch out!')
    logging.error('this error is no')
    logging.critical('critical xxxx')

    2.3、formatter组件

    日志的formatter是个独立的组件,可以跟handler组合

    fh = logging.FileHandler("access.log")#添加日志到文件
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
     
    fh.setFormatter(formatter) #把formmater绑定到fh上

    2.4、filter组件

    如果你想对日志内容进行过滤,就可自定义一个filter

    class IgnoreBackupLogFilter(logging.Filter):

        """忽略带db backup 的日志"""
        def filter(self, record): #固定写法
            return   "db backup" not in record.getMessage()

    下面的日志就会把符合filter条件的过滤掉

    logger.debug("test ....")
    logger.info("test info ....")
    logger.warning("start to run db backup job ....")
    logger.error("test error ....")

    2.5一个同时输出到屏幕、文件、带filter的完成例子

    import logging
    
    # filter 过滤
    class IgnoreBackupLogFilter(logging.Filter):
        """忽略带db backup 的日志"""
        def filter(self, record): #固定写法
            return "db backup" not in record.getMessage()
    
    
    # 1.生成logging对象
    logger = logging.getLogger('web')
    logger.setLevel(logging.INFO)  # 设置日志等级
    # 1.1 把filter对象添加到logger中
    logger.addFilter(IgnoreBackupLogFilter())
    
    
    # 2。生成hander对象
    ch = logging.StreamHandler()   # 终端打印
    ch.setLevel(logging.DEBUG)     # 终端打印 日志等级
    fh = logging.FileHandler('web.log')  # 文件保存
    fh.setLevel(logging.WARNING)   # 文件保存 日志等级
    
    # 2.1把hander对象绑定到logger
    logger.addHandler(ch)
    logger.addHandler(fh)
    
    
    # 3.生成formatter 对象
    file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    # 3.1把formatter对象绑定到hander对象
    ch.setFormatter(console_formatter)
    fh.setFormatter(file_formatter)
    
    logger.debug("test ....")
    logger.info("test info ....")
    logger.warning("start to run db backup job ....")
    logger.warning("start to run db backup job 1....")
    logger.warning("start to run db backup job 2....")
    logger.error("test error ....")
    #-----------------------------------------------------------------------
    保存输出,非过滤条件下的数据
    web.log 文件: 2018-08-31 14:23:55,694 - web - ERROR - test error ....
    控制台输出:

    2018-08-31 14:23:55,692 - web - INFO - test info ....
    2018-08-31 14:23:55,694 - web - ERROR - test error ....

    如果条件变为:保存输出满足过滤条件的数据
    return "db backup" in record.getMessage()
    wed.log文件:
    2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job ....
    2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 1....
    2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 2....

    控制台:

    2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job ....
    2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 1....
    2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 2....





  • 相关阅读:
    apache 访问出现403 Forbidden
    linux下用Apache一个IP多个域名建虚拟主机
    利用xargs 可以一次性卸载到位
    linux安装包地址备忘
    ii7安装php
    基于jQuery的对象切换插件:soChange 1.5 (点击下载)
    phpMyAdmin 缺少 mysqli 扩展。请检查 PHP 配置
    Android中的自动朗读(TTS)
    Android中的手势
    Android中的SQLiteOpenHelper类
  • 原文地址:https://www.cnblogs.com/foremostxl/p/9511067.html
Copyright © 2011-2022 走看看