这个话题并不新鲜,Google一下“Logging Best Practices”会发现很多相关的资料。日志Log在开发中是非常重要的程序的一部分,如何写出Clean、Readable、Helpful、Descriptive的日志是程序员的基本功!
对于普通开发人员来说,如果程序遇到问题,第一个想到的肯定是看日志Log,可以通过查看日志Log发现出了什么错,便于开发,调试程序,试想如果程序crash了,没有日志Log,发生了什么将一无所知。
很多人忽略日志的重要性,日志可以记录程序的运行状况,出现问题时以便分析。日志不仅是给程序员自己看的,对于系统管理员来说也可以通过写脚本来分析日志,提取对系统运维有用的东西。系统运维相关工具的依据就是日志Log,所以自动监视系统、系统运维人员、系统管理员、开发人员等等,都需要日志Log。
(1)日志种类
根据程序的类型不同,日志种类又很多,比如:
- 操作系统的Log(Windows的Event Log)
- 各个应用程序的Log
- Web服务器的访问日志(Apache的access_log、Nginx的access.log)
- Web应用的日志
等等
很多应用在出现致命错误的时候,其实都会把相应的日志文件上传到服务器去以便分析。
(2)日志工具
基于Java的应用,可选的Logger有很多,而且很多开源框架使用的也不同。
比如Guava使用JUL、Spring和Apache的框架都是用Apache Commons Logging、
不要使用原始的System.out.println("Hello world!");
(3)基础知识
- 输出Log时避免自己出错
- 过多的日志会拖慢系统
- 日志至少应该包含描述和数据
- 重要的日志应该添加特殊的可搜索字符
- 不要输出密码、个人信息、信用卡信息等敏感数据
- 输出重要方法的参数和返回值
- 输出重要方法的开始和结束(异常时是否输出结束日志?)
- 如果和外部系统链接,需要输出INPUT和OUTPUT
- 合理输出异常信息(不要主动输出异常,合理通过框架、共通代码输出;避免异常被输出多次)
- 考虑数据的输出格式,最好输出多种格式利用人看或者工具分析
- 合理输出二进制文件信息(name、size)
(4)输出形式
1) 键值对
引用
key1=value1, key2=value2, key3=value3 . . .
2) JSON
引用
{ "sender" : "michael" "recipient": { "name" : "michael", "name" : "andrea", "name" : "itay" } subject:"I heart logs" }
对于一个Bean对象来说,需要注意他的输出形式,比如对象的Serialization、或者覆写toString()、commons-lang的ToStringBuilder、Arrays#deepToString、Beanutils#collect等等,都可以提高可读性。
(5)日志级别
可能你知道INFO、WARN、ERROR、DEBUG、TRACE,但是90%的开发人员在输出日志的时候就没考虑过日志的级别,只是简单的使用统一级别。
系统上线后会被调整的最优化的级别,而且不同的人会看不同的日志。
(6)配置日志Log
输出格式pattern:
引用
<pattern>%d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n</pattern>
Apache
引用
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"
Ngnix
引用
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"
设置级别:
Rotate日志文件:
日志文件会占用大量的磁盘空间,所以必须rotate日志文件
(7)常见错误
- 设置错误的日志级别
- Catch异常后再Throw
- 日志输出到stderr 或 stdout (System.out.println / e.printStackTrace)
- 复杂的日志代码
引用
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
参考:
Java日志终极指南
Good Logging Practices
10 Tips for Proper Application Logging
Benchmarking Java Logging Frameworks
Java Logging API
Ultimate Guide for Logging
Log4j Best Practices
- 大小: 50.7 KB
- 大小: 21.5 KB
分享到:
相关推荐
这个脚本可能包含`adb logcat -c`命令,该命令会清除设备上当前的所有日志,为新的测试或调试过程提供一个干净的开始。 `get_pid_list.bat`可能涉及到获取运行在设备上的进程ID列表。在`adb shell`下,可以使用`ps`...
5. 利用Python的内置库和第三方库:Python拥有丰富的标准库和第三方库,利用这些库可以写出更高效、更简洁的代码。 总结,干净的代码是软件开发中的基石,它能够提升开发效率,降低维护成本,保障项目的顺利进行。...
JFFS2采用了日志式文件系统的设计,这意味着所有的写操作首先记录在日志区域,然后才更新到数据区,确保了系统的稳定性和数据的一致性。系统由以下几个关键组件构成: 1. 节点(Node):JFFS2将文件和目录等存储为...
Pisac-保持git提交历史记录干净提交是Git存储库的关键部分之一,更重要的是,提交消息是该存储库的生命日志。 随着项目的发展(添加了新功能,修复了错误,重构了架构),提交信函可以看到更改的内容和更改的方式。 ...
【描述】:“自己用python写的桌面清理小工具,配置文件填写保留文件,目录执行脚本,桌面瞬间变干净,相关清理文件会备份到配置目录” 这个描述揭示了该工具的几个核心功能和工作流程: 1. **自定义保留文件**:...
1. **垃圾清理**:通过扫描和分析系统,找出并清理临时文件、系统日志、回收站内容等不必要文件,有效释放硬盘空间。 2. **注册表清理**:检查并修复注册表错误,避免因注册表问题导致的系统不稳定或应用程序异常。...
1. **深度扫描**:该软件能够深入系统各个角落,查找并识别出那些隐藏的、不再需要的文件,如系统临时文件、应用程序缓存、浏览器缓存、日志文件等。 2. **智能分析**:软件内置智能算法,能够根据文件类型和创建...
6. 监控与日志:为了保证系统的稳定性和可追溯性,需要有监控机制跟踪平台的运行状态,并记录操作日志。 7. 可扩展性与性能优化:随着数据量的增长,平台需要具备良好的扩展性,能够处理大量数据的同时保持高性能。...
1. **垃圾文件扫描**:程序能够深入系统各个角落,自动检测并列出无用的系统垃圾文件,如临时文件夹(Temp)、系统日志(Windows Event Log)、应用缓存(Application Cache)等。 2. **注册表清理**:除了清理硬盘...
5. 安全擦出硬盘和格式化硬盘:在回收或替换硬盘时,安全擦出可以彻底清除硬盘上的数据,而格式化则为硬盘创建新的文件系统结构。 6. 恢复阵列卡出厂设置:当遇到阵列卡故障或需要重置配置时,可以恢复出厂设置,但...
2. **日志文件**:系统和应用程序运行时生成的日志文件,这些文件随着时间的推移会越来越多。 3. **注册表垃圾**:卸载软件时,有时会留下未清理干净的注册表项,成为垃圾。 4. **系统还原点**:虽然系统还原点可以...
1. **系统清理**:该工具能够扫描并清除系统中的垃圾文件,如临时文件、日志文件、无效的注册表项等。这些无用文件会占用硬盘空间,降低系统运行效率,通过清理可以释放存储资源,提高系统响应速度。 2. **注册表...
7. **查看阵列卡日志** - 通过查看日志,可以监控阵列卡的工作状态,诊断和解决问题。 ARC程序提供了直观的界面,使得用户能够轻松管理RAID配置。通过Ctrl+A快捷键进入配置程序,可以对ServeRAID 8k-l/8k/8i进行...
3. **干净地使用C构造**:避免过度使用预处理器宏或复杂的指针运算,以减少潜在的错误。 4. **命名变量、函数和文件**:变量、函数和文件名应具有描述性,遵循一致的命名约定。 5. **跨系统类型移植性**:考虑到...
磁盘清理工具可以帮助用户找出并删除这些不必要文件,释放出空间供更重要的文件存储使用。 在提供的压缩包文件名称列表中,我们可以看到以下几个文件: 1. unins000.dat:这通常是安装程序中的卸载信息文件,用于...
Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。Django 2.0版本于2017年12月2日发布,这是多年来的第一次重大更新,它引入了大量新特性,并且彻底停止了对Python 2的支持。在学习Django的...
8. **错误处理与日志记录**:NSIS提供了错误处理机制,如`Abort`命令终止安装,`LogText`记录日志,帮助调试和优化安装过程。 9. **安装逻辑**:通过条件语句和循环结构,开发者可以实现复杂的安装逻辑,比如根据...
11、在事件发生后24小时内写出事件书面报告。报告应包括以下内容:事件发生时间、地点、单位、事件内容,涉及计算机的IP地址、管理人、操作系统、应用服务,损失,事件性质及发生原因,事件处理情况及采取的措施;...