如何正确使用日志Log

title: 如何正确使用日志Log
date: 2015-01-08 12:54:46
categories: [Python]
tags: [Python,log]
---

文章首发地址:http://kingname.info

这篇文章不会教你在技术角度上使用log,而是告诉你为什么要使用log日志功能。

为什么要使用Log

在使用微信控制你的电脑这篇文章中,我写好了电脑端的程序,使用py2exe生成可执行文件,并把它们发送给我的朋友让他们进行测试。但是他们把_config.ini设置好以后,运行程序就看到一个黑色窗口一闪而过。或者有些人一开始看到程序能正常登陆邮箱,但是准备执行命令的时候,窗口自动关闭。

由于没有日志记录程序的运行状态,我根据他们的描述很难定位到错误在哪个地方。于是折腾了一个下午。

这个时候,我觉得添加一个日志的功能迫在眉睫。

哪些地方应该用Log

目前网上能找到的关于如何使用日志的文章,全部都是从技术角度讲怎么使用log:在XX地方应该先imort logging,然后basicconfig设定XX内容。可是我现在的问题是:

  • 应该在程序的哪些地方添加日志的输出?
  • 输出什么内容?
  • 如何输出才能以方便我的监控程序的运行情况?

于是我只有自己摸索。因此,以下内容是我自己摸索出来的野路子,可能会有错漏。希望有经验的朋友能给我指正,非常感谢。

这些地方应该用Log

使用使用微信控制你的电脑文章中涉及到的例子

程序入口代码如下:

if __name__=='__main__':init()print u'等待接收命令'logging.info(u'初始化完成。')while 1:time.sleep(int(time_limit)) #每5分钟检查一次邮箱accp_mail()

以上代码表示程序运行以后,首先执行init()函数,于是如果init()初始化没有什么问题,成功执行完成以后,就应该在日志中输出“初始化完成”,然后进入接收邮件的循环。如果程序窗口运行以后一闪而过,而且生成的日志中没有初始化完成这样的字眼,那就说明问题出在初始化上面。

然而初始化函数里面代码也有很多,又如何知道是初始化程序里面的什么地方出问题了呢?

所以,再初始化函数里面,也应该有一定的日志记录。

再看初始化函数的代码:

def init():global username,password,host,boss_email,time_limittry:f = open('_config.ini','r')except IOError,e:logging.error(e)exit()info = f.readlines()try:host = re.search('host:(.*?)\n',info[0],re.S).group(1)username = re.search('username:(.*?com)',info[1],re.S).group(1)password = re.search('password:(.*?)\n',info[2],re.S).group(1)boss_email = re.search('boss_email:(.*?com)',info[3],re.S).group(1)time_limit = re.search('time_limit:(.*?)\n',info[4],re.S).group(1)except Exception,e:logging.error(e)logging.info(u'打开配置文件成功。。。')#将命令生成字典,便于查询command_start = info.index('<command>\n')command_end = info.index('</command>\n')for each in info[command_start+1:command_end]:command = each.split('=')command_dict[command[0]] = command[1]logging.info(command_dict)open_start = info.index('<open_file>\n')open_end = info.index('</open_file>\n')for each in info[open_start+1:open_end]:open_file = each.split('=')open_dict[open_file[0]] = open_file[1][:-1]logging.info(open_dict)f.close()

在这段代码中,我使用try except命令捕获异常,如果发生异常,就使用logging.error将错误写入日志中。例如当_config.ini被改名了或者被删除的时候,程序就会报错,而通过日志就能发现这个错误。

经过上面的代码,如果在初始化的过程中出错,就可以很快确定问题出在什么地方。

初始化完成以后,进入邮件接收阶段。

def accp_mail():logging.info(u'开始检查邮箱')try:pp = poplib.POP3_SSL(host)pp.set_debuglevel(1)pp.user(username)pp.pass_(password)ret = pp.list()logging.info(u'登录邮箱成功。')except Exception,e:logging.error(e)exit()logging.info(u'开始抓取邮件。')try:down = pp.retr(len(ret[1]))logging.info(u抓取邮件成功。'')except Exception,e:logging.error(e)exit()logging.info(u'开始抓取subject和发件人')try:subject = re.search("Subject: (.*?)',",str(down[1]).decode('utf-8'),re.S).group(1)sender = re.search("'X-Sender: (.*?)',",str(down[1]).decode('utf-8'),re.S).group(1)logging.info(u'抓取subject和发件人成功')except Exception,e:logging.error(e)exit()if subject != 'pass':if sender == boss_email:DealCommand(subject)pp.quit()

以上这段代码,对邮箱的登录与邮件的读取均作了监控,一旦有某个环节出了问题,就会体现在日志中。

通过在登录环节的try except返回的错误日志,发现有很多朋友无法登录邮箱,而密码用户名都没有错,从而推断是没有在新浪邮箱的账户控制里面打开客服端接收POP3和SMTP的功能。

再来看DealCommand()函数:

def DealCommand(subject):logging.info(u'开始处理命令。')send_mail('pass','slave')if subject in command_dict:logging.info(u'执行命令')try:command = command_dict[subject]os.system(command)send_mail('Success','boss')logging.info(u'执行命令成功')except Exception,e:logging.error(e)send_mail('error','boss',e)elif subject in open_dict:logging.info(u'打开文件')try:open_file = open_dict[subject]win32api.ShellExecute(0, 'open', open_file, '','',1)send_mail('Success','boss')logging.info(u'打开文件成功')except Exception,e:logging.error(e)send_mail('error','boss',e)else:send_mail('error','boss','no such command')

执行命令的地方可能会出错,于是果断使用try except捕获错误。并使用日志记录。

最后是send_mail()函数:

def send_mail(subject,flag,body='Success'):msg = MIMEText(body,'plain','utf-8')#中文需参数‘utf-8’,单字节字符不需要msg['Subject'] = subjectmsg['from'] = usernamelogging.info('开始配置发件箱。')try:handle = smtplib.SMTP('smtp.sina.com', 25)handle.login(username,password)logging.info('发件箱配置成功')except Exception,e:logging.error(e)exit()logging.info(u'开始发送邮件'+ 'to' + flag)if flag == 'slave':try:handle.sendmail(username,username, msg.as_string())logging.info(u'发送邮件成功')except Exception,e:logging.error(e)exit()elif flag == 'boss':try:handle.sendmail(username,boss_email, msg.as_string())logging.info(u'发送邮件成功')except Exception,e:logging.error(e)exit()handle.close()logging.info(u'发送邮件结束'+flag)

这里对邮件发件的部分需要特别仔细的错误捕获,然后记录进入日志中。

完整的代码见:https://github.com/kingname/MCC.git中的auto.py

总结

需要使用日志记录的地方大致有一下几处:

  • 所有输入输出处,无论是从文件输入还是从网络等其他地方输入
  • 执行命令处
  • 调用函数处

PS

这里我对一般信息的记录使用了info,实际上,一般用作调试的话,是使用debug更多。

需要用户输入的地方,总会有想不到的错误,多小心都不为过。例如,用户可能会把time_limit设定为一个全角数字。而本文中就没有捕获这种问题到日志中。所以如果不放心的话,还可以更进一步的细化日志。

posted on 2015-01-08 15:58 青南 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/xieqiankun/p/how_to_use_log.html

如何正确使用日志Log相关推荐

  1. java看log技巧_Log日志框架的学习五.正确使用日志的10个技巧

    做一个苦逼的Java攻城师, 我们除了关心系统的架构这种high level的问题, 还需要了解一些语言的陷阱, 异常的处理, 以及日志的输出, 这些"鸡毛蒜皮"的细节. 这篇文章 ...

  2. 正确使用日志的10个技巧(转)

    做一个苦逼的Java攻城师, 我们除了关心系统的架构这种high level的问题, 还需要了解一些语言的陷阱, 异常的处理, 以及日志的输出, 这些"鸡毛蒜皮"的细节. 这篇文章 ...

  3. Python统计网站访问日志log中的IP信息,并排序。。

    Python统计网站访问日志log中的IP信息,并排序,打印排名靠前的IP及访问量.示例代码如下: #!/usr/bin/env pythonipdict = {}file = open(" ...

  4. 你真的会正确使用日志吗?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:今天给大家推荐 6 个 Spring Boot 项目,拿来就可以赚钱! 个人原创100W+访问量博客:点击前往, ...

  5. C++-实现日志log功能

    作者:Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 场景需求 开发软件或者进行其他编程工作时,软件可能会长时间运行,但是!一旦突然崩溃就让人一脸懵逼,此时 ...

  6. php log日志管理,PHP日志LOG类定义与用法示例

    本文实例讲述了PHP日志LOG类定义与用法.分享给大家供大家参考,具体如下: /** * PHP log 类 */ class Config{ public static function getCo ...

  7. 解决 sql 语句正确,日志打印正确,但是在mapper测试中返回值为 NULL

    解决 sql 语句正确,日志打印正确,但是在mapper测试中返回值为 NULL

  8. 别在 Java 代码里乱打日志了,这才是正确的日志打印姿势!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 转自:公众号   石杉的架构笔记  作者:Lrwin 打日志的正确 ...

  9. SAP日志log:SLG0,SLG1

    首先创建日志对象 slg0: 创建主对象 创建子对象 调用函数添加维护日志 *1.变量定义 *----------------------------------------------------- ...

最新文章

  1. Spring MVC 到 Spring BOOT 的简化之路
  2. f5申请并激活License
  3. vmware redhat5.4 磁盘阵列 RIDA
  4. ArtVideoPlayer:一个灵活的视频播放器
  5. Mzc和男家丁的游戏
  6. DCMTK:OFStack类的测试程序
  7. BZOJ-1034-[ZJOI2008]泡泡堂BNB(贪心)
  8. Pytorch中BN层入门思想及实现
  9. 用java在JPanel中建一个表格_如何使用Java在JPanel中显示JTable?
  10. cmd创建一个用户并升级成管理员
  11. 在VirtualBox的虚拟机上安装和使用NCS2(intel movidius stick 2)
  12. 《信号与系统》(吴京)部分课后习题答案与解析——第二章(PART2)
  13. sunshine in the rain
  14. js渲染引擎 tempo.js
  15. CAD绘制填充并设置填充透明度
  16. 关于受理南山区2022年度“领航人才” 租房补贴申请的通告
  17. matplotlib-06 axhline绘制水平/竖直参考线
  18. 2019年应届生校招技面随笔
  19. mysql error 1142
  20. java的意思和含义,2022年最新

热门文章

  1. Java终止线程的三种方式
  2. Android开发笔记(六)可变字符串
  3. Vue method与computed的区别
  4. 第8周课堂测试3(课上未完成)
  5. Raid及mdadm命令
  6. 64位 eclipse完美安装svn插件
  7. 又忙了一天,什么书也不看。
  8. 1、环境搭建、Helloworld
  9. S5PV210体系结构与接口10:MMU编程
  10. 【实用工具】远程桌面工具