一、 什么是日志
还记得初学编程的时候写的控制台程序吗?一共写了10行代码,输出结果是错的,你怀疑在第5行的a变量赋值错误了,但是你又不知道程序执行到那里的时候a变量的是多少,于是乎你在第5行下加了一句printf函数来输出a变量。后来老师教会了我们如何设置断点调试程序,既方便又快捷,你抛弃了printf函数。后来我们走上了工作岗位,开发阶段程序都调试通过,业务也验证没问题,可偏偏项目上线后,客户开始大量使用正规数据,时不时的报出一些莫名其妙的错误。而且问题不一定能够时时复现。这是客户那里一定催着你赶紧把问题解决,不然业务流程进行不下去;老板那里也催着你赶紧把bug改掉,不然客户不付尾款,项目已然延期很久,没有尾款大家都得去喝西北风。这不是要人老命吗!这时你又想到了当年的printf函数,要是程序出错时能把错误信息打印出来该多好呀。没错,日志就在这时横空出世了,它就是把你要记录的错误信息记录在文本文件里的小功能。一旦程序上线后出现问题,只要从客户那里要来日志文本文件,分析一下相信你很快就能定位出错代码的行数了。
二、 日志插件
现在网上的日志插件很多,最出名的要数log4net,它源自著名的log4j开源项目。具体的log4net配置使用方法可以参照下面教程。
它除了像上文所述,将日志文本记在文本文件中,还可以将日志显示在控制台、windows事件、数据库、UDP等等。
三、 日志等级划分
日志共分为五个等级,有限基本依次递减:FATAL ERROR WARN INFO DEBUG。
DEBUG级别用于程序编码过程中复杂过程中间输出变量的值,类似于调试过程中断点的作用。
INFO级别用于记录程序正确执行的信息。例如,添加一个对象到一个表里,可以先记录一个INFO日志:“添加XXX,id:XXX-XXX”。添加过程可以放到一个try-catch语句中,如果没有异常,可以在catch语句的后面在记录一个成功执行的INFO级别日志:“添加XXX,id:XXX-XXX成功”。
WARN级别用于记录程序执行异常,但是又不影响程序正常运行的日志。例如某个操作要操作很多表,使用了实务操作。如果中间某个环节出现问题,事物回滚,那么就可以在catch中记录一个WARN级别的日志给予警告。
ERROR级别用于捕获程序的异常,一般记录在catch中。与WARN级别不同的是ERROR一般是一些影响业务数据正常工作的错误。例如某个数组的索引超出索引长度访问了,这时程序就应当记录一个ERROR日志。不过一般情况下我也将WARN记录UI层的错误,使用ERROR记录业务层的错误。
FATAL级别一般用于捕获未知的异常,不在程序编码过程中使用,一般用在Global.asax文件中的Application_Error事件中记录日志。专用于捕获那些编码中没有专门捕捉的异常信息。