日志在实际开发以及运维里作用是很大的,如果日志做得好,对于运维的成本将会大大的降低。日志的产生就是给人看的,所以必须得清晰好看,这样才能更好理解,监控和问题的定位。
文章的结构分为第一部分常用的日志框架和工具,第二部分开发时如何运用日志,第三部分实践log4j的使用。
第一部分常用的日志框架和工具
一、日志框架:
1. log4j – 最受欢迎的Java日志组件
为什么最受欢迎?
a.首先Log4j是免费的,是一款基于Java的开源日志组件,
b.可以自定义,包括:
i.日志信息输出位置,如输出到控制台、文件、用户界面,也可以输出到操作系统的事件记录器和一些系统常驻进程。
ii.日志格式和日志等级
官方网站:http://logging.apache.org/log4j/2.x/
2. SLF4J – 基于API的Java日志框架
SLF4J提供了一个简单统一的日志记录接口,开发者在配置和部署时只需要实现这个接口即可实现日志功能。Logging API实现既可以选择直接实现SLF4J接的loging APIs如:NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。
官方网站:http://www.slf4j.org/
3. Commons Logging
Commons Logging的实现不依赖于具体的日志实现工具,仅仅提供一些日志操作的抽象接口,它对其他的日志工具做了封装,比如Log4J,Avalon LogKit, 和JDK 1.4等。
官方网站:http://commons.apache.org/proper/commons-logging/
4. Darks Logs
Darks Logs和log4j类似,也适用于Java、Android等项目,但是Darks Logs使用更加简单,而且对Android端做了非常大的改善。Darks Logs对Sqlite的日志保存增加了Appender。其旨在解决Android日志无法灵活控制日志等级、格式、保存或显示目标等常用操作等的问题。
官方网站:https://github.com/liulhdarks/darks-logs
二、日志工具或系统:
1. gclogviewer – Java日志查看工具
gclogviewer是一个支持jdk 6的gc log可视化工具,和gcviewer相比,gclogviewer支持根据gc log生成GC的趋势图,也支持生成调优建议所需的数据趋势图。
官方网站:http://code.google.com/p/gclogviewer/
2. Flume – Apache日志服务器
之前介绍的都是一些日志记录工具,Flume则是一个日志分析系统,Flume是分布式的,它有一个非常灵活的架构,用来收集、聚合以及移动大量日志数据,并且提供可靠、容错的系统架构。
3.zLogFabric – 日志存储系统
zLogFabric 是一个集成的跨平台日志解决方案,通过消息系统收集各个应用的日志信息存储到一个集中式的系统中。模块化的设计使得服务器可对日志进行存储、转发、警报以及生成日志统计信息。zLogFabric可收集来自文件、syslog、log4j、log4net 以及Windows 事件的数据。
官方网站:http://www.zlogfabric.com/
4.logstash – Java日志管理工具
logstash是一款功能非常强大的日志管理工具,利用logstash,你可以对日志进行传输、处理、管理和检索,并且提供Web接口以便开发者统计和查询日志信息。
官方网站:http://www.logstash.net
第一部分参考文章链接:http://www.codeceo.com/8-java-log-framework.html
作者:码农网 – 小峰
第二部分开发时如何运用日志
运用日志主要就是监控和问题定位,所以在操作日志的过程中根据这个核心做日志的记录即可。
日志很重要,这个再提一下,但是也不能滥用,尽量言简意赅,没必要写博士论文。
一、要知道系统的哪些运行信息需要进行日志记录。
1、功能模块的启动和结束(完整的系统由多个功能模块组成,每个模块负责不同的功能,因此需要对模块的启动和结束进行监控。是否在需要的时机正常加载该模块?又是否在退出结束的时候正常完成结束操作,正常退出?)
2、用户的登录和退出(哪位用户在什么时间通过什么IP登录或退出了系统)
3、系统的关键性操作
a. Inbound log [client side or other side]
b. Outbound log [client side or other side]
c. 数据库连接信息
d. 网络通信状态(Successful or failure)
4、系统运行期间的异常信息
a. Compile exception : NullPointerException
b. System error: OutOfMemoryError
c. Connection exception
d. Conversion exception
e. Business exception handling
二、Log的表达要简单明了一针见血的把话说漂亮
日志信息要求必须精简,过多的无用信息不但对系统分析起不到什么作用,反而会增加系统的运行压力、消耗系统的运行资源
在没有运用其他Logger server的时候可以应用以下的模板:
时间-[线程名][日志等级]-日志输出位置(全类名,可以精确到方法名):日志信息
2013-09-04 10:49:20.296-[Thread-initRedis21504][INFO]-com.shanghai.LoginController.initLogInfo:LingMing[User] is logining
日志信息的内容可以根据不同的情况进行设计,但是前面的时间到日志输出位置必须要保证完整性,这样才有利于日志的分析。
如果有Logger server 那么可以更加简洁表达,如:[事件描述,日志的类型],
详细的实践在下一篇文章【日志系统ELK与Log4j】中会有提到。
三、划分日志等级
日志等级通常分为四种:DEBUG、INFO、WARN、ERROR
DEBUG: 系统调试信息,通常用于开发过程中对系统运行情况的监控,在实际运行环境中不 进行输出。
INFO: 系统运行的关键性信息,通常用于对系统运行情况的监控。
WARN: 告警信息,系统存在潜在的问题,有可能引起运行异常,但此时并未产生异常。
ERROR: 系统错误信息,需要进行及时处理和优化。
详细的日志等级设置以及实现会在下一篇文章【日志系统ELK与Log4j】中会有提到
第二部分参考文章链接:https://www.cnblogs.com/PerkinsZhu/p/6440584.html
第三部分Log4j简单的使用:
project architecture :Spring Boot
Maven dependencies
log4j properties setting
初始化log4j
写一个简单的接口,用postman调用接口做测试:
postman:
第三部分参考文章链接:https://blog.csdn.net/zgc625238677/article/details/52118534
第三部分代码百度硬盘链接:https://pan.baidu.com/s/1A77Y8i7lHA11n6ih--LUdg
提取密码:ei51