作为第一篇分享的技术类文章,就以这段时间项目遇到的并比较感兴趣的方面做一些知识面的收集以及归纳总结。
什么是日志?用于记录系统操作事件的记录。日志的作用是什?对于运行环境中系统的监控和问题的定位。其实说白了就是为了让人能看懂系统是如何运作的文字记录。
日志重要?我的说法是日志是优秀系统不可或缺的部分,当然非常优秀的系统日志也是必须的,而其他不优秀的呢?Emm .. 可能不关日志事吧。
文章的结构我分为第一部分常用的日志框架和工具,第二部分开发时如何运用日志,第三部分实践log4j的使用。
第一部分常用的日志框架和工具
一、日志框架:
1. log4j–最受欢迎的Java日志组件
Log4j是一款基于Java的开源日志组件,Log4j功能非常强大,我们可以将日志信息输出到控制台、文件、用户界面,也可以输出到操作系统的事件记录器和一些系统常驻进程。更值得一提的是,Log4j可以允许你非常便捷地自定义日志格式和日志等级,可以帮助开发人员全方位地掌控日志信息。
官方网站: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
作者:码农网 – 小峰
第二部分开发时如何运用日志
日志对于运行环境中系统的监控和问题定位是至关重要的,在系统设计、开发和实现的过程中必须时刻注意log的输出,这对于日后的系统监控和异常分析起至关重要的作用 。
日志很重要,但也不能泛滥,如果把程序每一个详细的事件都记录在日志里,性能方面先不说,直观来看,一篇博士论文绝对没有美妙的诗歌好看。
好吧,不扯了,说一下如何做到不滥用日志、减少大量无用信息,让日志记录足够精简明。
一、要知道系统的哪些运行信息需要进行日志记录。
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