Java日志系列——日志门面,阿里日志规约,SLF4J
日志门面
系统架构复杂后产生的问题
当我们的系统变的复杂的之后,难免会集成其他的系统,不同的系统之间可能会使用不同的日志系统。在一个系统中,我们的日志框架可能会出现多个,会出现混乱,而且随着时间的发展,可能会出现新的效率更高的日志系统,如果我们想切换代价会非常的大。如果我们的日志系统能和jdbc一样,有一套自己的规范,其他实现均按照规范去实现,就能很灵活的使用日志框架了。
为什么需要日志门面
日志门面就是为了解决这个问题而出现的一种技术,日志门面是规范,其他的实现按照规范实现各自的日志框架即可,我们程序员基于日志门面编程即可。
常见的日志门面:
- JCL
- slf4j
常见的日志实现:
- JUL
- log4j
- logback
- log4j2
当前最流行的就是logback和log4j2
阿里日志规约
- 应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API。使用门面模式的日志框架,有利于维护和各个类的日志处理方法统一。
- 日志文件推荐至少保存15天,因为有些异常具备以"周"为频次发生的特点。
- 应用中的扩展日志(如打点、临时监控、访问日志等)命名方式: appName_logType_logName.log。logType为日志类型,推荐分类有stats/monitor/visit等;
- logName为日志描述。这种命名的好处:通过文件名就可以知道日志文件属于哪个应用,哪种类型,有什么目的,这也有利于归类查找。
- 对trace/debug/info级别的日志输出,必须使用条件输出形式或者占位符的方式。
- 避免重复打印日志,否则会浪费磁盘空间。务必在日志配置文件中设置additivity=false。
- 异常信息应该包括两类:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字向上抛出。
- 谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免吧服务器磁盘撑爆,并及时删除这些观察日志。
- 可以使用warn日志级别记录用户输入参数错误的情况,避免当用户投诉时无所适从。
规约下载
如果大家需要请私信我,免费给大家(泰山版2020),请大家以学习为目的,不要拿去复印,上传网上赚钱
SLF4J
简单日志门面(Simple Logging Facade For Java)SLF4)主要是为了给Java日志访问提供一套标准、规范的API框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架,例如log4j和logback等。当然sf4j自己也提供了功能较为简单的实现,但是一般很少用到。对于一般的Java项目而言,日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j、 logback等),中间使用桥接器完成桥接。
目前市面上最流行的就是他了
官网地址
两大功能
- 日志框架绑定
- 日志框架桥接
QuickStart
1.引入依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
2.通过工厂获取对象
final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
3.实现
@Test
void test(){
final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
//占位符输出方式
logger.warn("{}first,{}second","zhangsan",18);
}
绑定其他日志实现
SLF4]支持各种日志框架。SLF4J发行版附带了几个称为SLF4J绑定的jar文件,每个绑定对应一个受支持的框架。
绑定步骤
- 添加slf4j-api的依赖
- 使用slf4j的API在项目中进行统一的日志记录
- 绑定具体的日志实现框架
3.1. 绑定已经实现了slf4j的日志框架,直接添加对应依赖
3.2. 绑定没有实现slf4j的日志框架,先添加日志的适配器,再添加实现类的依赖 - slf4j有且仅有一个日志实现框架的绑定(如果出现多个默认使用第一个依赖日志实现)
日志框架桥接
通常,您依赖的某些组件依赖于SLF4J以外的日志记录API。您也可以假设这些组件在不久的将来不会切换到SLF4J。为了解决这种情况,SLF4J附带了几个桥接模块,这些模块将对log4j,JCL和java.utillogging APl的调用重定向,就好像它们是对SLF4J的API一样。
原始使用log4j的api写代码,但是具体的实现给你抽离了,我们依赖了一个中间层,这个层其实是用旧的api操作slf4j,而不是操作具体的实现。
桥接解决的是项目中日志的遗留问题,当系统中存在之前的日志API,可以通过桥接转换到slf4j的实现
- 先去除之前老的日志框架的依赖,必须去掉。
- 添加SLF4J提供的桥接组件,这个组件就是模仿之前老的日志写了一套相同的api,只不过这个api是在调用slf4j的api。
- 为项目添加SLF4J的具体实现。