zoukankan      html  css  js  c++  java
  • 日志模块---logging

    一日志的级别

    一般日志默认有五种级别分别对应紧急程度:

    debug:一般为调试日志  级别号:10

    info     :一般为正常信息  级别号:20

    warning:一般为警告信息 级别号:30

    error    :一般为错误信息 级别号:40

    critical  :一般为严重的错误信息 级别号:50

    二日志格式的简单配置 logging.basicConfig

    日志不可能只打印信息,还有有相应的比如说时间啊,访问的地方等等

    所以配置日志的格式还是很必要的,其级别不设置,默认打印级别是warning

    logging.basicConfig(
        # filename='access.log', #这里写了就会输出到文件,没写就会输出到屏幕
        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
        level=10) #level表示级别也即是debug级别及以上
    
    logging.debug('测试着玩')
    logging.info('运行还算正常')
    logging.warning('可能要有bug了')
    logging.error('不好了,出bug了')
    logging.critical('完蛋了')
    '''
    结果:
    2018-07-08 10:23:33 AM - root - DEBUG -练习:  测试着玩
    2018-07-08 10:23:33 AM - root - INFO -练习:  运行还算正常
    2018-07-08 10:23:33 AM - root - WARNING -练习:  可能要有bug了
    2018-07-08 10:23:33 AM - root - ERROR -练习:  不好了,出bug了
    2018-07-08 10:23:33 AM - root - CRITICAL -练习:  完蛋了
    默认打印级别是warning,上面没有指定名称默认为root
    '''
    View Code

    上面的level也可以改成 level=logging.DEBUG

    但是上面的方法有几个缺点:

    1 编码格式不能设置,输出到文件后,中文会变成乱码

    2 不能同时输出到文件和屏幕

    三 logging的对象方式

    logging的对象方式可以设置同时在文件和屏幕输出,并且文件的内容和屏幕的内容可以设置记录和输出不同的级别,还可以设置绑定不同的日志格式。

    import logging
    #1产生日志
    logger1=logging.getLogger('访问日志') #相当于实例化了一个对象
                  #括号内的内容是给一个名称
    sh=logging.StreamHandler() #打印到终端
    fh1=logging.FileHandler('s1.log',encoding='utf-8') #打印到文件
    fh2=logging.FileHandler('s2.log',encoding='utf-8') ##打印到文件
    #日志格式,设置不同的日志格式
    formatter1=logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p',)
    formatter2=logging.Formatter(
        fmt='%(asctime)s : %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
    )
    formatter3=logging.Formatter(
        fmt='%(asctime)s : %(module)s : %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
    )
    
    #为handler绑定日志格式
    sh.setFormatter(formatter1)
    fh1.setFormatter(formatter2)
    fh2.setFormatter(formatter3)
    
    #为logger绑定handler
    logger1.addHandler(sh)
    logger1.addHandler(fh1)
    logger1.addHandler(fh2)
    
    #设置日志级别:logger对象的日志级别应该 <= handler的日志级别
    #因为如果大于的话,handler设置的级别就没有意义,别logger过滤掉了
    logger1.setLevel(10) #这个级别要小于下面的handler日志级别
    sh.setLevel(10)
    fh1.setLevel(10)
    fh2.setLevel(10)
    
    #测试
    logger1.debug('测试着玩')
    logger1.info('运行还算正常')
    logger1.warning('可能要有bug了')
    logger1.error('不好了,出bug了')
    logger1.critical('完蛋了')
    View Code

    其流程图如下:

    配置参数如下:

    logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:
    
    filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
    filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
    format:指定handler使用的日志显示格式。
    datefmt:指定日期时间格式。
    level:设置rootlogger(后边会讲解具体概念)的日志级别
    stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为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用户输出的消息
    View Code
  • 相关阅读:
    mysql sql的分类、运算符、常用的数据类型
    mysql 03章_完整性、约束
    java 在数组{1,2,3,4,6,7,8,9,10}中插入一个数5,使其插入完成后仍然有序
    mysql 数据库基本命令
    java 迷你DVD管理器
    15.Request对象的主要方法有哪些?
    get和post的区别?
    什么情况下调用doGet()和doPost()?
    spring的作用
    分享Bromon的blog上对IoC与DI浅显易懂的讲解
  • 原文地址:https://www.cnblogs.com/mmyy-blog/p/9279532.html
Copyright © 2011-2022 走看看