日志/异常处理(nnlog+traceback)

Posted mling

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日志/异常处理(nnlog+traceback)相关的知识,希望对你有一定的参考价值。

一、nnlog日志模块,使用之前,需要先pip安装下

import nnlog
import traceback
log=nnlog.Logger(‘python.log‘,level=‘debug‘,when=‘D‘,backCount=5)
# when D是每天 M每月 S每秒
# 日志级别
log.debug(‘debug数据‘) #打印的调试信息,是最详细的,比较占用资源,生产环境很少用
log.info(‘详细信息‘) #打印一些需要的提示信息
log.warning(‘警告数据‘) #出现警告,只打印warning级别的日志
log.error(‘错误信息‘) #出现错误
# log.surprise() 
traceback.format_exc() #拿到出错的信息,放在日志文件里面
traceback.print_exc() #只在执行时pring出错误信息

运行结果:
2020-05-26 18:42:18,625 - D:/NiuTest/MLingTest/day6(数据库操作)/写日志.py[line:6] - DEBUG: debug数据
2020-05-26 18:42:18,626 - D:/NiuTest/MLingTest/day6(数据库操作)/写日志.py[line:7] - INFO: 详细信息
2020-05-26 18:42:18,626 - D:/NiuTest/MLingTest/day6(数据库操作)/写日志.py[line:8] - WARNING: 警告数据
2020-05-26 18:42:18,626 - D:/NiuTest/MLingTest/day6(数据库操作)/写日志.py[line:9] - ERROR: 错误信息
NoneType

  注:会在当前目录下生成一个python.log文件,记录运行的内容如下:

技术图片

 

 

 二、traceback模块

1、traceback.print_exc()
2、traceback.format_exc()
3、traceback.print_exception()

1、print_exc():是对异常栈输出
2、format_exc():是把异常栈以字符串的形式返回,print(traceback.format_exc()) 就相当于traceback.print_exc()
3、print_exception():traceback.print_exc()实现方式就是traceback.print_exception(sys.exc_info()),可以点sys.exc_info()进去看看实现

  例一:

if __name__ == ‘__main__‘:
    import sys
    import time
    import traceback

    try:
        function(1, 0)
    except Exception as e:
        print(‘***1‘, type(e), e, ‘***1‘)
        time.sleep(2)

        print("1***traceback.print_exc():*** 1")
        time.sleep(1)
        traceback.print_exc()
        time.sleep(2)

        print("2***traceback.format_exc():***2 ")
        time.sleep(1)
        print(traceback.format_exc())
        time.sleep(2)

        print("3***traceback.print_exception():***3 ")
        time.sleep(1)
        traceback.print_exception(*sys.exc_info())

运行结果:
***1 <class ‘NameError‘> name ‘function‘ is not defined ***1
1***traceback.print_exc():*** 1
Traceback (most recent call last):
  File "D:/NiuTest/NiuTest/day6/day6/写日志.py", line 18, in <module>
    function(1, 0)
NameError: name ‘function‘ is not defined
2***traceback.format_exc():***2 
Traceback (most recent call last):
  File "D:/NiuTest/NiuTest/day6/day6/写日志.py", line 18, in <module>
    function(1, 0)
NameError: name ‘function‘ is not defined

3***traceback.print_exception():***3 
Traceback (most recent call last):
  File "D:/NiuTest/NiuTest/day6/day6/写日志.py", line 18, in <module>
    function(1, 0)
NameError: name ‘function‘ is not defined

Process finished with exit code 0

  注:可以看出,三种方式打印结果是一样的。在开发时,做调试是很方便的。也可以把这种异常栈写入日志

例二:

import pymysql
import nnlog
import traceback
log = nnlog.Logger(‘python.log‘,level=‘debug‘,backCount=5,when=‘D‘)
mysql_info = {
    ‘host‘:‘****‘,
    ‘port‘:3306,
    ‘db‘:‘jxz‘,
    ‘password‘:‘123456‘,
    ‘charset‘:‘utf8‘,
    ‘autocommit‘:True,
    ‘user‘:‘jxz‘
}
name=‘xiaohei‘
sql=sql = ‘select * from product where4 name="%s";‘ % name
def op_db(sql,one_tag=True):
    try:
        log.debug("开始连接数据库,数据库连接信息是%s"%mysql_info)
        connect = pymysql.connect(**mysql_info)
    except Exception as e:
        log.debug("连接数据失败")
        log.error("连接数据失败,请检查")

        log.error(traceback.format_exc())
        # traceback.format_exc()拿到出错的那一大坨字符串
        #traceback.print_exc()#只print错误信息
        return "001"
    else:
        log.info("开始建立游标")
        cur = connect.cursor(pymysql.cursors.DictCursor)
        try:

            log.error("开始执行sql")

            log.info("sql语句是%s"%sql)
            cur.execute(sql)
        except Exception as e:
            print(e)
            log.warning(traceback.format_exc())
            log.warning("sql错误!")
            return "002"
        else:
            if one_tag:
                result = cur.fetchone()#{}
            else:
                result = cur.fetchall()#[]
        finally:
            cur.close()
            connect.close()
    return result

op_db(sql)
运行结果:
会生成一个python.log文件,记录日志信息

  log内容如下:

技术图片

 三、异常处理

使用格式如下:

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了‘name‘异常
except <名字>,<数据>:
<语句>        #如果引发了‘name‘异常,获得附加的数据
else:
<语句>        #如果没有异常发生
finally:
<语句>    #退出try时总会执行
例一:
d = {}
try:
    print(d[‘name‘])
except Exception as e:
    print("出异常了",e)
else:
    print("不出异常的时候走到这里")
finally:
    print("不管什么时候都会走这里呢")
运行结果:
出异常了 ‘name‘
不管什么时候都会走这里呢

  例二:

d = {‘name‘:‘MLing‘}
try:
    print(d[‘name‘])
except Exception as e:
    print("出异常了",e)
else:
    print("不出异常的时候走到这里")
finally:
    print("不管什么时候都会走这里呢")

运行结果:
MLing
不出异常的时候走到这里
不管什么时候都会走这里呢

  

 

以上是关于日志/异常处理(nnlog+traceback)的主要内容,如果未能解决你的问题,请参考以下文章

写日志 使用nnlog

nnlog日志模块

python-网络连接1-写日志-nnlog模块

一个日志模板,从traceback打印异常受启发做的模板,可被pycharm esclip sublime等ide识别和跳转

日志处理

日志处理