怎么写出干净有用的日志

这个话题并不新鲜,Google一下“Logging Best Practices”会发现很多相关的资料。日志Log在开发中是非常重要的程序的一部分,如何写出Clean、Readable、Helpful、Descriptive的日志是程序员的基本功!

对于普通开发人员来说,如果程序遇到问题,第一个想到的肯定是看日志Log,可以通过查看日志Log发现出了什么错,便于开发,调试程序,试想如果程序crash了,没有日志Log,发生了什么将一无所知。

很多人忽略日志的重要性,日志可以记录程序的运行状况,出现问题时以便分析。日志不仅是给程序员自己看的,对于系统管理员来说也可以通过写脚本来分析日志,提取对系统运维有用的东西。系统运维相关工具的依据就是日志Log,所以自动监视系统、系统运维人员、系统管理员、开发人员等等,都需要日志Log。

[b](1)日志种类[/b]
根据程序的类型不同,日志种类又很多,比如:
[list][*]操作系统的Log(Windows的Event Log)
[*]各个应用程序的Log
[*]Web服务器的访问日志(Apache的access_log、Nginx的access.log)
[*]Web应用的日志[/list]等等

很多应用在出现致命错误的时候,其实都会把相应的日志文件上传到服务器去以便分析。

[b](2)日志工具[/b]
基于Java的应用,可选的Logger有很多,而且很多开源框架使用的也不同。
比如Guava使用JUL、Spring和Apache的框架都是用Apache Commons Logging、
[list]
[*][url=http://logging.apache.org/log4j/1.2/]Apache Log4j (1999-2008)[/url]
[*][url=http://commons.apache.org/proper/commons-logging/]Apache Commons Logging (JCL, ACL) (2002)[/url]
[*][url=http://docs.oracle.com/javase/jp/7/api/java/util/logging/Logger.html]java.util.logging (JUL) (2002)[/url]
[*][url=http://logback.qos.ch/]Logback (2006-)[/url]
[*][url=http://www.slf4j.org/]SLF4J (2007-)[/url]
[*][url=http://logging.apache.org/log4j/2.x/]Apache Log4j2 (2012-)[/url]
[*][url=https://github.com/Netflix/blitz4j]Netflix Blitz4j (2012-)[/url][/list]
[color=red]不要使用原始的System.out.println("Hello world!");[/color]

[b](3)基础知识[/b]
[list][*]输出Log时避免自己出错
[*]过多的日志会拖慢系统
[*]日志至少应该包含描述和数据
[*]重要的日志应该添加特殊的可搜索字符
[*]不要输出密码、个人信息、信用卡信息等敏感数据
[*]输出重要方法的参数和返回值
[*]输出重要方法的开始和结束(异常时是否输出结束日志?)
[*]如果和外部系统链接,需要输出INPUT和OUTPUT
[*]合理输出异常信息(不要主动输出异常,合理通过框架、共通代码输出;避免异常被输出多次)
[*]考虑数据的输出格式,最好输出多种格式利用人看或者工具分析
[*]合理输出二进制文件信息(name、size)[/list]

[b](4)输出形式[/b]
1) 键值对[quote]key1=value1, key2=value2, key3=value3 . . .[/quote]
2) JSON[quote]{ "sender" : "michael" "recipient": { "name" : "michael", "name" : "andrea", "name" : "itay" } subject:"I heart logs" }[/quote]
对于一个Bean对象来说,需要注意他的输出形式,比如对象的Serialization、或者覆写toString()、commons-lang的ToStringBuilder、Arrays#deepToString、Beanutils#collect等等,都可以提高可读性。

[b](5)日志级别[/b]
可能你知道INFO、WARN、ERROR、DEBUG、TRACE,但是90%的开发人员在输出日志的时候就没考虑过日志的级别,只是简单的使用统一级别。
系统上线后会被调整的最优化的级别,而且不同的人会看不同的日志。

[b](6)配置日志Log[/b]
输出格式pattern:
[quote]<pattern>%d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n</pattern>[/quote]
Apache
[quote]192.168.56.6 - - [24/Sep/2012:11:11:11 +0900] "GET /info.php HTTP/1.0" 200 9 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0.7) Gecko/20120829 Firefox/10.0.7"[/quote]
Ngnix
[quote]192.168.21.198 - - [06/Mar/2015:18:19:06 +0900] "GET /index.php HTTP/1.1" 200 87243 "-" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36"[/quote]

设置级别:

Rotate日志文件:
日志文件会占用大量的磁盘空间,所以必须rotate日志文件

[b](7)常见错误[/b]
[list][*]设置错误的日志级别
[*]Catch异常后再Throw
[*]日志输出到stderr 或 stdout (System.out.println / e.printStackTrace)
[*]复杂的日志代码[/list]
[quote]Diagnostic Contexts
Contextual logging (e.g. thread name, userId)
Available on log4j, logback, and log4j2
Two different types: Nested & Mapped

NDC
Nested Diagnostic Contexts are stacks
NDC.push(“x”);
NDC.pop();
Useful for debugging looping or recursive structures

MDC
Mapped Diagnostic Context
key-value pairs
MDC.put(“userId”, user.getId())
Usually what you’ll use
Show up in Graylog using the Graylog Appender
[/quote]

[img]http://dl2.iteye.com/upload/attachment/0113/7620/2f519a99-ecc2-39be-a1be-af00aacd17e3.png[/img]
[img]http://dl2.iteye.com/upload/attachment/0113/7622/e59e3114-e7b7-3ff2-bf2b-add12b015803.png[/img]

参考:
[url=http://www.importnew.com/16331.html]Java日志终极指南[/url]
[url=http://blog.schauderhaft.de/2009/09/16/good-logging-practices/]Good Logging Practices[/url]
[url=http://www.javacodegeeks.com/2011/01/10-tips-proper-application-logging.html]10 Tips for Proper Application Logging[/url]
[url=https://www.loggly.com/blog/benchmarking-java-logging-frameworks/]Benchmarking Java Logging Frameworks[/url]
[url=http://www.vogella.com/tutorials/Logging/article.html]Java Logging API[/url]
[url=http://www.loggly.com/ultimate-guide/]Ultimate Guide for Logging[/url]
[url=http://juliusdavies.ca/logging.html]Log4j Best Practices[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值