• Python中的日志处理


    在日常项目中,总是需要记录下一些细小信息或者错误码、错误信息的,这个时候就需要进行日志的操作。
    python中用于日志创建、设置和记录等功能的模块,就是logging了,下面是对其基本使用方法的介绍:

    一、最最简单的使用方法:


    import logging

    LOG_FILE = "/opt/xxx/log/debug.log"
    logging.basicConfig(filename=LOG_FILE,level=logging.DEBUG)
    然后在需要记录日志的地方引用:

    logging.warn("[WARN:%s]warn messages %s",error_code,error_msg)
    简单的几行代码,就可以实现将“[WARN:14001]warn message Error request”写入日志文件/opt/xxx/log/debug.log中了。


    二、再来比较正规的使用方式:


    #!/usr/bin/python

    def initlog():
     import logging

     # 生成一个日志对象
    logger = logging.getLogger()
     # 生成一个Handler。logging支持许多Handler,例如FileHandler, SocketHandler, SMTPHandler等,
    # 我由于要写文件就使用了FileHandler。
     # LOG_FILE是一个全局变量,它就是一个文件名,如:'crawl.log'
    LOG_FILE = "/opt/xxx/log/debug.log"
    hdlr = logging.FileHandler(LOG_FILE)
     # 生成一个格式器,用于规范日志的输出格式。如果没有这行代码,那么缺省的
     # 格式就是:"%(message)s"。也就是写日志时,信息是什么日志中就是什么,
     # 没有日期,没有信息级别等信息。logging支持许多种替换值,详细请看
     # Formatter的文档说明。这里有三项:时间,信息级别,日志信息
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
     # 将格式器设置到处理器上
    hdlr.setFormatter(formatter)
     # 将处理器加到日志对象上
    logger.addHandler(hdlr)
     # 设置日志信息输出的级别。logging提供多种级别的日志信息,如:NOTSET,
     # DEBUG, INFO, WARNING, ERROR, CRITICAL等。每个级别都对应一个数值。
     # 如果不执行此句,缺省为30(WARNING)。可以执行:logging.getLevelName
     # (logger.getEffectiveLevel())来查看缺省的日志级别。日志对象对于不同
     # 的级别信息提供不同的函数进行输出,如:info(), error(), debug()等。当
     # 写入日志时,小于指定级别的信息将被忽略。因此为了输出想要的日志级别一定
     # 要设置好此参数。这里我设为NOTSET(值为0),也就是想输出所有信息
    logger.setLevel(logging.NOTSET)
     return logger

    logging = initlog()
    logging.info(' 注册')
    logging.error('error!')
    logging.debug('debug')
    上面代码中的使用方式,可以指定日志的级别和格式,可用于区分开发环境和用户环境中日志的级别,减少不必要的空间浪费。

    三、日志分割

    当工程运行一段时间后,会发现日志文件越来越大,而且也不便于查找某天的错误信息。这就需要我们对日志进行分割,分割形式有两种:RotatingFileHandler(按照文件大小分割)、TimedRotatingFileHandler(按照时间间隔分割)
    • 以第二个例子中的代码为基础,按照文件大小分割的使用方法:

    hdlr =logging.handlers.RotatingFileHandler(LOG_FILE,maxBytes=1024*1024,backupCount=40)
    其中maxBytes指定每个日志文件的大小,如果文件超过1024比特就分割该日志文件,最大的备份文件个数是40个。到LOG_FILE所在目录下查看,发现除了debug.log文件外,还多了debug.log.1,debug.log.2等文件。
    debug.log文件和debug.log.1等文件的关系是:debug.log是全集,debug.log.1和debug.log.2等文件是无交集的属于debug.log的子集(忘记数学符号怎么写了,感觉文字木有表达式明了啊)
    • 同样以第二个例子中的代码为基础,按照时间间隔分割的使用方法:
    hdlr = logging.handlers.TimedRotatingFileHandler(LOG_FILE,when='M',interval=1,backupCount=40)
    when 参数可设置为S-second(按秒对日志进行分割),M-Minutes(按分钟对日志进行分割),H-Hours(按小时对日志进行分割),D- Days(按天对日志进行分割),midnigh-roll over at midnight(每天半夜对日志进行回滚),W{0-6}-roll over on a certain day;0-Monday(按照指定的日期如0-周一对日志进行回滚)。when参数默认是“h”按小时分割,该参数对大小写不敏感,所以无所谓是H还是 h了。
    interval参数默认“1”,如果when=‘h’,那么就是每一小时对日志进行一次分割,即debug.log所在目录会出现 debug.log.2013-06-28_13,debug.log.2013-06-28_14等日志文件。
     1 #! /usr/bin/env python
     2 #-*- coding:utf8 -*-
     3 #Author:zhangning
     4 import logging
     5 def logg_formart():
     6     logger = logging.getLogger()
     7     # 创建一个handler,用于写入日志文件
     8     fh = logging.FileHandler('test.log')
     9     # fh.setLevel(logging.INFO)
    10 
    11     # 再创建一个handler,用于输出到控制台
    12     ch = logging.StreamHandler()
    13     # ch.setLevel(logging.DEBUG)
    14 
    15     formatter = logging.Formatter('%(asctime)s , %(levelname)s , [line:%(lineno)d] , %(message)s')
    16 
    17     fh.setFormatter(formatter)
    18     ch.setFormatter(formatter)
    19     logger.setLevel(logging.DEBUG)
    20     logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
    21     logger.addHandler(ch)
    22     return logger
    23 
    24 logger =logg_formart()
    25 for i in range(10):
    26     logger.debug(i)
    View Code

     true

     1 #!/usr/bin/env python
     2 #-*- coding:utf8 -*-
     3 import time
     4 import logging
     5 import logging.handlers
     6 
     7 # # logging初始化工作
     8 # logging.basicConfig()
     9 #
    10 # # myapp的初始化工作
    11 # logger  = logging.getLogger()
    12 # logger.setLevel(logging.INFO)
    13 #
    14 # # 添加TimedRotatingFileHandler
    15 # # 定义一个1秒换一次log文件的handler
    16 # # 保留3个旧log文件
    17 # formatter = logging.Formatter('%(asctime)s , %(levelname)s , [line:%(lineno)d] , %(message)s')
    18 # filehandler = logging.handlers.TimedRotatingFileHandler("myapp.log", when='S', interval=1, backupCount=3)
    19 # # 设置后缀名称,跟strftime的格式一样
    20 # #果设定是天,就必须写成“%Y-%m-%d.log”,写成其他格式会导致删除旧文件不生效
    21 # filehandler.suffix = "%Y-%m-%d_%H-%M.log"
    22 # filehandler.setFormatter(formatter)
    23 # logger.addHandler(filehandler)
    24 #
    25 # while True:
    26 #     logger.info("test")
    27 
    28 def log_formart():
    29     logging.basicConfig()
    30     logger  = logging.getLogger()
    31     logger.setLevel(logging.INFO)
    32     formatter = logging.Formatter('%(asctime)s , %(levelname)s , [line:%(lineno)d] , %(message)s')
    33     filehandler = logging.handlers.TimedRotatingFileHandler("myapp.log", when='M', interval=1, backupCount=3)
    34     filehandler.suffix = "%Y-%m-%d_%H-%M.log"
    35     filehandler.setFormatter(formatter)
    36     logger.addHandler(filehandler)
    37     return logger
    38 logging =log_formart()
    39 while True:
    40     time.sleep(5)
    41     logging.info('test1')
    View Code
  • 相关阅读:
    IsBadReadPtr|IsBadWritePtr调试崩溃
    VSCode配置python调试环境
    Visual Studio Code 如何编写运行 C、C++ 程序?
    使用nginx做反向代理
    Win10环境下配置VScode的C++编译环境
    关于java 获取 html select标签 下拉框 option 文本内容 隐藏域
    【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】
    VS Code 配置 C/C++ 环境
    改变你一生的编辑器:VSCode使用总结
    CentOS7,安装Tomcat8.5、JDK1.8,并设置开机启动(Linux CentOS Tomcat、JDK+Tomcat、Tomcat开机自启动)
  • 原文地址:https://www.cnblogs.com/yspass/p/8342024.html
Copyright © 2020-2023  润新知