JAVA中使用日志的十个技巧

Java日志或者说在Java中使用日志更像是一种科学的艺术。知道如何使用java日志的API绝对是科学的部分,而选择日志的形式,日志记录数据的形式,针对每种数据类型选择不同的日志级别则纯粹是依据你日常学习应用Java日志的经验之谈。事实上Java日志的记录可以严重的影响应用的表现,我亲眼见过由于使用最低的DEBUG日志等级而造成股票交易系统的等待时间增长了数倍。等待时间和响应时间是任何一个电子交易系统或者高并发低延迟的股票交易系统的主要考量因素,学习JAVA日志使用的小技巧和最佳实践是非常有必要的。这些小技巧不仅仅只适用于金融和投资、银行等领域,也适用于任何一个追求响应速度和日志记录的Java服务端和客户端应用。

Java中使用日志的十个技巧

我已经在这边文章中介绍了我使用java的技巧。我曾经尝试回答一些Java日志的使用的基本问题,类似于”为什么我们需要使用日志“,”Java中的日志级别有什么区别和日和选择日志界级别“,”使用不当的日志如何影响程序性能”,讨论log4j和java.util.logging包的工具类,API.

为什么我们需要在Java中使用日志

这是一个Java日志使用的一个基本问题,而且每个人都曾经有过“既然能使用System.out.println()又为何要使用日志来输出信息呢”的想法。几乎所有人学习Java都是从通过System.out.println()打印信息到控制台开始的。但是这样的使用技巧和一些像Log4j或者Java.util.logging这样的日志框架的API比较起来要逊色不少。如果你正在编写一个JAVA服务应用,那么使用日志文件是唯一一提现服务运行情况的方法,而且它会随着你的服务的复杂度提升而变得越来越重要。如果没有日志你将很难搞清楚一些复杂的情况。

Java中的日志级别有什么不同

想要在Java中使用日志必须先了解Java的日志级别的区别

DEBUG 是最低级别限制的日志级别,而且我们应该在应用中所有需要的地方记录日志以供调试,并且该日志级别只应该在开发和测试环境下使用,绝对不能在生产环境中使用。

INFO 的限制级别高于DEBUG,该日志级别应该用来记录类似于服务启动,访问记录,登出记录等用于通知的信息。

WARN 的限制级别高于INFO,通常用来记录警告信息,比如客户端与服务端丢失链接,数据库链接丢失。这个级别的日志是非常重要的,设置它可以方便维护人员监控软件的健康情况以便于更好的处理这些警告。

ERROR的限制级别高于WARN,主要用于记录错误和异常。和WARN一样,它也起到监控的作用。错误级别的日志必须被严肃对待,而且必须被打印出来。

FATAL的日志级别表示软件发生了可能导致软件崩溃或者停止的事件。

OFF代表日志功能即将关闭

这些日志级别基于Log4j的日志框架,比Java.util.logging的API少了SERVE,FINER,FINEST等级别。

在Java中使用log4j或者java.util.logging API

相比java.util.logging,我更推荐使用log4j。虽然java.util.logging的API也同样非常强大,但是我发现log4j更加易用。log4j的日志级别已经能够充分的体现java 中应该有的日志类别。另外log4j还提供了动态修改日志级别的灵活性。而java.util.logging中你想要实现相同的功能则需要额外的使用JMX。

Log4j也可以让你在配置文件中为每一个单独的类配置日志级别的功能。Log4j中你可以使用log4j.properties或者log4j.xml两种格式的文件作为配置文件。另外log4j也是线程安全的。log4j的组件生来就是为了多线程高并发的系统设计的。另外,我也发现java.util.logging的Formatter和Appender组件可以非常方便的用来格式化输出日志内容

Java中记录日志如何影响性能

Java中记录日志会严重的影响软件的性能。日志记录的越多,文件IO就会越来越拖慢你的软件速度。此时选择正确的日志级别显得尤为重要。在不得不记录日志的情况下,则必须在日记级别和日志内容的选择上下功夫。下面的代码展示了如何在java中使用调试模式的日志级别

    if(logger.isDebugEnabled()){
        logger.debug("java logging level is DEBUG Enabled");
    }

在正式环境下应该使用WARN ERROR或者FINEES级别,绝对不要输出DEBUG的日志。我见过一些应用由于使用了DEBUG级别而导致软件极慢的情况

Java中使用日志的10个提醒。。
  1. 在输出debug日志的时候使用isDebugEnabled()方法,它会在生产环境中减少很多的字符串拼接
  2. 谨慎得选择好输出内容和日志级别。输出太多的日志会影响性能,与此同时输出太少的日志则会影响对软件的表现或者问题的分析。
  3. 推荐使用log4j,它提供了配置修改动态生效的功能,只要你配置了log4j配置文件的看门狗功能,它会监视对应的文件目录,当有配置内容更改时,它会自动加载修改的日志配置内容
  4. 使用log4j可以给不同的类配置不同的日志级别。提供了自由定制的灵活选哪个
  5. 另外,日志内容的使用也需要特别注意。别忘了在日志中记录线程名和类名,这样就提供了在多线程环境下分析问题的可能性。我这是最重要的一个提示了。
  6. 保持日志格式的一致性,日志内容有效性。
  7. 在日志记录的前缀中添加日志的来源,可以为你使用grep或者find等unix命令做日志分析整理时提供巨大的便利。
  8. 如果一个日志对象没有设定日志级别,他会使用根日志的输出级别,所以我们通常设置log4j.rootLogger=DEBUG的日志级别(?)
  9. 合理选择日志的数量和级别以保证既能不影响正式环境的执行速度,也不影响在测试环境中分析问题
  10. 对于你和团队的其他人来说,优化日志内容以保证日志内容的简洁和已读性十分重要
  11. 如果你使用SLF4J的话使用格式化字符串的形式比直接拼接字符串更快。
    java
    logger.debug("No of Orders "+ noOfOrder + " for client : "+client);//slower
    logger.debug("No of Executions {} for clients:{}",noOfOrder, client);// faster

    以上的提示和例子给予我自己使用的经验,也许不够完善,我想要听听你们的建议和你们定制Java日志的技巧。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值