python3 异常处理log打印

基础操作(python 3)

参考贴

python try 异常处理(史上最全)
Python中获取异常(Exception)信息
python----异常、属性

#当results是以下形式的时候,以下代码会出现异常进行异常捕获处理
#results={'status': '0', 'info': 'ENGINE_RESPONSE_DATA_ERROR', 'infocode': '30001'} 
#本文处理是捕获异常不处理,写入日志文件
try:
     format_address=results["geocodes"][0]["formatted_address"]
except Exception as e:
     logging.error(repr(e))

#如果知道自己的程序会报什么异常可以用更具体的方式编写
#这样写的化
try:
     format_address=results["geocodes"][0]["formatted_address"]
except KeyError as e:
     logging.error(repr(e))

log按日输出到日志文件中

参考贴

本文只写了我用到的情况,详细可以参考以下链接
python + logging 实现日志输出及保存到文件
这个超级详细,不过我有些没看懂,有需要自取

代码

logger=logging.getLogger()

#log 按天打印到文件里

#打印 WARNING 级别以上的代码
logger.setLevel(level=logging.WARNING)
#定义log输出格式为: 2023-03-21 10:35:09,824 - trainsfind.py[line:50] - ERROR: KeyError('geocodes')
format=logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')      
#按时间区分,生成日志文件
time_FileHandler=logging.handlers.TimedRotatingFileHandler(filename="log//test",when='S',interval=1,)

time_FileHandler.setFormatter(format)
time_FileHandler.setLevel(logging.WARNING)
time_FileHandler.suffix+=".log" #加后缀名

#log 打印到控制台
stream_handler=logging.StreamHandler()


#logger可以有多个handler
logger.addHandler(time_FileHandler)
logger.addHandler(stream_handler)

#如果是在类里执行,可以把以上代码放到 __init__() 里面,然后再方法里用 logging.error() 日志级别可以自定义

logging.error("error")
time.sleep(1)
logging.warning("warn")

效果

如下(为了显示按时间分区效果,我的代码里是按秒分的,正常按天分就行)
在这里插入图片描述

一些参数的概念

loglevel

                #打印 WARNING 级别以上的代码
                logger.setLevel(level=logging.WARNING)

                """ 日志级别
                CRITICAL = 50
                FATAL = CRITICAL
                ERROR = 40
                WARNING = 30
                WARN = WARNING
                INFO = 20
                DEBUG = 10
                NOTSET = 0

                _levelToName = {
                CRITICAL: 'CRITICAL',
                ERROR: 'ERROR',
                WARNING: 'WARNING',
                INFO: 'INFO',
                DEBUG: 'DEBUG',
                NOTSET: 'NOTSET',
                }
                  """

handler类型
常用
logging.StreamHandler -> 控制台输出
logging.FileHandler -> 文件输出
logging.handlers.RotatingFileHandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
logging.handlers.TimedRotatingFileHandler -> 按照时间自动分割日志文件
在这里插入图片描述

在这里插入图片描述

trycatch 详细

#encoding:utf-8
import pandas as pd
import logging
import logging.handlers
from logging.handlers import TimedRotatingFileHandler
import time
import traceback


class myException(Exception):
  
  def __init__(self, msg):
    self.message = msg
  
  def __str__(self):
    return self.message
  



class exceptionLog:
    def __init__(self):     
                logger=logging.getLogger()

                #log 按天打印到文件里

                #打印 WARNING 级别以上的代码
                logger.setLevel(level=logging.WARNING)

                #定义log输出格式为: 2023-03-21 10:35:09,824 - trainsfind.py[line:50] - ERROR: KeyError('geocodes')
                format=logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')      
                #按时间区分,生成日志文件
                time_FileHandler=logging.handlers.TimedRotatingFileHandler(filename="log//test",when='D',interval=1,)

                time_FileHandler.setFormatter(format)
                time_FileHandler.setLevel(logging.WARNING)
                time_FileHandler.suffix+=".log" #加后缀名

                #log 打印到控制台
                stream_handler=logging.StreamHandler()

                
                logger.addHandler(time_FileHandler)
                logger.addHandler(stream_handler)

    # 高德-获取address详细地址与经纬度信息
    def _deal_excepiton(self,):
            results={'status': '0', 'info': 'ENGINE_RESPONSE_DATA_ERROR', 'infocode': '30001'}
            try:
                #这里有四个异常,只有第一个异常会被捕获处理,可以一个个注释以下看效果
                format_address=results["geocodes"]
                raise AttributeError('对象没有这个属性')
                raise myException('我定义的异常,抛出')
                raise IndexError("序列没有当前索引")                    
            except KeyError as e:
                logging.error(repr(e))
                print(e)
            except Exception as e:
                #我选的repr(e),我觉得这个详细程度就够了
                print(e.args)
                print("================================")
                print(str(e))
                print("================================")
                print(e)
                print("================================")
                print(repr(e)) 
                print("================================")
                print('traceback.print_exc(): ', traceback.print_exc())
                print("================================")
                print('traceback.format_exc():\n%s' % traceback.format_exc())            
            return None
        


if __name__ == '__main__':
      exception=exceptionLog()
      logging.error("error")
      time.sleep(1)
      logging.warning("warn")
      exception._deal_excepiton()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值