• Python之日志操作(logging)


    import logging
     
    1、自定义日志级别,日志格式,输出位置
    logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s | %(levelname)s| %(message)s‘,%(name)s root log是?
    filename='filepath'
    filemode='w'
    )
    level :指定root logger的日志级别(DEBUG)
    format:日志格式
    filename:文件写入的路径
    filemode:末填写,默认是追加方式’a‘
    日志级别排序:CRITICAL>ERROR>WARNING>INFO>DEBUG>NOTEST
    logging.debug('debug info')
    logging.info('info log')
    logging.warning('warning log')
    logging.error('error log')
    级别从低到高
    结果:
    2017-06-25 09:12:00,025 | DEBUG| debug info
    2017-06-25 09:12:00,025 | INFO| info log
    2017-06-25 09:12:00,025 | WARNING| warning log
    2017-06-25 09:12:00,025 | ERROR| error log
     
    (1)format:指定handler使用的日志显示格式,即日志打印的格式字符串。可
    用到的格式化串:
    %(name)s:Logger的名字;
    %(levelno)s:日志级别的数值;
    %(levelname)s:日志级别名称;
    %(pathname)s:当前执行程序的路径,其实就是sys.argv[0],可能没有;
    %(filename)s:调用日志输出函数的模块的文件名;
    %(module)s:当前执行程序的程序名;
    %(funcName)s:日志输出函数的函数名;
    %(lineno)d:日志输出函数的语句所在的代码行;
    %(created)f:当前时间,用UNIX标准的表示时间的浮点数表示;
    %(relativeCreated)d:输出日志信息时的,自Logger创建以来的毫秒数;
    %(asctime)s:字符串形式的当前时间。默认格式是 “2016-06-06
    16:49:45,896”。逗号后面的是毫秒;
    %(thread)d:线程ID。可能没有;
    %(threadName)s:线程名。可能没有;
    %(process)d:进程ID。可能没有;
    %(message)s:用户输出的消息;
     
    2、基础知识
    (1)root log是所有日志实例的祖先
    (2)其他的日志实例通过logging.getLogger('logname')来获取实例
    (3)子节点会继承root log 的所有属性
    (4)日志具有传递性,在子节点上写的日志,会继承父节点的日志handler,并处理。
    (5)对于一个logger,可以设置fileHandler和streamhandler
    FileHandler:用于写入日志文件
    StreamHander:用于输出到控制台
    (6)对于一个logger,可以设置Formatter(输出的格式)
    logging.Filter(name) 过滤出需要的日志,使用率比较低
     
    root Logger的子孙logger的消息不仅会发送给他们自己的handler处理,还会发送给其所有的祖
    先处理。
     
    log1=logging.getLogger('log1') 如果没有名字,默认为root
    log1.setLevel(logging.INFO)
     
    fh=logging.FileHandler('path')
    sh=logging.StreamHandler()
    fmt=logging.Formatter('%(asctime)s|%(name)s|%(filename)s|%(levelname)s|%(message)s')
    fh.setFormatter(fmt)
    sh.setFormatter(fmt)
    log1.addHandler(fh)
    log1.addHandler(sh)
     
    log2=logging.getLogger('log1.log2') log1是log2的父节点
    log2.info('log2 info msg')
    log1.info('handler log test')
    root默认有streamhandler,
     
    3、root log 是全局唯一的
    对root log进行配置的时候(使用logging.basicConfig来配置),后面的配置会覆盖前面的
    只用root log的弊端
    (1)FileHandle 和 StreamHandle不能并存,使用不方便
    filename='path' #FileHandle
    stream=sys.stdout #StreamHandle 输入到控制台
    (2)不能配置多个FileHandle
     
    4、日志自动分文档存储
    import logging
    import logging.handlers
     
    rootLog=logging.getLogger()
    rootLog.setLevel(logging.DEBUG)
    fh=logging.handlers.RotatingFileHandler('path',maxBytes=512,backupCount=3)
    maxBytes:每个日志最大的存储空间
    backupCount:可以备份三个日志
    fmt=fh.setFormatter(fmt)
    rootLog.addHandler(fh)
    for i in xrange(10000):
    rootLog.info('info log')
     
    5、日志操作:logging模块提供的日志处理组件
    (1)Logger :提供应用程序可直接使用的接口
    (2)Handler :发送日志到适当的目的地
    (3)Filter :提供了过滤日志信息的方法
    logging.Filter('name')
    把log为name的实例和该实例下的所有子实例的log显示出来
    (4)Formatter :指定日志显示格式
  • 相关阅读:
    2019 SDN上机第2次作业
    2019 SDN上机第1次作业
    第07组 团队Git现场编程实战
    第二次结对编程作业
    c语言之问题集
    2019春第2次课程设计实验安排
    2019年十二周总结
    第十一周总结
    第十周作业
    第九周总结
  • 原文地址:https://www.cnblogs.com/emily-qin/p/8024343.html
Copyright © 2020-2023  润新知