zoukankan      html  css  js  c++  java
  • logger5步走

    https://www.cnblogs.com/GGGGGGZX/p/9114378.html
    '''
    打印日志11/26/2017 10:44:21 PM bug 24 并写入文件example.log中 (编程)'''

    import logging


    def log_fun(name):
    # 创建一个logger
    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)

    # 创建一个handler,用于写入日志文件
    fh = logging.FileHandler('example.log')
    fh.setLevel(logging.DEBUG)

    # 再创建一个handler,用于输出到控制台
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)

    # 定义handler的输出格式
    # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    # formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S') # [2018-05-29 23:34:29] [INFO] 123456
    formatter = logging.Formatter('[%(asctime)s] %(name)s %(message)s', '%Y-%m-%d %p %I:%M:%S') # [2018-05-29 23:34:29] [INFO] 123456
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)

    # 给logger添加handler
    logger.addHandler(fh)
    logger.addHandler(ch)
    return logger


    logger = log_fun('bug')
    logger.info('24')

    讲解:
    logging.getLogger([name])

      返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例。

    
    

      Logger.setLevel(lvl)

    
    

      设置logger的level, level有以下几个级别:

        

      级别高低顺序:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL

    
    

      如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出  

    
    
    1     logger.debug("foobar")    # 不输出   
    2     logger.info("foobar")        # 输出  
    3     logger.warning("foobar")  # 输出  
    4     logger.error("foobar")      # 输出  
    5     logger.critical("foobar")    # 输出  
    
    

      Logger.addHandler(hdlr)

    
    

      通过handler对象可以把日志内容写到不同的地方。比如简单的StreamHandler就是把日志写到类似文件的地方。python提供了十几种实用handler,比较常用有:

    
    
    1 StreamHandler: 输出到控制台
    2 FileHandler:   输出到文件
    3 BaseRotatingHandler 可以按时间写入到不同的日志中。比如将日志按天写入不同的日期结尾的文件文件。
    4 SocketHandler 用TCP网络连接写LOG
    5 DatagramHandler 用UDP网络连接写LOG
    6 SMTPHandler 把LOG写成EMAIL邮寄出去
    
    

      logging.basicConfig([**kwargs])* 这个函数用来配置root logger, 为root logger创建一个StreamHandler,设置默认的格式。* 这些函数: logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical() 如果调用的时候发现root logger没有任何handler,会自动调用basicConfig添加一个handler* 如果root logger已有handler,这个函数不做任何事情使用basicConfig来配置root logger的输出格式和level:

    
    
    1 import logging
    2 logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
    3 logging.debug('This message should appear on the console')
    
    
    
    
    

      logger对象直接提供日志接口。formatter描述日志的格式。handler把日志写到不同的地方,你可以把日志保存成本地文件,也可以每个小时写一个日志文件,还可以把日志通过socket传到别的机器上。

    
    

      从最简单的formatter对象来看。formatter指定的是每一条日志记录的抬头信息,也就是你可以指定日志记录的时间格式、进程号、文件名、函数名等信息。可以用这个方法来创建一个formatter对象:

    
    
    logging.Formatter.__init__( fmt=None, datefmt=None)
    
    

      fmt参数指定进程号、文件名、函数名等信息是否出现以及格式, datefmt为日期时间格式,默认的日期格式精确到微秒,例如‘2003-07-08 16:49:45,896’。fmt中可以指定多个字段,每个字段的格式为“%(<dictionary key>)s”, 例如你想打印时间、日志级别、日志信息可以用下面的format:

    
    
    '%(asctime)s - %(levelname)s - %(message)s'


    参考:
    https://www.cnblogs.com/fmgao-technology/p/9108610.html
    https://www.cnblogs.com/fmgao-technology/p/9090951.html

  • 相关阅读:
    leetcode-654-最大二叉树
    leetcode-46-全排列
    图片懒加载?
    HTTP常见的状态码?
    线程与进程的区别?
    网页从输入网址到渲染完成经历了哪些过程?
    网页前端性能优化的方式有哪些?
    常见的浏览器内核有哪些?
    汇编语言--cpu的工作原理(寄存器)--手稿
    对于 vue3.0 特性你有什么了解的吗?
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/9108620.html
Copyright © 2011-2022 走看看