• 记录一下自己用到的python logging


      最近想把自己零零散散写的代码嵌成一个应用,要考虑到各方面的debug,把logging看了一下,把用到的记下来。

    • 将日志打印到屏幕
    import logging
    
    logging.debug(u'调试')
    logging.info(u'运行')
    logging.warning(u'警告')
    
    #运行显示:
    #WARNING:root:警告 
    #默认情况下,logging打印WARNING级别以上的,并打印到屏幕。
    #日志级别大小关系 CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET(默认),并且可以自定义。
    • basicConfig函数配置日志输出
    #-*- coding:utf-8 -*-
    import logging
    logging.basicConfig(level=logging.DEBUG,
                    format=u'%(asctime)s 文件:%(filename)s [第 %(lineno)d 行] 等级: %(levelname)s 信息: %(message)s',
                    datefmt=' %Y %b %d  %H:%M:%S,%a',
                    filename='guapeng.log',
                    filemode='w')
        
    logging.debug(u'调试')
    logging.info(u'信息')
    logging.warning(u'警告')
    
    #guapeng.log文件显示如下
    #2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 10 行] 等级: DEBUG 信息: 调试
    #2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 11 行] 等级: INFO 信息: 信息
    #2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 12 行] 等级: WARNING 信息: 警告
    
    #basicConfig参数说明:
    
    #filename: 指定日志文件名
    
    #filemode: 打开模式,'w'或'a'
    
    #format: 指定输出的格式和内容,一些format默认的参数:
    
    #  %(levelno)s: 日志级别数值
    #  %(levelname)s: 日志级别名称
    #  %(pathname)s: 当前执行程序的路径,相当于sys.argv[0]
    #  %(filename)s: 当前执行程序名(注意这里与log文件名是不同的)
    #  %(funcName)s: 当前执行函数
    #  %(lineno)d: 当前行号
    #  %(asctime)s: 当前时间
    #  %(thread)d: 线程ID
    #  %(threadName)s: 线程名称
    #  %(process)d: 进程ID
    #  %(message)s: 日志信息
    #datefmt: 指定时间格式,与time.strftime()一样
    #level: 设置打印日志级别,默认为logging.WARNING,上例为DEBUG,故大于DEBUG的都输出到log文件。
    
    #stream: 指定日志的输出方式,默认输出到sys.stderr(屏幕),当stream和filename同时指定时,stream被忽略
    • 将debug信息打印打log文件,将info信息打印到屏幕
    #-*- coding:utf-8 -*-
    import logging
    logging.basicConfig(level=logging.DEBUG,
                    format=u'%(asctime)s 文件:%(filename)s [第 %(lineno)d 行] 等级: %(levelname)s 信息: %(message)s',
                    datefmt=' %Y %b %d  %H:%M:%S,%a',
                    filename='guapeng.log',
                    filemode='w')
    #定义一个StreamHandler,将INFO级别的信息打印到屏幕
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
    console.setFormatter(formatter)
    log = logging.getLogger('').addHandler(console)
    
    
    logging.debug(u'调试')
    logging.info(u'信息')
    logging.warning(u'警告')
    
    #guapeng.log文件显示如下
    #2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 10 行] 等级: DEBUG 信息: 调试
    #2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 11 行] 等级: INFO 信息: 信息
    #2015 Jul 27 16:22:26,Mon 文件:testlog.py [第 12 行] 等级: WARNING 信息: 警告
    
    #屏幕显示如下
    #root        : INFO    信息
    #root        : WARNING 警告
    •  用config文件,同时实现日志文件按天存储,而且只存一周内的日志。

    python代码

    #-*- coding:utf-8 -*-
    import logging
    import logging.config
    
    #导入配置文件
    logging.config.fileConfig("logging.conf")
     
    #创建logger
    loggerInfo = logging.getLogger("TimeInfoLogger")
     
    #测试代码
    loggerInfo.debug("debug message")
    loggerInfo.info("info message")
    loggerInfo.warn("warn message")
    loggerInfo.error("error message")
    loggerInfo.critical("critical message")

    logging.conf文件代码

    # 定义logger模块,root是父类,必需存在的,其它类自行定义。
    [loggers]
    keys=root,TimeInfoLogger
    
    # 定义handler
    [handlers]
    keys=TimeInfoHandler
    
    #定义输出格式
    [formatters]
    keys=TimeInfoFmt
    
    #--------------------------------------------------
    # 实现上面定义的logger模块,必需是[logger_xxxx]这样的形式
    #--------------------------------------------------
    # [logger_xxxx] logger_模块名称
    # level     级别,级别有DEBUG、INFO、WARNING、ERROR、CRITICAL
    # handlers  处理类,可以有多个,用逗号分开
    # qualname  logger名称,应用程序通过 logging.getLogger获取。对于不能获取的名称,则记录到root模块。
    # propagate 是否继承父类的log信息,0:否 1:是
    [logger_root]
    level=INFO
    handlers=TimeInfoHandler
    
    [logger_TimeInfoLogger]
    level=INFO
    handlers=TimeInfoHandler
    propagate=0
    qualname=TimeInfoLogger
    
    #--------------------------------------------------
    # handler
    #--------------------------------------------------
    # [handler_xxxx]
    # class handler类名
    # level 日志级别
    # formatter,上面定义的formatter
    # args handler初始化函数参数
    [handler_TimeInfoHandler]
    class=logging.handlers.TimedRotatingFileHandler
    level=INFO
    formatter=TimeInfoFmt
    args=('C:\Users\tyanf\Desktop\error.log', 'midnight', 1, 6)
    
    #--------------------------------------------------
    # 日志格式
    #--------------------------------------------------
    # %(asctime)s       年-月-日 时-分-秒,毫秒 2013-04-26 20:10:43,745
    # %(filename)s      文件名,不含目录
    # %(pathname)s      目录名,完整路径
    # %(funcName)s      函数名
    # %(levelname)s     级别名
    # %(lineno)d        行号
    # %(module)s        模块名
    # %(message)s       消息体
    # %(name)s          日志模块名
    # %(process)d       进程id
    # %(processName)s   进程名
    # %(thread)d        线程id
    # %(threadName)s    线程名
    [formatter_TimeInfoFmt]
    format=%(asctime)s %(levelname)s %(message)s
    datefmt=
    class=logging.Formatter
    #测试时间从7月20日到7月27号,最后文件库显示如下:
    #error.log.2015-07-21
    #error.log.2015-07-22
    #error.log.2015-07-23
    #error.log.2015-07-24
    #error.log.2015-07-25
    #error.log.2015-07-26
    #error.log
    #其中error.log.2015-07-20由于程序设定backupcount为6,当大于6时把最早的删除,再添加新的日志文件,故已经被删除。

    参考资料:

    http://my.oschina.net/leejun2005/blog/126713

    https://docs.python.org/2/library/logging.handlers.html

  • 相关阅读:
    如何写出无法维护的代码
    阅读优秀代码是提高开发人员修为的一种捷径
    防止代码变质的思考与方法
    干掉你程序中的僵尸代码
    如何防止代码腐烂
    迈出单元测试的第一步
    使用VC6.0编译C++代码的时候报错:fatal error C1071: unexpected end of file found in comment(Mark ZZ)
    Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法
    Java中JNI的使用详解第三篇:JNIEnv类型中方法的使用
    Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释
  • 原文地址:https://www.cnblogs.com/guapeng/p/4680684.html
Copyright © 2020-2023  润新知