zoukankan      html  css  js  c++  java
  • python中logging的常用方法

    logging常用

    # -*- coding:utf-8 -*-
    __author__ = "lgj"
    
    import os
    import sys
    import time
    import logging
    from logging.handlers import TimedRotatingFileHandler
    from instance.test import LOG_LEVEL,LOG_NAME
    
    set_level = getattr(logging, LOG_LEVEL.upper(), None)
    if not isinstance(set_level, int):
        raise ValueError('Invalid log level:%s' % LOG_LEVEL)
    
    # 获取logger实例,如果参数为空则返回root logger,不同模块最好使用不同实例名字
    logger = logging.getLogger("camel")
    
    # 指定日志的最低输出级别,默认为WARN级别
    logger.setLevel(LOG_LEVEL)
    
    # 指定logger输出格式
    formatter = logging.Formatter(
        '%(asctime)s %(filename)s [line:%(lineno)d] %(funcName)s %(levelname)s %(message)s %(process)d ')
    
    # 文件日志
    log_path = os.path.realpath(os.getcwd()) + '/log/'
    file_handler = logging.FileHandler(log_path + LOG_NAME + ".log")
    file_handler.setFormatter(formatter)  # 可以通过setFormatter指定输出格式
    
    # 控制台日志
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.formatter = formatter  # 也可以直接给formatter赋值
    
    # 日志轮转--与file_handler同时存在时会造成日志重复打印--具体详情见下面日志重复问题
    timeRotatingHandler = TimedRotatingFileHandler(log_path + '%s.log' % (LOG_NAME), when='midnight')
    timeRotatingHandler.setFormatter(formatter)
    timeRotatingHandler.suffix = "_%Y%m%d.log"
    
    
    # 为logger添加的日志处理器
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)
    logger.addHandler(timeRotatingHandler)
    
    # 输出不同级别的log
    logger.debug('this is debug info')
    logger.info('this is information')
    logger.warn('this is warning message')
    logger.error('this is error message')
    logger.fatal('this is fatal message, it is same as logger.critical')
    logger.critical('this is critical message')
    
    

    日志轮转的两种方式

    # myapp的初始化工作
    logger = logging.getLogger('myapp')
    logger.setLevel(logging.INFO)
    
    
    1、使用TimedRotatingFileHandler
    # 定义一个1秒换一次log文件的handler ,保留3个旧log文件
    rotating_handler = logging.handlers.TimedRotatingFileHandler("log/myapp.log", when='S', interval=1, backupCount=3)
    # 设置后缀名称,跟strftime的格式一样
    rotating_handler.suffix = "%Y-%m-%d_%H-%M-%S.log"
    logger.addHandler(rotating_handler)
    
    # 经测试, 并有效果轮转了但保留文件数有问题
    # 注意:filehanlder.suffix的格式必须这么写,才能自动删除旧文件,如果设定是天,就必须写成“%Y-%m-%d.log”,写成其他格式会导致删除旧文件不生效,这个配置在源码里能看出来。
    while True:
        time.sleep(1)
        logger.info("test")
    
    
    2、使用RotatingFileHandler
    
    # 写入文件,如果文件超过100个Bytes,仅保留5个文件。
    handler = logging.handlers.RotatingFileHandler(
        'log/myapp.log', maxBytes=100, backupCount=5)
    logger.addHandler(handler)
    
    # 效果很好
    while True:
        time.sleep(0.01)
        logger.info("file test")
    
    
    
    TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
    filename 是输出日志文件名的前缀,比如log/myapp.log
    when 是一个字符串的定义如下:
    “S”: Seconds
    “M”: Minutes
    “H”: Hours
    “D”: Days
    “W”: Week day (0=Monday)
    “midnight”: Roll over at midnight
    interval 是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以有些情况suffix要定义的不能因为when而重复。
    backupCount 是保留日志个数。默认的0是不会自动删除掉日志。若设3,则在文件的创建过程中库会判断是否有超过这个3,若超过,则会从最先创建的开始删除。
    
    注意:filehanlder.suffix的格式必须这么写,才能自动删除旧文件,如果设定是天,就必须写成“%Y-%m-%d.log”,写成其他格式会导致删除旧文件不生效。这个配置在源码里能看出来
    
    

    日志重复输出的坑

    你有可能会看到你打的日志会重复显示多次,可能的原因有很多,但总结下来就一个原因,日志中使用了重复的handler或者handler输出的文件重复了(如TimedRotatingFileHandler、RotatingFileHandler与FileHandler输出的文件相同时)。
    可以参考 http://python.jobbole.com/86887/ 的解释。
    

    参考:

  • 相关阅读:
    sqlserver添加表、字段注释
    SQL语句增加字段、修改字段、修改类型、修改默认值
    端口概念
    删除数据库数据
    转移数据库表数据
    优化网站
    提高SQL查询效率
    相关方法扩展
    SQL空和NULL的区别
    C#分布式缓存Couchbase使用
  • 原文地址:https://www.cnblogs.com/lgjbky/p/9449469.html
Copyright © 2011-2022 走看看