首页 > 其他 > 详细

日志相关

时间:2020-06-30 21:46:24      阅读:63      评论:0      收藏:0      [点我收藏+]

日志相关

slf4j-api、slf4j-log4j12以及log4j之间的关系

slf4jSimple Logging Facade for Java,为java提供的简单日志Facade。Facade:门面,更底层一点说就是接口。他允许用户以自己的喜好,在工程中通过slf4j接入不同的日志系统。

slf4j入口就是众多接口的集合,他不负责具体的日志实现,只在编译时负责寻找合适的日志系统进行绑定。具体有哪些接口,全部都定义在slf4j-api中。查看slf4j-api源码就可以发现,里面除了public final class LoggerFactory类之外,都是接口定义。

总结

当系统采用log4j作为日志框架实现的调用关系:

  • 首先系统包含slf4j-api作为日志接入的接口;

在编译时slf4j-api中public final class LoggerFactor类中的private final static void bind() 方法会寻找具体的日志实现类绑定主要通过StaticLoggerBinder.getSingleton();语句调用

  • slf4j-log4j12

链接slf4j-api和log4j中间的适配器。它实现了slf4j-apiStaticLoggerBinder接口,从而使得在编译时绑定的是slf4j-log4j12的getSingleton()方法

  • log4j

这个是具体的日志系统。通过slf4j-log4j12初始化Log4j,达到最终日志的输出。

拓展

简述

市场上存在非常多的日志框架。JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j2,Logback、SLF4j、jboss-logging等。Spring在框架内容部使用JCL,spring-boot-starter-logging采用了sif4j+logback的形式,Spring Boot也能自动适配(jul、log4j2、logback)并简化配置

技术分享图片

日志框架历史:

  • JCL:是Apache的一个日志框架,由于是Jakarta小组写的所以命名为JCL,但是最近的一次更新也是在2014年,所以太老了,不推荐使用
  • jboss-logging:使用的场景太少了,不适合使用
  • Log4j:首次出来,使用状况还不错,但是存在性能问题,所以作者准备升级一下
  • Logback:Log4j的作者觉得重写框架可能太费时间,于是重新写了一个,这就是日志实现
  • SLF4j:这个就是Log4j2的日志门面
  • Log4j2:是Apache所写的,但是写的太好,许多框架并不适配它

Spring使用JCL也就是commons-logging

SpringBoot选用 SLF4jlogback

SLF4j的使用

如何在系统中使用SLF4j

以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法;

给系统里面导入slf4j的jar和 logback的实现jar

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(HelloWorld.class);
        logger.info("Hello World");
    }
}

图示;

技术分享图片

每一个日志的实现框架都有自己的配置文件。使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件;

遗留问题

a(slf4j+logback): Spring(commons-logging)、Hibernate(jboss-logging)、MyBatis、xxxx

统一日志记录,即使是别的框架和我一起统一使用slf4j进行输出?

技术分享图片

如何让系统中所有的日志都统一到slf4j;

1、将系统中其他日志框架先排除出去;

2、用中间包来替换原有的日志框架;

3、我们导入slf4j其他的实现

log4j配置文件

log4j.properties

log4j.rootLogger=debug, stdout, R
 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 
# Pattern to output the caller‘s file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
 
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=5
 
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

log4j.properties解释

设置日志输出的等级为debug,低于debug就不会输出了
设置日志输出到两种地方,分别叫做 stdoutR

log4j.rootLogger=debug, stdout, R

第一个地方stdout, 输出到控制台

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

输出格式是 %5p [%t] (%F:%L) - %m%n

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

第二个地方R, 以滚动的方式输出到文件,文件名是example.log,文件最大100k, 最多滚动5个文件

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=5

输出格式是 %p %t %c - %m%n,在下个步骤讲解

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

输出格式

log4j日志输出格式一览

  • %c 输出日志信息所属的类的全名
  • %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
  • %f 输出日志信息所属的类的类名
  • %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
  • %m 输出代码中指定的信息,如log(message)中的message
  • %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
  • %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
  • %r 输出自应用启动到输出该日志信息所耗费的毫秒数
  • %t 输出产生该日志事件的线程名

%5p [%t] (%F:%L) - %m%n 就表示:宽度是5的优先等级 线程名称 (文件名:行号) - 信息 回车换行

技术分享图片

文章参考链接

日志相关

原文:https://www.cnblogs.com/hemou/p/13215754.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!