如何打一手好Log

如果项目上过线的话,那你一定知道Log是多么重要。

  为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题。这时打一手好Log的重要性绝不亚于写一手好代码。项目出问题时,你要能拿出Log证明自己负责的部分没有问题,如果是自己的问题,要从Log里快速找出错误原因。如果没有从Log里找出错误原因,那一定是一件很悲催的事情,特别是在bug不容易重现的情况下。那简直就是叫天天不灵,叫地地不应啊。

 

  一.Log级别

  Log最常用的级别就是DEBUG,INFO,WARN,ERROR,其他的很少用。如何运用合适的Log级别也是非常重要的,在不该用ERROR的地方用了ERROR,可能会给你带来额外的麻烦。下边仅根据自己的使用习惯,分别说一下我对各种级别的理解。

  1.ERROR:

  ERROR是错误的意思,但不代表出现异常的地方就该打ERROR。我认为ERROR是相对程序正确运行来说的,如果出现了ERROR那就代表出问题了,开发人员必须要查一下原因,或许是程序问题,或许是环境问题,或许是理论上不该出错的地方出错了。总之,如果你觉得某个地方出问题时需要解决,就打ERROR,如果不需要解决就不要打ERROR。

  举例来说,如果有一个接口。调用者传过来的参数不在你的接受范围内,在这种情况下你不能打ERROR,因为传什么值是用户决定的,并不影响程序正确运行。想象一下,如果你的服务器上有监控程序的话,检测到ERROR或WARN就报警,参数错误你也打ERROR,那运维人员会疯掉的。

  如果做一个对讲机,在解析语音数据包时出错了,那就要打ERROR了,因为这个是理论上不该出错的地方,要不就是你的解析代码有问题,要不就是开发人员在拼凑语音包时存在问题,这个时候需要你来找出问题的原因。所以应该打ERROR。

  2.WARN:

  WARN是指出现了不影响程序正确运行的问题,WARN也是问题但不影响程序正常运行,如果WARN出现的过于频繁或次数太多,那就代表你要检查一下程序或环境或依赖程序是否真的出问题了。

  假如你访问一个接口,设置了一个超时,超时之后会抛异常,你在try块里不该打ERROR也不该打INFO来无视它,这时你应该打WARN,紧紧是警告一下,如果超时过多那就该检查一下了,是不是对方接口有问题了或者是网络环境出问题了。

  3.INFO和DEBUG:

  ERROR和WARN是指有问题,而INFO和DEBUG就是指一般的信息了。在程序出问题时,如果这条log可以帮助你分析问题或查看程序的运行情况,那就应该打个INFO。如果仅仅是为了在调试阶段查看程序是否运行正确那就要打DEBUG。前边讨论的接口参数错误问题,就应该打个INFO了,调用者说你的接口总是返回错误代码,你可以告诉他,是他的哪个参数传错了。

 

  二.如何打

  1.log必备信息

  在每一条log中都要将时间、类名及函数名,可以的话将行号也打印出来(不建议手写行号),像java的log4j就是不错的。

  2.函数开始结束处

  在重要函数的开始结束出应该打上log ,这样在看log时会比较直观,什么时候开始什么时候结束就会一目了然,万一中间出异常导致程序退出了,也知道是在哪个函数突然中断的。也同样适用于一个重要逻辑块的开始结束。

  3.返回结果

  尽量在重要函数或web接口的每个返回分支打印返回结果。在出现不好分析的异常时,从细节下手,这时log会派上用场。如果跟合作方在数据方面出现争议也可以及时拿出证据。

  4.添加Exception异常的捕获

  如果你在代码中捕获了某种异常,那你要在try块后添加Exception的捕获,以防出现运行时异常中断程序。

  5.务必打印堆栈信息

  在异常捕获代码中务必要将堆栈信息打印出来,否则打了那么多的log可能会功亏一篑。

  6.多线程的log

  在多线程的程序中,log最好要标记thredId,否则可能不知道是哪个线程的作业,也无法有条理的来观察一个线程。

  7.成功失败标志

  如果某个函数是做一件比较关键的事情,那么这件事情成功还是失败了,要打印log,否则关键事件运行结果如何都拿不出证据的话,实在是不能让人信服。

  8.前后log的关系

  如果是web程序或接口,那log就不是按照你预定的顺序出现的,可能是好几个响应的log穿插在一起的。代码里如果有几条log前后存在一定的数据关系,那么要将这几条log的关联信息打出来,用来确定是针对同一个响应的。如果没有明确的标志,很难说后边的log跟前边的log是同一个响应或者是针对同一条数据。

  9.关于耗时

   访问一个第三方接口、上传下载文件等可能耗时的操作,都要记录完成这个操作所耗的时间。否则程序性能出了问题,你不知道是网络原因呢,还是你调用的第三方接口性能出现问题呢,还是你自己程序的问题呢。

  10.关于数量

   涉及到数量的操作要打印log,比如查询数据库和批量拷贝文件、上传下载、批量格式转换等批量操作,设计到的数量要打印出来。

 

  总之,打log的目的是为了迅速排错或在有争议时拿出证据证明自己。基于这个目的,log不在多,只要抓住一切对自己有利的信息,就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以提供一些建议,但最终决定权在您手中。首先,您可以使用WPF将内容绑定到您的自定义日志窗口,以便将日志记录到文件或数据库中。其次,您可以使用WPF的字体控件来显示日志信息,以便更好地控制日志窗口的外观和布局。最后,您可以使用WPF的调试框架来跟踪和记录您的应用程序的状态,以便更好地理解和检查日志窗口的行为。 ### 回答2: WPF(Windows Presentation Foundation)是一种基于.NET框架的应用程序开发平台,可以用来创建丰富的用户界面。在WPF中编写一个log(日志)窗口可以通过以下步骤完成: 1. 首先,创建一个新的WPF应用程序项目,并在主窗口的XAML文件中设计好日志窗口的界面。可以使用Grid布局或者其他容器来容纳日志信息的显示区域和相关控件。 2. 在窗口的代码文件中,定义一个List或ObservableCollection类型的属性,用于存储日志信息。这个属性将作为数据源绑定到界面上的日志显示区域,以实现动态更新。 3. 在窗口的初始化方法中,将该属性绑定到日志显示区域的ItemsSource属性,以实现日志信息的实时显示。 4. 提供一个公共方法或命令,用于向日志中添加新的信息。这个方法将在用户点击按钮或者其他触发事件的时候调用。 5. 在这个方法内部,将新的日志信息添加到日志信息的属性中。可以使用自定义的数据结构或简单的字符串格式保存日志信息。 6. 当属性值发生改变时,界面上绑定的日志显示区域将自动更新,显示新添加的日志信息。 7. 可以考虑增加一些界面上的控件,比如滚动条,以便用户可以方便地查看较长的日志。可以使用ScrollViewer控件将日志显示区域包裹起来,并根据需要设置自动滚动的属性值。 通过以上步骤,在WPF中实现一个简单的log窗口是十分可行的。这个窗口可以用于显示应用程序的运行日志、错误信息等,提高开发调试和错误追踪的效率。 ### 回答3: WPF(Windows Presentation Foundation)是用于构建 Windows 客户端应用程序的一种技术。要用 WPF 写一个 log 窗口,需要遵循以下步骤: 1. 创建一个 WPF 应用程序项目。在 Visual Studio 中新建项目,选择 WPF 应用程序模板。 2. 在主窗口的 XAML 文件中,布局 log 窗口的外观。可以使用 StackPanel、Grid 或其他布局控件来创建一个容器,用于显示 log 信息。 3. 在代码文件中,定义一个可用于向 log 窗口添加日志信息的方法。可以使用 TextBox 控件来实现。 4. 在定义的方法中,将新的日志信息追加到 TextBox 的 Text 属性中。可以使用字符串拼接或 StringBuilder 等方式。 5. 在应用程序的其他位置,调用这个方法,将需要记录的日志信息传递给 log 窗口。 6. 根据实际需求,可以对 log 窗口进行美化和扩展,例如添加滚动条、日期时间戳等。 7. 在主窗口的 XAML 文件中,添加一个按钮或其他触发事件的控件,用于显示 log 窗口。 8. 为按钮或其他控件的 Click 事件绑定一个函数,在函数中实例化 log 窗口,并显示。 9. 编译和运行应用程序,点击按钮或其他控件时,log 窗口将会显示出来,同时在其他位置添加的日志信息也会在 log 窗口中显示。 总结:通过以上步骤,可以用 WPF 编写一个 log 窗口,用于记录和显示应用程序的日志信息。这个窗口可以在主窗口的一定操作或特定事件发生时进行显示,方便用户或开发者查看和分析日志。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值