Python中logging模块

补充上节异常的测试demo:


#异常学习
try:
    print(100/0)
except ZeroDivisionError as zes:
    print("分母不能为0")
    print(zes)
else:
    print("ss")
    
'''嵌套异常'''
try:
    with open(r'C:\user\a.txt') as f:
        file=open(r'C:\user\a.txt')
        print("文件名:",file.name)
except OSError as E:
    print("不能打开文件")
    print("文件名:",E.filename)

'''自定义异常类'''
class Division_Error(Exception):
    def  __init__(self,value,name):
        self.name=name
        self.value=value
        
    def __str__(self):
        if self.value%2!=0 and len(self.name)<5:
            return (f"{self.value}不是偶数,{self.name}长度小于4")

try:
    print("尝试抛出异常")
    div=Division_Error(1,"name")
    raise div
except Division_Error as dd:
    print(dd)

Logging日志模块 - 知乎 (zhihu.com) 学习文章所得demo测试

logging 模块简介


  logging 模块是 Python 内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比 print,具备如下优点:

可以通过设置不同的日志等级,在 release 版本中只输出重要信息,而不必显示大量的调试信息;
print 将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging 则可以由开发者决定将信息输出到什么地方,以及怎么输出;
和 print 相比,logging 是线程安全的。
  线程安全:线程执行一段代码,不会产生不确定的结果,那这段代码就是线程安全的。
  多线程的时候执行 print 应该是一行行打印,但是很多字符串打在了一起,为什么?
  说明,print 函数被打断了,被线程切换打断了。print 函数分两步,第一步打印字符串,第二步打印换行符,就在这之间,发生了线程的切换。这说明 print 函数是线程不安全的。

logging.basicConfig(**kwargs)


  使用默认格式化程序创建 StreamHandler 并将其添加到根日志记录器中,从而完成日志系统的基本配置。如果没有为根日志程序定义处理程序,debug()、info()、warning()、error()和 critical() 函数将自动调用 basicConfig()。
  如果根日志记录器已经为其配置了处理程序,则此函数不执行任何操作。

注解:这个函数应该在其他线程启动之前从主线程调用。在 2.7.1 和 3.2 之前的 Python 版本中,如果从多个线程调用此函数,则可能(在很少的情况下)不止一次地将处理程序添加到根日志记录器中,从而导致意想不到的结果,比如在日志中消息被复写。

  支持以下关键字参数。

  • 格式    描述
  • filename    指定使用指定的文件名而不是 StreamHandler 创建 FileHandler。
  • filemode    如果指定 filename,则以此模式打开文件(‘r’、‘w’、‘a’)。默认为“a”。
  • format    为处理程序使用指定的格式字符串。
  • datefmt    使用 time.strftime() 所接受的指定日期/时间格式。
  • style    如果指定了格式,则对格式字符串使用此样式。’%’ 用于 printf 样式、’{’ 用于 str.format()、’$’ 用于 string。默认为“%”。
  • level    将根记录器级别设置为指定的级别。默认生成的 root logger 的 level 是 logging.WARNING,低于该级别的就不输出了。级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG。(如果需要显示所有级别的内容,可将 level=logging.NOTSET)
  • stream    使用指定的流初始化 StreamHandler。注意,此参数与 filename 不兼容——如果两者都存在,则会抛出 ValueError。
  • handlers    如果指定,这应该是已经创建的处理程序的迭代,以便添加到根日志程序中。任何没有格式化程序集的处理程序都将被分配给在此函数中创建的默认格式化程序。注意,此参数与 filename 或 stream 不兼容——如果两者都存在,则会抛出 ValueError。
     

logging 




'''logging部分学习'''
import logging
#设置打印日志的级别,level级别以上的日志会打印出来
#level=logging.DEBUG,logging.info,logging.WARNING...
def log_testing():
    #用getLogger()定义一个日志器  正常是root,,我们改个名
    selflogger=logging.getLogger('__main__')
    self2logger=logging.getLogger('SECOND LOG_NAME')
    # 此处进行Logging.basicConfig() 设置,后面设置无效,这个是全局配置
    logging.basicConfig(filename='test10-log.log',
                       # filemode='w',
                        datefmt='%a %d %b %Y %H:%M:%S',
                        format='%(asctime)s - %(name)s - %(levelname)s- %(message)s-%(funcName)s',
                        level=logging.DEBUG)
    selflogger.debug('debug,用来打印一些调试信息,级别最低')
    selflogger.info('info,用来打印一些正常的操作信息')
    self2logger.warning('waring,用来用来打印警告信息')
    logging.error('error,一般用来打印一些错误信息')
    logging.critical('critical,用来打印一些致命的错误信息,等级最高')
#如果不设置level,默认打印warning以上的日志
log_testing()

#使用logging组件实现特殊的一些功能
from logging.handlers import RotatingFileHandler
#案例1
def log_fun():
    # 创建全局的日志的记录等级设置
    logging.basicConfig(level=logging.DEBUG)
    #创建日志记录器,指明日志保存的路径,每个日志文件的最大值,保存的日志文件的备份数量
    loghandel=RotatingFileHandler('test10-2-log.txt',maxBytes=1024*1024,backupCount=3)
    # 创建日志记录的格式
    formatter=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s- %(message)s-%(funcName)s')
     # 为创建的日志记录器设置日志记录格式
    loghandel.setFormatter(formatter)
    #设置一个自定义的日志器,名字就是当前模块,等级就是前面全局配置的
    selflogger=logging.getLogger(__name__)
    # 为自己的日志工具对象logger也就是日治其 添加日志记录器
    selflogger.addHandler(loghandel)
    
    selflogger.debug('debug,用来打印一些调试信息,级别最低')
    selflogger.info('info,用来打印一些正常的操作信息')
    selflogger.warning('waring,用来用来打印警告信息')
    selflogger.error('error,一般用来打印一些错误信息')
    selflogger.critical('critical,用来打印一些致命的错误信息,等级最高')

log_fun()

#案例2
def log_file():
    log_file='testfun.log'
    handler_test=logging.FileHandler(log_file) #stdout to file
    handler_control=logging.StreamHandler()
    handler_test.setLevel('ERROR') #设置error级别
    handler_control.setLevel('INFO') #设置info级别
    
    selfdef_fmt='%(asctime)s - %(name)s - %(levelname)s- %(message)s-%(funcName)s'
    formatter=logging.Formatter(selfdef_fmt)
    handler_test.setFormatter(formatter)
    handler_control.setFormatter(formatter)
    
    logger=logging.getLogger('updatelog')
    logger.setLevel('DEBUG')
    
    logger.addHandler(handler_test)
    logger.addHandler(handler_control)
    logger.info('info,用来打印一些正常的操作信息')
    logger.warning('waring,用来用来打印警告信息')
    logger.error('error,一般用来打印一些错误信息')
    logger.critical('critical,用来打印一些致命的错误信息,等级最高')
    
log_file()

你可能感兴趣的:(Python,python,开发语言)