精华内容
下载资源
问答
  • Java的日志框架

    2017-10-22 18:49:23
    1 java中常听到的日志框架最常听到的:Log4j, Log4j2 ,SLF4J,logback. 其他日志框架:Apache Common-Logging ,java.util.Logging 等等2 日志之间的关系SLF4J 框架不是一个真正的日志框架,而是一个日志的抽象。...

    1 java中常听到的日志框架

    最常听到的:Log4j, Log4j2 ,SLF4J,logback.
    其他日志框架:Apache Common-Logging ,java.util.Logging 等等

    2 日志之间的关系

    SLF4J 框架不是一个真正的日志框架,而是一个日志的抽象。这样允许你在你的编程过程中使用任意一个日志类库。通俗的讲SLF4J就像是一个接口而Log4j, Log4j2 这些就像是SLF4J的实现。在编程过程中尽量使用SLF4J的抽象接口而不是使用具体的实现。

    展开全文
  • 关于java的日志框架

    2019-05-29 11:23:00
     Log4j是Apache的一个开放源代码项目,Spring Boot1.4以及之后的版本已经不支持log4j ,log4j也很久没有更新了,现在已经有很多其他的日志框架对Log4j进行了改良,比如说SLF4J、Logback等。 Log4j2  而且Log4j 2...

      

    Log4j

      Log4j是Apache的一个开放源代码项目,Spring Boot1.4以及之后的版本已经不支持log4j ,log4j也很久没有更新了,现在已经有很多其他的日志框架对Log4j进行了改良,比如说SLF4J、Logback等。

    Log4j2

      而且Log4j 2在各个方面都与Logback非常相似,那么为什么我们还需要Log4j 2呢

           1. 插件式结构。Log4j 2支持插件式结构。我们可以根据自己的需要自行扩展Log4j 2. 我们可以实现自己的appender、logger、filter。 
      2. 配置文件优化。在配置文件中可以引用属性,还可以直接替代或传递到组件。而且支持json格式的配置文件。不像其他的日志框架,它在重新配置的时候不会丢失之前的日志文件。 
      3. Java 5的并发性。Log4j 2利用Java 5中的并发特性支持,尽可能地执行最低层次的加锁。解决了在log4j 1.x中存留的死锁的问题。 
      4. 异步logger。Log4j 2是基于LMAX Disruptor库的。在多线程的场景下,和已有的日志框架相比,异步的logger拥有10倍左右的效率提升。

      官方建议一般程序员查看的日志改成异步方式,一些运营日志改成同步。日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影响。

           异步日志在程序的classpath需要加载disruptor-3.0.0.jar或者更高的版本。

        <dependency>

              <groupId>com.lmax</groupId>
              <artifactId>disruptor</artifactId>
              <version>3.3.6</version>
          </dependency>

    异步日志分为两种: 

    a.全异步模式 
      这种异步日志方式,不需要修改修改原理的配置文件,Logger仍然使用<root> and <logger> 
      只需要在主程序代码开头,加一句系统属性的代码:

      System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector")

    b.异步和非异步混合输出模式 

       在配置文件中Logger使用<asyncRoot> or <asyncLogger>

    <loggers>  
         <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true">  
            <appender-ref ref="Console" />  
            <appender-ref ref="debugLog" />  
            <appender-ref ref="errorLog" />  
        </AsyncLogger>  
    
        <asyncRoot level="trace" includeLocation="true">  
            <appender-ref ref="Console" />  
        </asyncRoot>   
    </loggers>  

    引入log4j2依赖 
      在创建Spring Boot工程时,我们引入了spring-boot-starter,其中包含了spring-boot-starter-logging,该依赖内容就是Spring Boot默认的日志框架Logback,

    所以我们在引入log4j2之前,需要先排除该包的依赖,再引入log4j2的依赖。

      log4j2.xml配置 
    有一点需要注意的是,假如想要在application.properties中指定日志文件存放路径或日志文件名,在log4j2.xml中使用${LOG_PATH}或者${LOG_FILE}来引用,是无法获取到的(在logback中可以尽情使用)。

     log4j2支持xml、json、yaml等格式的配置文件。

     

    SLF4J

    SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,而是通过Facade Pattern提供一些Java logging API,它只服务于各种各样的日志系统。
    按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。作者创建SLF4J的目的是为了替代Jakarta Commons-Logging。 
    实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。
    类似于Apache Common-Logging,SLF4J是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。
    但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。
    SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。

    那么什么时候使用SLF4J比较合适呢? 
    如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,

    确定只有一种日志系统,那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用JDK 1.8 Logging的用户时,面对成千上万的log4j调用的修改,

    相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J,那么这种转换将是非常轻松的事情。

    Logback

    Logback,一个“可靠、通用、快速而又灵活的Java日志框架”。

    logback当前分成三个模块:

                logback-core,

                logback- classic

                logback-access。

    logback-core是其它两个模块的基础模块。

    logback-classic是log4j的一个改良版本。

      此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK Logging。

      logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。 

     选择logback的理由: 
    1. logback比log4j要快大约10倍,而且消耗更少的内存。 
    2. logback-classic模块直接实现了SLF4J的接口,所以我们迁移到logback几乎是零开销的。 
    3. logback不仅支持xml格式的配置文件,还支持groovy格式的配置文件。相比之下,Groovy风格的配置文件更加直观,简洁。 
    4. logback-classic能够检测到配置文件的更新,并且自动重新加载配置文件。 
    5. logback能够优雅的从I/O异常中恢复,从而我们不用重新启动应用程序来恢复logger。 
    6. logback能够根据配置文件中设置的上限值,自动删除旧的日志文件。 
    7. logback能够自动压缩日志文件。 
    8. logback能够在配置文件中加入条件判断(if-then-else)。可以避免不同的开发环境(dev、test、uat…)的配置文件的重复。 
    9. logback带来更多的filter。 
    10. logback的stack trace中会包含详细的包信息。 
    11. logback-access和Jetty、Tomcat集成提供了功能强大的HTTP-access日志。 
    配置文件:需要在项目的src目录下建立一个logback.xml。 
    注:(1)logback首先会试着查找logback.groovy文件; 
    (2)当没有找到时,继续试着查找logback-test.xml文件; 
    (3)当没有找到时,继续试着查找logback.xml文件; 
    (4)如果仍然没有找到,则使用默认配置(打印到控制台)。

     

     

    Apache Commons Logging

    Apache Commons Logging ,之前叫 Jakarta Commons Logging(JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4+等,进行了简单的包装,此接口更接近于Log4J和LogKit的实现。 
    common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。当然,common-logging内部有一个Simple logger的简单实现,但是功能很弱。所以使用common-logging,通常都是配合着log4j来使用。使用它的好处就是,代码依赖是common-logging而非log4j, 避免了和具体的日志方案直接耦合,在有必要时,可以更改日志实现的第三方库。 
    使用common-logging的常见代码:

    转载于:https://www.cnblogs.com/liuwd/p/10942718.html

    展开全文
  • 可以看到,这个模块包名是apachecommons.logging,因为这是spring团队对common.logging 进行了重写,所以包名还保留之前apache.commons.logging。 这个模块非常简单,对外其实就提供了一个LogFactory类,提供...

    1、 spring-jcl模块结构

    在这里插入图片描述
    可以看到,这个模块的包名是apache的commons.logging,因为这是spring团队对common.logging 进行了重写,所以包名还保留之前的apache.commons.logging。
    这个模块非常简单,对外其实就提供了一个LogFactory类,提供两个方法,得到 Log的接口的实例

    public abstract class LogFactory {
    	public static Log getLog(Class<?> clazz) {
    		return getLog(clazz.getName());
    	}
    	public static Log getLog(String name) {
    		return LogAdapter.createLog(name);
    	}
    	 后面还有几个方法,被弃用了
    }
    

    这里可以看到这其实就一个包装,真正的实现逻辑在LogAdapter里面
    下面我们看一下LogAdapter类,
    (简化版本)

    final class LogAdapter {
      静态代码块 
      作用:根据classpath加载类,来决定采用什么Log日志实现,对枚举类赋值。
    ///  这里定义了 一个枚举类:LogApi
    private enum LogApi {LOG4J, SLF4J_LAL, SLF4J, JUL}
    static {
    		if (isPresent("org.apache.logging.log4j.spi.ExtendedLogger")) {
    		/// 说明有 log4j-api jar包
    			if (isPresent("org.apache.logging.slf4j.SLF4JProvider") && isPresent("org.slf4j.spi.LocationAwareLogger")) {
    				// 如果有log4j-to-slf4j jar包,也有 slf4j-api 那就采用 slf4j
    				// 这里总结就是 如果有log4j 也有 log4j-to-slf4j ,那就直接用slf4j日志
    				logApi = LogApi.SLF4J_LAL;
    			}
    			else {
    			///  如果不存在 log4j转 slf4j 的话,那就采用log4j来进行日志记录
    			///  所以总得来说   log4j的优先级比较高
    				logApi = LogApi.LOG4J;
    			}
    		}
    		else if (isPresent("org.slf4j.spi.LocationAwareLogger")) {
    		/// 这里是对应 slf4j 1.3以及以后的版本,因为在1.3以后才有了LocationAwareLogger类
    			logApi = LogApi.SLF4J_LAL;
    		}
    		else if (isPresent("org.slf4j.Logger")) {
    		/// 这里是对应 slf4j 1.3之前的版本,之前的版本没有LocationAwareLogger类
    			logApi = LogApi.SLF4J;
    		}
    		else {
    		 默认采用 jdk的 日志类 jul
    			logApi = LogApi.JUL;
    		}
    	}
    	///  提供给LogFactory类调用
    	private static class Log4jAdapter {
    		public static Log createLog(String name) {
    			return new Log4jLog(name);
    		}
    	}
    	 根据 枚举类型,决定采用哪种类型的Log
    	 这里有 由 三个Adapter内部类  来完成创建
    	public static Log createLog(String name) {
    		switch (logApi) {
    			case LOG4J:
    				return Log4jAdapter.createLog(name);
    			case SLF4J_LAL:
    				return Slf4jAdapter.createLocationAwareLog(name);
    			case SLF4J:
    				return Slf4jAdapter.createLog(name);
    			default:
    				return JavaUtilAdapter.createLog(name);
    		}
    	}
    	/  下面三个Adapter内部类,用来返回不同Log接口的实现类
    	private static class Log4jAdapter{
    		///  这个内部类会返回的Log接口的实现对象,底层会调用Log4j 日志实现
    	}
    	private static class Slf4jAdapter{
    		///  这个类 两个方法  返回的Log接口的实现对象,底层会调用  Slf4j的机制,在找到真正的日志实现组建
    		public static Log createLocationAwareLog(String name){
    		}
    		public static Log createLog(String name){
    		}
    	}
    	private static class JavaUtilAdapter{
    	  这个内部类,返回的Log接口的实现类,底层调用 jdk自带的 日志实现,即 jul(java.util.log)
    	}
    	/   四个Log接口的实现内部类 分布对应上面三个Adapter的返回对象 这里就不写了
    	private static class Log4jLog implements Log, Serializable{}
    	private static class Slf4jLog<T extends Logger> implements Log, Serializable {}
    	private static class Slf4jLocationAwareLog extends Slf4jLog<LocationAwareLogger> implements Serializable{}
    	private static class JavaUtilLog implements Log, Serializable
    	
    	///  这个类是 为jdk的日志服务的
    	private static class LocationResolvingLogRecord extends LogRecord 
    
    
    }
    

    2、static代码块逻辑(决定了底层采用什么日志类型)

    关于static代码块里面的处理逻辑:
    这里有一个优先级:LOG4J2 级是最高的,其次是SLF4J (1.3版本及以后)、SLF4J(1.3版本之前)、JUL
    这里有一个逻辑比较饶: 如果有LOG4J2 但是还存在SLF4J和log4j-to-slf4j.jar,那么就直接采用SLF4J。 因为SLF4J和log4j-to-slf4j.jar的存在,就会使得LOG4J2最终由SLF4J实现,所以Spring就直接采用SLF4J了。
    总结: spring-jcl 是对Apache Commons Logging 的改造版本,采用的设计模式是“适配器模式”,它对外提供统一的接口,然后在适配类中将对日志的操作委托给具体的日志框架。
    在Spring-JCL中对外有两个统一的接口,分别是Log和LogFactory。
    LogFactory返回的Log的实现是由运行时决定的,可能有SLF4J 、LOG4J2、JUL中的一种实现。

    3、关于java的日志系统

    简单说一下:
    关于java日志系统的使用总的来说有两种:

    一种:代码中直接使用固定日志框架,例如JUL、Log4J1、Log4J2、Logback
    另一种:代码中使用日志接口,例如SLF4J、commons-logging

    日志实现框架有:
    1、JDK自带的logging日志框架 java.util.logging,简称 JUL
    2、Log4J1:
    3、Log4J2 :Log4j1的升级版,发生了很大的变化,不兼容。并且推出了Log4J-api的面向接口编程
    4、Logback:SLF4J提的一种日志框架
    日志接口框架有:
    1、apache的commons-logging
    2、SLF4J
    日志接口是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现

    本来还想写点关于java中日志的一些对比,但是后来看到了下面这篇文章,就放弃了
    因为写得太好了,无法超越啊 😄
    强烈推荐大家看乒乓狂魔的这篇文章(共4章):jdk-logging、log4j、logback日志介绍及原理

    展开全文
  • 刚刚接触java的日志框架和日志系统时,完全搞不清楚他们之间的关系,也不是很清楚,自己使用的具体是哪种框架那种系统。今天好好总结一下他们之间的关系。在说明关系前,先明确两个概念:1. 日志系统:日志的具体实现...

    刚刚接触java的日志框架和日志系统时,完全搞不清楚他们之间的关系,也不是很清楚,自己使用的具体是哪种框架那种系统。今天好好总结一下他们之间的关系。

    在说明关系前,先明确两个概念:

    1. 日志系统:日志的具体实现。经典的有log4j;jdk自带的有java.util.Logging; 还有log4j作者推出的被高度评价的logBack等等。

    2. 日志框架:如果只存在一种日志系统,日志框架完全没有必要存在(logBack无法独立使用),但事与愿违。为了解决多个日志系统的兼容问题,日志框架应运而生。主流的日志框架有commons-logging和sl4j。

    commons-logging是apache推出的日志框架,commons-logging只是规定了日志的接口,其设计原理类似于jdk中servlet和jdbc的设计。主流的日志系统都实现了commons-logging定义的接口,这样就看通过commons-logging统一的使用的日志,而不用关系具体使用的是哪种日志系统。Commons-logging+log4j : 经典的一个日志实现方案。出现在各种框架里。如spring 、webx 、ibatis 等等。直接使用log4j 即可满足我们的日志方案。但是一般为了避免直接依赖具体的日志实现,一般都是结合commons-logging 来实现。常见代码如下:

    import org.apache.commons.logging.Log;

    import org.apache.commons.logging.LogFactory;

    private static Log logger = LogFactory.getLog(CommonsLoggingTest.class);

    Logback : LOGBack 作为一个通用可靠、快速灵活的日志框架,将作为Log4j 的替代和SLF4J 组成新的日志系统的完整实现。官网上称具有极佳的性能,在关键路径上执行速度是log4j 的10 倍,且内存消耗更少。具体优势见:

    Logback必须配合sl4j使用。由于logback和sl4j是同一个作者,其兼容性不言而喻。但sl4j面临与其他日志框架和日志系统的兼容性问题。

    1. JCL-over-sl4j:它重写了commons-logging的API,并将所有日志输出转向sl4j。这样就避免了两套日志框架并存的问题。由于JCL-over-SLF4J和原来的commons-logging具有完全相同的API,因此两者是不能共存的。

    2. sl4j-*12: 具体的如 sl4j-lo4j12 其实现了sl4j的接口并将日志引入log4j。

    一图胜千言:

    99f93afb47438a57d52d45a0c1c76ff2.png

    展开全文
  • Java日志框架-Java常用日志框架介绍 一 Java日志概述 日志框架概念 对于一个应用程序来说日志记录是具有重要意义。 日志通常用于线上问题追踪,协助定位业务问题或程序问题,以及基于日志业务逻辑统计分析等...
  • Java常用日志框架总结

    2021-01-28 20:33:18
    前言 作为java程序员,在工作开发中遇到最多的一个问题就是打日志(log),好的日志方式可以帮助你...Log4j: apache基于java的日志框架 Log4j2: apache基于log4j的升级版本 JUL: 2002年,java 1.4发布,定义了jav
  • 文章中若有错误和疏漏之处,还请各位大佬不吝指出,谢谢大家.java日志框架有很多,这篇文章我们来整理一下各大主流的日志框架,包括log4j logback jul(java.util.logging) jcl(commons-logging) slf4j(simple log facade...
  • Java 日志框架

    2020-05-05 17:39:41
    原本对Java的日志框架都是一知半解,已有的项目都是其他同事配置好了日志相关的东西,顶多改改日志输出路径。所以对这块不怎么关注。直到遇到了个日志诡异性问题(weblogic中web项目不打印日志,logback失效 ),才...
  • Java常用日志框架及实现

    千次阅读 2015-12-16 09:32:53
    本文简单介绍了一下Java的日志框架,包括接口库和实现库,并在具体使用选择上给出了一些建议。 日志接口库 common-logging common-logging为众多具体的日志实现库提供了一个统一的接口。它允许在运行时绑定到...
  • Java日志框架

    2018-02-24 14:16:39
    Java的日志框架主要分为两大类,一类是实际记录日志的框架,比如log4j、log4j2、logback和JDK Logging等,另一类其实是统一的日志规范接口,使用了设计模式当中的外观模式(Facade模式),比如SLF4j(Simple Logging...
  • JUL是java原生的日志框架,在java
  • java日志框架

    2020-02-12 00:07:42
    比如JDKj.u.l(java.util.logging),apachelog4j ,logback以及log4j2 等,这类日志框架主要作用是配置日志输出到控制台,文件,发布到哪。 二是日志门面 日志门面其实就是java程序和日志框架的中间层。阿里巴巴...
  • JCL,全称为"Jakarta Commons Logging",也可称为"Apache ...JCL采用了设计模式中的“适配器模式”,它对外提供统一的接口,然后在适配类中将对日志的操作委托给具体的日志框架,比如Log4J,Java Logging API等。在JC...
  • Java常用日志框架介绍

    2019-03-16 13:44:22
    Java常用日志框架介绍 目录 Java日志概述 Java常用日志框架类别 Java常用日志框架历史 java常用日志框架关系 Commons Logging与Slf4j实现机制对比 Commons Logging实现机制 Slf4j实现机制 项目中选择日志...
  • 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用、WEB应用以及移动应用。然而日志系统是一个成熟...本文要来分享一些Java程序员最常用的Java日志框架组件。1、Log4j – 最受欢迎的Java日志组件Log4j...
  • Java 日志框架的选择Commons Logging Java简易日志门面(Simple Logging Facade for Java,缩写SLF4J)Apache Log4j 2是apache开发一款Log4j升级产品,并且不兼容Log4j。#### ConsoleAppender:控制台输出 ####log4j...
  • 分享Java日志框架和Springboot日志框架的相关知识点
  • 编辑推荐:本文来自于csdn,主要讲解了常用的日志框架,统一日志模块,各个日志的功能演示等等。前言作为一名资深的开发人员,对于日志记录框架一定不会很陌生。而且几乎在所有应用里面,一定会用到各种各样的日志框架...
  • java常用日志框架介绍

    2018-06-13 11:46:27
    转载自:java常用日志框架介绍 ...java领域存在多种日志框架,目前常用的日志框架包括Log4j,Log4j 2,Commons Logging,Slf4j,Logback,Jul。 java常用日志框架类别介绍 Log4j Apache Log4j是一个基于J...
  • javalearns 随时随地学Java或扫一扫 随时随地学Java应用系统中,日志是不可缺少的重要组成部分,所有的应用的出错信息等都应该能在日志文件中查找到,有的应用系统日志可能数量很小,有的庞大的应用系统的日志是相当...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,690
精华内容 2,276
关键字:

java的日志框架

java 订阅