zoukankan      html  css  js  c++  java
  • 【模块】:logging日志

    logging模块 

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug、info、warning、error、critical 5个级别,下面我们看一下怎么用。默认情况下日志级别为warning,只有大于warning的日志才会打印。

    模块初识:

    #logging初识
    
    import logging
    
    logging.warning("user [James] attempted wrong password more than 3 times")
    logging.critical("server is down")
    
    # WARNING:root:user [James] attempted wrong password more than 3 times
    # CRITICAL:root:server is down

    上面的代码是最简单的方式,括号里的内容为打印的信息,logging.后的方法为日志的级别,下面看看logging五个级别的详细信息

    如果想把日志写到文件里,也很简单:

    #日志打印到文件中
    
    import  logging
    
    logging.basicConfig(filename="example.log",level=logging.INFO,
                        format="%(asctime)s  [%(filename)s:%(lineno)d] %(message)s", datefmt="%m/%d/%Y %H:%M:%S [%A]")
                                                                    # H 24小时格式  I 12小时格式  A 周几完整  a 周几简写  p AM/PM
    
    logging.debug("This message should go to the log file")
    logging.info("So should this")
    logging.warning("And this ,too")

    logging.basicConfig里定义了输入文件路径,输入日志信息的级别,输入的格式,格式可自定义;执行完代码后example.log文件会生成信息如下:

    10/31/2016 17:16:17 [Monday] So should this
    10/31/2016 17:16:17 [Monday] And this ,too
    

    其中下面这句中的level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了

    如果想同时把log打印在屏幕和文件日志里,就需要了解一点复杂的知识了:

    The logging library takes a modular approach and offers several categories of components: loggers, handlers, filters, and formatters.

    • Loggers expose the interface that application code directly uses.
    • Handlers send the log records (created by loggers) to the appropriate destination.
    • Filters provide a finer grained facility for determining which log records to output.
    • Formatters specify the layout of log records in the final output.
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    #-Author-Lian
    
    import  logging
    
    #创建logger
    logger = logging.getLogger("test_log")  #创建logger对象   括号内容随便写
    logger.setLevel(logging.INFO)       #全局日志级别
    
    
    ch = logging.StreamHandler()        #日志打印到屏幕上
    ch.setLevel(logging.DEBUG)          #指定ch日志打印级别
    
    fh = logging.FileHandler("access.log")      #日志存进文件
    fh.setLevel(logging.WARNING)            #指定fh日志输入级别
    
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")   #定义日志格式,可写多个
    
    #添加日志格式到ch,fh
    ch.setFormatter(formatter)
    fh.setFormatter(formatter)
    
    #添加ch,fh到logger中
    logger.addHandler(ch)
    logger.addHandler(fh)
    
    
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    

    全局日志级别为整个程序的底线,局部日志级别要想打印则不能比这个级别再低了

    屏幕打印信息:

    2016-10-31 17:23:42,988 - test_log - INFO - info message
    2016-10-31 17:23:42,988 - test_log - WARNING - warn message
    2016-10-31 17:23:42,988 - test_log - ERROR - error message
    2016-10-31 17:23:42,988 - test_log - CRITICAL - critical message
    

    access.log:

    2016-10-31 17:02:06,223 - test_log - WARNING - warn message
    2016-10-31 17:02:06,224 - test_log - ERROR - error message
    2016-10-31 17:02:06,224 - test_log - CRITICAL - critical message
    

    日志所有的格式:

    重要的几个格式:%(lineno)d 输出打印日志代码行 ,%(process)d输出打印日志的进程ID ,%(thread)d输出打印日志的线程ID

    日志实例:http://www.cnblogs.com/lianzhilei/p/6513230.html

    生产应用(屏幕打印,日志文件写入):

    import logging
    from logging.handlers import RotatingFileHandler
    
    handler = RotatingFileHandler('test.log', maxBytes=20*1024*1024, backupCount=200,encoding='utf-8')
    handler.setLevel(logging.INFO)
    formatter = logging.Formatter('[%(asctime)s] [%(filename)s:%(lineno)d] %(levelname)s %(message)s')
    handler.setFormatter(formatter)
    logging.basicConfig(datefmt='%Y-%m-%d %H:%M:%S', level=logging.DEBUG)
    logger = logging.getLogger()
    logger.addHandler(handler)
    
    
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    

    生产应用(多进程下日志记录)

    from cloghandler import ConcurrentRotatingFileHandler
    
    rotateHandler = ConcurrentRotatingFileHandler(logConfig['filePath'], "a", 20 * 1024 * 1024, 200)
    rotateHandler.setLevel(logging.INFO)
    formatter = logging.Formatter('[%(asctime)s] [process:%(process)s] [%(filename)s:%(lineno)d]  %(levelname)s %(message)s')
    rotateHandler.setFormatter(formatter)
    log = logging.getLogger()
    log.addHandler(rotateHandler)
    log.setLevel(logging.INFO)

    模块安装:

    pip install ConcurrentLogHandler
    

     

    import logging
    
    try:
        11 +a
    except Exception as e:
        # logging.error("user [James] attempted wrong password more than 3 times")
        logging.error("user [James] attempted wrong password more than 3 times",exc_info=True)
        
    
    # ERROR:root:user [James] attempted wrong password more than 3 times
    # Traceback (most recent call last):
    #   File "Z:/workbanch/move_file.py", line 10, in <module>
    #     11 +a
    # NameError: name 'a' is not defined
    

      

  • 相关阅读:
    MAC OS下安装Minizip
    MAC OS下安装pkg_config
    计算机图形学-几何变换
    计算机图形学-图形系统
    Unix&Linux大学教程 读书笔记【1-3章】
    Mixins 混入选项操作
    watch监控,对比新值和旧值做出相应判断
    用.native修饰器来对外部组件进行构造器内部方法的调用以及用原生js获取构造器里的方法
    methods 方法选项
    computed 计算选项
  • 原文地址:https://www.cnblogs.com/lianzhilei/p/6016543.html
Copyright © 2011-2022 走看看