相关文章推荐
沉着的大白菜  ·  小米生态链赋能:华米纽交所上市,市值6.56亿美金·  11 月前    · 
失恋的柿子  ·  关于全省人社系统集中接访的公告_通知公告_县 ...·  1 年前    · 
怕老婆的帽子  ·  上市公司频频亮牌“硬科技” ...·  2 年前    · 
睿智的海龟  ·  鸿翔前宸府售楼处电话【2022官网首页】鸿翔 ...·  2 年前    · 
果断的火腿肠  ·  人物--艺术--中国作家网·  2 年前    · 
Code  ›  python logging日志处理详解-天翼云
handler 运营商 天翼云 天翼
https://www.ctyun.cn/zhishi/p-171189
睡不着的毛衣
2 年前

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 2023全民上云节 NEW S6通用型云主机,新用户享1.8折!
  • 新客特惠 NEW 全场热销云主机1.5折起!
  • 算力套餐 NEW 让算力触手可及
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 中小企业上云场景组合购 NEW 建站、域名等场景一站式购齐,组合购9元起!
  • 天翼云电脑专场 HOT 移动办公神器天翼云电脑4核8G畅享3个月只要130元起!
  • 云主机特惠 HOT 多款云主机新老同享,满足您的上云需求!
免费活动
  • 企业免费试用专区 HOT 数十款产品免费试用,完成企业实名认证领取2000元试用金!
  • 个人免费试用专区 HOT 完成个人实名认证即可获得1000元试用金!
  • 新客特惠 全场云主机1.5折起
  • 云上安全专场 安全产品全场6折起!

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务。
进入甄选商城 进入云市场
办公协同
  • WPS云文档天翼云版 翼企云( License版) 天翼云企业云盘(标准服务版) 蓝信安全移动工作平台(SAAS) SSL证书 新域名服务 税务风控云 商企云财税(SAAS版) 翼云加速-标准版包月套餐 天翼云管家2.0 天翼云管家 翼备份(SaaS版)300G 智慧工厂_生产流程管理解决方案 天翼智慧工地 天翼全栈混合云敏捷版(软件) 天翼全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云技术合作伙伴
  • 天翼云OpenAPI中心 天翼云诸葛AI平台 天翼云EasyCoding平台
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云培训认证
  • 天翼云学堂 天翼云市场商学院
天翼云服务合作伙伴
  • 天翼云MSP合作伙伴
天翼云合作计划
  • 央企云合作计划
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴 天翼云甄选商城合作伙伴
天翼云东升计划
  • 东升适配创新中心 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
资源与工具
  • 天翼云OpenAPI EasyCoding敏捷开发平台 AI创作间
培训与认证
  • 天翼云学堂 天翼云认证

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • OpenAPI中心 客户支持计划

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云 天翼云4.0 天翼云APP 全球基础设施 分析师和白皮书 天翼云·创新直播间 2023云生态大会 2022云生态大会 天翼云中国行 支持与服务 了解天翼云
  • 站点切换
    • 中国站
  • 文档
  • 控制中心
  • 备案
  • 管理中心

python logging日志处理详解

首页 知识中心 服务器 文章详情页

python logging日志处理详解

2023-04-23 09:32:49 阅读次数:87

python, 日志

python 模块 logging日志处理

在 Python 中有一个标准的 logging 模块,我们可以使用它来进行标注的日志记录,利用它我们可以更方便地进行日志记录,同时还可以做更方便的级别区分以及一些额外日志信息的记录,如时间、运行模块信息等。

1.1 架构

整个日志记录的框架可以分为这么几个部分:

  • Logger 记录器,暴露了应用程序代码能直接使用的接口。
  • Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地。
  • Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
  • Formatter 格式化器,指明了最终输出中日志记录的布局。
  • 1.1.1 Logger 记录器

    Logger是一个树形层级结构,在使用接口 debug,info,warn,error,critical 之前必须创建Logger实例,即创建一个记录器,如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别(WARN),处理器Handler(StreamHandler,即将日志信息打印输出在标准输出上),和格式化器Formatter(默认的格式即为第一个简单使用程序中输出的格式)。

    创建方法:

    logger = logging.getLogger(logger_name)
    

    创建Logger实例后,可以使用以下方法进行日志级别设置,增加处理器Handler。

    logger.setLevel(logging.ERROR)    #设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出
    logger.addHandler(handler_name) # 为Logger实例增加一个处理器
    logger.removeHandler(handler_name) # 为Logger实例删除一个处理器
    

    1.1.2 Handler 处理器

    Handler处理器类型有很多种,比较常用的有三个,StreamHandler,FileHandler,NullHandler。
    创建StreamHandler之后,可以通过使用以下方法设置日志级别,设置格式化器Formatter,增加或删除过滤器Filter。

    ch.setLevel(logging.WARN)     #指定日志级别,低于WARN级别的日志将被忽略
    ch.setFormatter(formatter_name)   #设置一个格式化器formatter
    ch.addFilter(filter_name)    #增加一个过滤器,可以增加多个
    ch.removeFilter(filter_name)   #删除一个过滤器
    

    StreamHandler
    创建方法:

    sh = logging.StreamHandler(stream=None)
    

    FileHandler
    创建方法:

    fh = logging.FileHandler(filename, mode='a', encoding=None
    
    
    
    
        
    , delay=False)
    

    NullHandler
    NullHandler类位于核心logging包,不做任何的格式化或者输出。
    本质上它是个“什么都不做”的handler,由库开发者使用。
    logging 模块提供的 全部Handler 有:

    StreamHandler:logging.StreamHandler;  日志输出到流,可以是 sys.stderr,sys.stdout 或者文件。
    FileHandler:logging.FileHandler;    日志输出到文件。
    BaseRotatingHandler:logging.handlers.BaseRotatingHandler; 基本的日志回滚方式。
    RotatingHandler:logging.handlers.RotatingHandler;日志回滚方式,支持日志文件最大数量和日志文件回滚。
    TimeRotatingHandler:logging.handlers.TimeRotatingHandler;日志回滚方式,在一定时间区域内回滚日志文件。
    SocketHandler:logging.handlers.SocketHandler;远程输出日志到TCP/IP sockets。
    DatagramHandler:logging.handlers.DatagramHandler;远程输出日志到UDP sockets。
    SMTPHandler:logging.handlers.SMTPHandler;远程输出日志到邮件地址。
    SysLogHandler:logging.handlers.SysLogHandler;日志输出到syslog。
    NTEventLogHandler:logging.handlers.NTEventLogHandler;远程输出日志到Windows NT/2000/XP的事件日志。
    MemoryHandler:logging.handlers.MemoryHandler;日志输出到内存中的指定buffer。
    HTTPHandler:logging.handlers.HTTPHandler;通过”GET”或者”POST”远程输出到HTTP服务器。
    

    1.1.3 Formatter 格式化器

    使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。

    创建方法:

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

    其中,fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用’%(message)s’。如果不指明datefmt,将使用ISO8601日期格式。

    1.1.4 Filter 过滤器

    Handlers和Loggers可以使用Filters来完成比级别更复杂的过滤。Filter基类只允许特定Logger层次以下的事件。例如用‘A.B’初始化的Filter允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’等记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。 如果用空字符串来初始化,所有的事件都接受。

    创建方法:

     filter = logging.Filter(name='')
    

    熟悉了这些概念之后,有另外一个比较重要的事情必须清楚,即Logger是一个树形层级结构;
    Logger可以包含一个或多个Handler和Filter,即Logger与Handler或Fitler是一对多的关系;
    一个Logger实例可以新增多个Handler,一个Handler可以新增多个格式化器或多个过滤器,而且日志级别将会继承。

    2. 优点

    总的来说 logging 模块相比 print 有这么几个优点:

  • 可以在 logging 模块中设置日志等级,在不同的版本(如开发环境、生产环境)上通过设置不同的输出等级来记录对应的日志,非常灵活。
  • print 的输出信息都会输出到标准输出流中,而 logging 模块就更加灵活,可以设置输出到任意位置,如写入文件、写入远程服务器等。
  • logging 模块具有灵活的配置和格式化功能,如配置输出当前模块信息、运行时间等,相比 print 的字符串格式化更加方便易用。
  • 3. 用法

    3.1 默认输出

    高于WARNING的日志信息才会输出

    $ cat log1.py 
    import logging
    logging.basicConfig()
    logging.debug('This is a debug message')
    logging.info('This is an info message')
    logging.warning('This is a warning message')
    logging.error('This is an error message')
    logging.critical('This is a critical message')
    
    $ python log1.py 
    WARNING:root:This is a warning message
    ERROR:root:This is an error message
    CRITICAL:root:This is a critical message
    

    3.2 日志配置格式输出

  • 显式创建记录器Logger、处理器Handler和格式化器Formatter,并进行相关设置;
  • 通过简单方式进行配置,使用basicConfig()函数直接进行配置;
  • 通过配置文件进行配置,使用fileConfig()函数读取配置文件;
  • 通过配置字典进行配置,使用dictConfig()函数读取配置信息;
  • 通过网络进行配置,使用listen()函数进行网络配置。
  • basicConfig关键字参数

    关键字	描述
    filename	创建一个FileHandler,使用指定的文件名,而不是使用StreamHandler。
    filemode	如果指明了文件名,指明打开文件的模式(如果没有指明filemode,默认为'a')。
    format	handler使用指明的格式化字符串。
    datefmt	使用指明的日期/时间格式。
    level	指明根logger的级别。
    stream	使用指明的流来初始化StreamHandler。该参数与'filename'不兼容,如果两个都有,'stream'被忽略。
    

    format格式

    格式	描述
    %(levelno)s	打印日志级别的数值
    %(levelname)s	打印日志级别名称
    %(pathname)s	打印当前执行程序的路径
    %(filename)s	打印当前执行程序名称
    %(funcName)s	打印日志的当前函数
    %(lineno)d	打印日志的当前行号
    %(asctime)s	打印日志的时间
    %(thread)d	打印线程id
    %(threadName)s	打印线程名称
    %(process)d	打印进程ID
    %(message)s	打印日志信息
    

    3.2.1 配置输出级别并指定到文件

    $ cat log2.py 
    #!/usr/local/bin/python
    # -*- coding:utf-8 -*-
    import logging
    # 通过下面的方式进行简单配置输出方式与日志级别
    logging.basicConfig(filename='logger.log', level=logging.INFO)
    logging.debug('debug message')
    logging.info('info message')
    logging.warn('warn message')
    logging.error('error message')
    logging.critical('critical message')
    
    $ python log2.py
    $ cat logger.log
    INFO:root:info message  #info级别也能输出
    WARNING:root:warn message
    ERROR:root:error message
    CRITICAL:root:critical message
    

    3.2.2 声明了一个 Logger 对象,它就是日志输出的主类

    $ cat log3.py 
    #!/usr/local/bin/python
    # -*- coding:utf-8 -*-
    import logging
    # 通过下面的方式进行简单配置输出方式与日志级别
    logging.basicConfig(filename='logger.log', level=logging.INFO)
    logger = logging.getLogger(__name__)
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    
    $ python log3.py
    $ cat logger.log 
    INFO:__main__:info message
    WARNING:__main__:warn message
    ERROR:__main__:error message
    CRITICAL:__main__:critical message
    

    3.2.3 格式化输出

    $ cat log4.py 
    import logging
    logging.basicConfig(filename="logger.log", filemode="w", format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="%d-%M-%Y %H:%M:%S", level=logging.DEBUG)
    logger = logging.getLogger(__name__)
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    
    $ python log4.py
    $ cat logger.log 
    17-49-2020 13:49:16 __main__:DEBUG:debug message
    17-49-2020 13:49:16 __main__:INFO:info message
    17-49-2020 13:49:16 __main__:WARNING:warn message
    17-49-2020 13:49:16 __main__:ERROR:error message
    17-49-2020 13:49:16 __main__:CRITICAL:critical message
    

    3.3 Handler配置

    3.3.1 handler配置格式输出

    $ cat log5.py 
    import logging
    logger = logging.getLogger(__name__)
    logger.setLevel(level=logging.INFO)
    handler = logging.FileHandler('output.log')
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.info('This is a log info')
    logger.debug('Debugging')
    logger.warning('Warning exists')
    logger.info('Finish')
    

    没有再使用 basicConfig 全局配置,而是先声明了一个 Logger 对象,然后指定了其对应的 Handler 为 FileHandler 对象,然后 Handler 对象还单独指定了 Formatter 对象单独配置输出格式,最后给 Logger 对象添加对应的 Handler 即可,最后可以发现日志就会被输出到 output.log 中.

    $ python log5.
    
    
    
    
        
    py 
    $ cat output.log 
    2020-05-17 13:58:41,039 - __main__ - INFO - This is a log info
    2020-05-17 13:58:41,039 - __main__ - WARNING - Warning exists
    2020-05-17 13:58:41,039 - __main__ - INFO - Finish
    2020-05-17 14:01:15,909 - __main__ - INFO - This is a log info
    2020-05-17 14:01:15,909 - __main__ - WARNING - Warning exists
    2020-05-17 14:01:15,909 - __main__ - INFO - Finish
    

    3.3.2 多种handle输出

    $ cat log6.py 
    import logging
    from logging.handlers import HTTPHandler
    import sys
    logger = logging.getLogger(__name__)
    logger.setLevel(level=logging.DEBUG)
    # StreamHandler
    stream_handler = logging.StreamHandler(sys.stdout)
    stream_handler.setLevel(level=logging.DEBUG)
    logger.addHandler(stream_handler)
    # FileHandler
    file_handler = logging.FileHandler('output.log')
    file_handler.setLevel(level=logging.INFO)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    # HTTPHandler
    http_handler = HTTPHandler(host='localhost:80', url='log', method='POST')
    logger.addHandler(http_handler)
    # Log
    logger.info('This is a log info')
    logger.debug('Debugging')
    logger.warning('Warning exists')
    logger.info('Finish')
    
    $ python log6.py
    This is a log info
    Debugging
    Warning exists
    Finish
    $ cat output.log
    2020-05-17 14:05:48,809 - __main__ - INFO - This is a log info
    2020-05-17 14:05:48,849 - __main__ - WARNING - Warning exists
    2020-05-17 14:05:48,851 - __main__ - INFO - Finish
    

    3.4 捕获 Traceback

    $ cat log7.py
    import logging
    logger = logging.getLogger(__name__)
    logger.setLevel(level=logging.DEBUG)
    # Formatter
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    # FileHandler
    file_handler = logging.FileHandler('result.log')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    # StreamHandler
    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
    # Log
    logger.info('Start')
    logger.warning('Something maybe fail.')
    try:
        result = 10 / 0
    except Exception:
        logger.error('Faild to get result', exc_info=True)
        #logger.error('Faild to get result')
    logger.info('Finished')
    

    在 error() 方法中添加了一个参数,将 exc_info 设置为了 True,这样我们就可以输出执行过程中的信息了,即完整的 Traceback 信息。

    $ python log7.py
    2020-05-17 14:13:02,217 - __main__ - INFO - Start
    2020-05-17 14:13:02,217 - __main__ - WARNING - Something maybe fail.
    2020-05-17 14:13:02,217 - __main__ - ERROR - Faild to get result
    Traceback (most recent call last):
      File "log7.py", line 23, in <module>
        result = 10 / 0
    ZeroDivisionError: integer division or modulo by zero
    2020-05-17 14:13:02,217 - __main__ - INFO - Finished
    

    3.5 配置共享

    在写项目的时候,我们肯定会将许多配置放置在许多模块下面,这时如果我们每个文件都来配置 logging 配置那就太繁琐了,logging 模块提供了父子模块共享配置的机制,会根据 Logger 的名称来自动加载父模块的配置。

    $ vim main.py
    import logging
    import core
    logger = logging.getLogger('main')
    logger.setLevel(level=logging.DEBUG)
    # Handler
    handler = logging.FileHandler('result.log')
    handler.setLevel(logging.INFO)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.info('Main Info')
    logger.debug('Main Debug')
    logger.error('Main Error')
    core.run()
    

    这里我们配置了日志的输出格式和文件路径,同时定义了 Logger 的名称为 main,然后引入了另外一个模块 core,最后调用了 core 的 run() 方法。

    $ vim core.py
    import logging
    logger = logging.getLogger('main.core')
    def run():
        logger.info('Core Info')
        logger.debug('Core Debug')
        logger.error('Core Error')
    

    这里我们定义了 Logger 的名称为 main.core,注意这里开头是 main,即刚才我们在 main.py 里面的 Logger 的名称,这样 core.py 里面的 Logger 就会复用 main.py 里面的 Logger 配置,而不用再去配置一次了.

    $ python main.
    
    
    
    
        
    py
    $ cat result.log 
    2020-05-17 14:30:48,559 - main - INFO - Main Info
    2020-05-17 14:30:48,559 - main - ERROR - Main Error
    2020-05-17 14:30:48,559 - main.core - INFO - Core Info
    2020-05-17 14:30:48,559 - main.core - ERROR - Core Error
    

    3.6 文件配置

    常见的配置文件有 ini 格式、yaml 格式、JSON 格式,这里以yaml为例。将配置写入到配置文件,然后运行时读取配置文件里面的配置,这样是更方便管理和维护.

    3.6.1 yaml配置文件

    $ vim config.yaml
    version: 1
    formatters:
      brief:
        format: "%(asctime)s - %(message)s"
      simple:
        format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    handlers:
      console:
        class : logging.StreamHandler
        formatter: brief
        level   : INFO
        stream  : ext://sys.stdout
      file:
        class : logging.FileHandler
        formatter: simple
        level: DEBUG
        filename: debug.log
      error:
        class: logging.handlers.RotatingFileHandler
        level: ERROR
        formatter: simple
        filename: error.log
        maxBytes: 10485760
        backupCount: 20
        encoding: utf8
    loggers:
      main.core:
        level: DEBUG
        handlers: [console, file, error]
    root:
      level: DEBUG
      handlers: [console]
    

    这里我们定义了 formatters、handlers、loggers、root 等模块,实际上对应的就是各个 Formatter、Handler、Logger 的配置,参数和它们的构造方法都是相同的。
    定义一个主入口文件,main.py.

    $ vim main.py
    import logging
    import core
    import yaml
    import logging.config
    import os
    import io 
    def setup_logging(default_path='config.yaml', default_level=logging.INFO):
        path = default_path
        if os.path.exists(path):
            with io.open(path, 'r', encoding='utf-8') as f:
                config = yaml.load(f)
                logging.config.dictConfig(config)
        else:
            logging.basicConfig(level=default_level)
    def log():
        logging.debug('Start')
        logging.info('Exec')
        logging.info('Finished')
    if __name__ == '__main__':
        yaml_path = 'config.yaml'
        setup_logging(yaml_path)
        log()
        core.run()
    

    这里我们定义了一个 setup_logging() 方法,里面读取了 yaml 文件的配置,然后通过 dictConfig() 方法将配置项传给了 logging 模块进行全局初始化。

    另外这个模块还引入了另外一个模块 core,所以我们定义 core.py 如下:

    import logging
    logger = logging.getLogger('main.core')
    def run():
        logger.info('Core Info')
        logger.debug('Core Debug')
        logger.error('Core Error')
    
    $ python main.py 
    2020-05-17 14:47:09,905 - Exec
    2020-05-17 14:47:09,905 - Finished
    2020-05-17 14:47:09,905 - Core Info
    2020-05-17 14:47:09,905 - Core Info
    2020-05-17 14:47:09,905 - Core Error
    2020-05-17 14:47:09,905 - Core Error
    $ cat  error.log 
    2020-05-17 14:47:09,905 - main.core - ERROR - Core Error
    $  cat debug.log 
    2020-05-17 14:47:09,905 - main.core - INFO - Core Info
    2020-05-17 14:47:09,905 - main.core - DEBUG - Core Debug
    2020-05-17 14:47:09,905 - main.core - ERROR - Core Error
    

    3.6.2 ini配置文件

    下面只展示了 ini 格式和 yaml 格式的配置。

    test.ini 文件
    [loggers]
    keys=root,sampleLogger
    [handlers]
    keys=consoleHandler
    [formatters]
    keys=sampleFormatter
    [logger_root]
    level=DEBUG
    handlers=consoleHandler
    [logger_sampleLogger]
    level=DEBUG
    handlers=consoleHandler
    qualname=sampleLogger
    propagate=0
    [handler_consoleHandler]
    class=StreamHandler
    level=DEBUG
    formatter=sampleFormatter
    args=(sys.stdout,)
    [formatter_sampleFormatter]
    format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
    

    testinit.py 文件

    import logging.config
    logging.config.fileConfig(fname='test.ini', disable_existing_loggers=False)
    logger = logging.getLogger("sampleLogger")
    logger.info('Core Info')
    logger.debug('Core Debug')
    logger.error('Core Error')
    
    $ python test.py 
    2020-05-17 15:07:47,328 - sampleLogger - INFO - Core Info
    2020-05-17 15:07:47,328 - sampleLogger - DEBUG - Core Debug
    2020-05-17 15:07:47,328 -
    
    
    
    
        
     sampleLogger - ERROR - Core Error
    

    3.7 字符串拼接

    format() 构造与占位符用%

    $ log8.py
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    # bad
    logging.debug('Hello {0}, {1}!'.format('World', 'Congratulations'))
    # good
    logging.debug('Hello %s, %s!', 'World', 'Congratulations')
    

    运行结果如下:

    $ python log8.py 
    2020-05-17 14:55:29,709 - root - DEBUG - Hello World, Congratulations!
    2020-05-17 14:55:29,709 - root - DEBUG - Hello World, Congratulations!
    

    3.8 异常处理

    $ cat log9.py
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    try:
        result = 5 / 0
    except Exception as e:
        # bad
        logging.error('Error: %s', e)
        # good
        logging.error('Error', exc_info=True)
        # good
        logging.exception('Error')
    

    结果输出:

    $ python log9.py
    2020-05-17 14:56:51,027 - root - ERROR - Error: integer division or modulo by zero
    2020-05-17 14:56:51,027 - root - ERROR - Error
    Traceback (most recent call last):
      File "log9.py", line 6, in <module>
        result = 5 / 0
    ZeroDivisionError: integer division or modulo by zero
    2020-05-17 14:56:51,028 - root - ERROR - Error
    Traceback (most recent call last):
      File "log9.py", line 6, in <module>
        result = 5 / 0
    ZeroDivisionError: integer division or modulo by zero
    

    3.9 日志文件按照时间划分或者按照大小划分

    如果将日志保存在一个文件中,那么时间一长,或者日志一多,单个日志文件就会很大,既不利于备份,也不利于查看。我们会想到能不能按照时间或者大小对日志文件进行划分呢?答案肯定是可以的,并且还很简单,logging 考虑到了我们这个需求。logging.handlers 文件中提供了 TimedRotatingFileHandler 和 RotatingFileHandler 类分别可以实现按时间和大小划分。打开这个 handles 文件,可以看到还有其他功能的 Handler 类,它们都继承自基类 BaseRotatingHandler。

    3.9.1 TimedRotatingFileHandler构造函数

    定义如下:

    TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
    
    # 每隔 1小时 划分一个日志文件,interval 是时间间隔,备份文件为 10 个
    handler2 = logging.handlers.TimedRotatingFileHandler("test.log", when="H", interval=1, backupCount=10)
    
  • 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会自动重建文件
  • backupCount:是保留日志个数。默认的0是不会自动删除掉日志。若设3,则在文件的创建过程中库会判断是否有超过这个3,若超过,则会从最先创建的开始删除。
  • $ cat log10.py 
    #!/usr/bin/python
    #---coding:utf-8
    import logging
    import logging.handlers
    import datetime,time
    #logging    初始化工作
    logger = logging.getLogger("zjlogger")
    logger.setLevel(logging.DEBUG)
    # 添加TimedRotatingFileHandler
    # 定义一个1秒换一次log文件的handler
    # 保留3个旧log文件
    rf_handler = logging.handlers.TimedRotatingFileHandler(filename="all.log",when='S',interval=1,\
                                                           backupCount=3)
    rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))
    #在控制台打印日志
    handler = logging.StreamHandler()
    handler.setLevel(logging.DEBUG)
    handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
    logger.addHandler(rf_handler)
    logger.addHandler(handler)
    while True:
        logger.debug('debug message')
        logger.info('info message')
        logger.warning('warning message')
        logger.error('error message')
        logger.critical('critical message')
        time.sleep(1)
    all.log  all.log.2020-05-17_15-21-55  all.log.2020-05-17_15-21-56  all.log.2020-05-17_15-21-57  log10.py
    

    3.9.2 RotatingFileHandler 构造函数

    # 每隔 1000 Byte 划分一个日志文件,备份文件为 3 个
    file_handler = logging.handlers.RotatingFileHandler("test.log", mode="w", maxBytes=1000, backupCount=3, encoding="utf-8")
    
    $ cat log11.py 
    #!coding:utf-8
    #!/usr/bin/env python
    import time
    import logging
    import logging.handlers
    # logging初始化工作
    logging.
    
    
    
    
        
    basicConfig()
    # myapp的初始化工作
    myapp = logging.getLogger('myapp')
    myapp.setLevel(logging.INFO)
    # 写入文件,如果文件超过100个Bytes,仅保留5个文件。
    handler = logging.handlers.RotatingFileHandler(
                  'logs/myapp.log', maxBytes=100, backupCount=5)
    myapp.addHandler(handler)
    while True:
        time.sleep(0.01)
        myapp.info("file test")
    
    $ python log11.py
    INFO:myapp:file test
    INFO:myapp:file test
    INFO:myapp:file test
    INFO:myapp:file test
    .....
    $ ls logs
    myapp.log  myapp.log.1  myapp.log.2  myapp.log.3  myapp.log.4  myapp.log.5
    

    3.10 logging.disable暂时禁止日志输出

    运行测试代码时,我不想登录到文件或控制台
    在运行测试代码时将日志输出到文件或控制台通常会感到非常烦人。
    如果将其输出到文件,则可以将其保留,但是如果将其记录到控制台,将很难理解测试执行的进度和结果。
    而且,由于日志本身就是输入/输出,因此花费额外的测试执行时间没有错
    logging.disable会忽略低于指定日志级别的日志输出
    Python的日志记录模块定义了一个名为disable的函数,该函数将日志级别作为参数传递。
    例如

    import logging
    logging.disable(logging.FATAL)
    

    如果这样做,将不会输出FATAL以下的日志。
    换句话说,由于它低于最高级别FATAL,因此实际上没有日志输出。
    反之亦然

    import loggging
    logging.disable(logging.NOTSET)
    

    NOTSET是最低的日志级别,因此这与取消抑制日志相同。

    我使用setUp和tearDown使用logging.disable
    考虑到这一点,您可以执行以下操作来在编写测试代码时暂时停止日志输出。

    import logging
    import unittest
    class FooTest(unittest.TestCase):
        def setUp(self):
            logging.disable(logging.FATAL)
        def tearDown(self):
            logging.disable(logging.NOTSET)
        def test(self):
    
    版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://ghostwritten.blog.csdn.net/article/details/106175141,作者:ghostwritten,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

    上一篇: SAP 电商云 Spartacus 服务器端渲染的单步调试详细步骤

    下一篇: 如何在 SAPGUI 里显示上传到 ABAP 服务器的 PDF 文件试读版

    相关文章

    2023-08-09 07:17:16

    CDH yarn设置管理 ACL后,无法访问yarn的日志。

    yarn设置acl的配置设置以上之后,就无法查看yarn运行的flink任务的日志。提示报以下错误。job的日志 HDFS:User [dr.who] is not authorized to view the logs for conta

    2023-08-09 07:17:16
    2023-08-09 07:17:16

    Yarn聚合日志

    一、聚合日志介绍日志聚集是YARN提供的日志中央化管理功能,它能将运行完成的Container任务日志上传到HDFS上,从而减轻NodeManager负载,且提供一个中央化存储和分析机制。默认情况下,Container 任务日志存在在各个

    2023-08-09 07:17:16
    2023-08-09 07:17:07

    django 清理缓存,解决manage.py没有clear_cache命令

    django 清理缓存,解决manage.py没有clear_cache命令

    2023-08-09 07:17:07
    django python
    2023-08-09 07:16:30

    启动Django程序报错:Python3.7&Django1.11.X 兼容性问题

    启动Django程序报错:Python3.7&Django1.11.X 兼容性问题

    2023-08-09 07:16:30
    bootstrap Django python
    2023-08-09 06:48:08

    Python基础语法入门篇(二)

    Python基础语法入门篇(二)

    2023-08-09 06:48:08
    python
    2023-08-09 06:47:47

    用LogParser分析Windows日志

    用LogParser分析Windows日志

    2023-08-09 06:47:47
    Windows
    2023-08-09 06:47:35

    Lombok @Slf4j 使用和配置

    pom依赖 resources下logback.xml配置,也可通过application.properties进行日志配置 在需要使用日志的类上加@Slf4j 注解 log.info(“logind

    2023-08-09 06:47:35
    spring
    2023-08-09 06:39:31

    计划管理和日志管理

    计划管理和日志管理

    2023-08-09 06:39:31
    2023-08-09 06:39:31

    模板语言继承使用

    #基础html,base.htmlbook_list2.html{# 继承母版 #}

    2023-08-09 06:39:31
    python
    2023-08-07 07:24:54

    Python中的异常类型及处理方式

    目录前言正文一、什么是异常二、异常的类型三、异常处理四、try 介绍五、finally 介绍六、raise 介绍结尾前言Python 是一种面向对象的、解释型的、通用的、开源的脚本编程语言。现在市面上 Python 非常的流行,主要是因为它

    2023-08-07 07:24:54
    python
    查看更多
    推荐标签

    作者介绍

    天翼云小翼
    天翼云用户

    文章

    13298

    阅读量

    1259504

    查看更多

    最新文章

    CDH yarn设置管理 ACL后,无法访问yarn的日志。

    2023-08-09 07:17:16

    Yarn聚合日志

    2023-08-09 07:17:16

    用LogParser分析Windows日志

    2023-08-09 06:47:47

    Lombok @Slf4j 使用和配置

    2023-08-09 06:47:35

    计划管理和日志管理

    2023-08-09 06:39:31

    logback的使用,全部演示,傻瓜式学习

    2023-08-04 08:44:32

    查看更多

    热门文章

    Linux运维小技巧---每日收集所有服务器信息并归档到指定服务器

    2023-03-16 07:49:58

    shell脚本统计分析Nginx日志

    2023-03-24 10:30:29

    随机点名系统

    2023-02-24 08:29:11

    日志显示TypeError: Failed to fetch报错与TypeError: NetworkError when attempting to fetch resource报错

    2023-04-19 09:35:28

    windows服务器ssl证书安装及配置https

    2023-05-17 06:38:05

    python-虚拟环境-centos系统安装

    2023-03-30 10:07:24

    查看更多

    热门标签

    linux Linux python mysql centos nginx django redis
    查看更多

    相关产品

    弹性云主机

    随时自助获取、弹性伸缩的云服务器资源

    天翼云电脑(公众版)

    便捷、安全、高效的云电脑服务

    对象存储

    高品质、低成本的云上存储服务

    云硬盘

    为云上计算资源提供持久性块存储

    查看更多

    随机文章

    Django博客系统(首页用户名展示)

    logrotate实现日志切割(转储)

    Linux系统中创建虚拟环境详解

    Django博客系统(状态保持)

    Django博客系统(短信验证码)

    点名系统

    推荐助力领好礼 邀请好友完成推荐任务 最高可得千元电信卡
    查看详情
    • 7*24小时售后
    • 无忧退款
    • 免费备案
    • 专家服务
    售前咨询热线
    400-810-9889转1
    • 天翼云APP 微信公众号
    服务与支持
    • 备案中心
    • 售前咨询
    • 智能客服
    • 自助服务
    • 工单管理
    • 客户公告
    账户管理
    • 管理中心
    • 订单管理
    • 余额管理
    • 发票管理
    • 充值汇款
    • 续费管理
    快速入口
    • 文档中心
    • 最新活动
    • 免费试用
    • 安全专区
    • 信任中心
    • 天翼云学堂
    云网生态
    • 甄选商城
    • 渠道合作
    • 云市场合作
    了解天翼云
    • 关于天翼云
    • 天翼云APP
    • 服务案例
    • 新闻资讯
    • 联系我们
    • 校园招聘
    热门产品
    • 弹性云主机
    • 边缘安全加速平台
    • 天翼云电脑
    • 天翼云手机
    • 关系型数据库
    • 对象存储
    • 云硬盘
    • Web应用防火墙
    • 服务器安全卫士
    • 天翼云办公
    热门推荐
    • 云服务备份
    • 云电脑
    • 全站加速
    • 安全加速
    • 云服务器
    • 云主机
    • 智能边缘云
    • 应用编排服务
    • 微服务引擎
    • 共享流量包
    更多推荐
    • web应用防火墙
    • 密钥管理
    • 等保咨询
    • 安全专区
    • 应用运维管理
    • 云日志服务
    • 云网融合
    • 云搜索服务
    • 数据湖探索
    • 数据仓库服务
    友情链接
    • 天翼云盘
    • 天翼企业云盘
    • 189邮箱
    • 中国电信集团
    • 电信量子集团
    ©2023 京ICP备 2021034386号
     
    推荐文章
    沉着的大白菜  ·  小米生态链赋能:华米纽交所上市,市值6.56亿美金
    11 月前
    失恋的柿子  ·  关于全省人社系统集中接访的公告_通知公告_县人力资源和社会保障局
    1 年前
    怕老婆的帽子  ·  上市公司频频亮牌“硬科技” 科创板受理企业突破800家-新华网
    2 年前
    睿智的海龟  ·  鸿翔前宸府售楼处电话【2022官网首页】鸿翔前宸府售楼部地址..._项目_配套_海宁市
    2 年前
    果断的火腿肠  ·  人物--艺术--中国作家网
    2 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    Code - 代码工具平台
    © 2024 ~ 沪ICP备11025650号