尽管现在 log4j 逐渐退出历史舞台,但在当时却备受 Java 开发人员的喜爱,甚至 JDK 1.4 也是借鉴了 log4j 之后,终于在官方类库中补齐了日志记录这一短板,它就是j.u.l包。...在《阿里 Java 开发手册》中有一条日志规约:【强制】应用中不可直接使用日志系统 (log4j、logback) 中的 API,而应依赖日志门面 (slf4j、jcl) 中的 API 。...毕竟 getSingleton() 方法返回的 StaticLoggerBinder 实例并没有在 bind() 方法内使用。...当 StaticLoggerBinder 调用其 getSingleton() 这一静态方法时,JVM 便会执行 StaticLoggerBinder 中的()方法,()...方法并不是咱们在 Java 代码中直接编写的方法,而是由编译器自动收集类中静态变量(不包含由 final 关键字修饰的静态常量)的赋值语句和静态初始化代码块合并而产生的;而执行 ()
涉及到的内容:日志系统的关系、Slf4j下载、源文件jar包的使用、Slf4j源码分析、JVM类加载机制浅谈 首先八卦一下这个日志家族的成员,下面这张图虽然没有包含全部的内容,但是基本也涵盖了日志系统的基本内容...commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现! log4j,logback等等才是日志的真正实现。 ...提取出名字,再填写到getLogger静态方法中!...方法中,通过getLoggerFactory获取工厂,然后获取日志对象!...在JVM中,最后的文件都是Class文件,也就是字节码文件,因此需要把该文件加载到JVM中才能运行。而加载的过程,只会执行静态代码块。
在我们的代码中,不需要显式指定具体日志框架(例如:java.util.logging、logback、log4j),而是使用slf4j的API来记录日志便可,最终日志的格式、记录级别、输出方式等通过具体日志框架的配置来实现...; lLoggerFactory:底层日志框架中日志工厂的中介,再其实现类中,通过底层日志框架中的日志工厂获取对应的日志对象; StaticLoggerBinder:静态日志对象绑定,在编译期确定底层日志框架...在第一篇的文章中,笔者介绍了commons-logging的使用,对于commons-logging来说,无需在pom.xml文件中单独引入日志实现框架,便可进行日志打印。...,没有具体的实现,所以在实际开发总需要单独添加底层日志实现。...比较 (1)slf4j使用了静态绑定方式,实现了与底层日志框架的结合, 避免了commons-logging中由于类加载器不同导致的日志加载失败情况的发生; (2)slf4j支持参数化日志打印,也就是占位符
2.1 objection(内存漫游) 列出内存中所有的类 # android hooking list classes sun.util.logging.LoggingSupport sun.util.logging.LoggingSupport...$1 sun.util.logging.LoggingSupport$2 sun.util.logging.PlatformLogger sun.util.logging.PlatformLogger$1...sun.util.logging.PlatformLogger$JavaLoggerProxy sun.util.logging.PlatformLogger$Level sun.util.logging.PlatformLogger...在内存中所有已加载的类的方法中搜索包含特定关键词的方法,上文中可以发现,内存中已加载的类就已经高达11885个了,那么他们的方法一定是类的个数的数倍,整个过程会相当庞大和耗时,见下图2-6。...# android hooking search methods display 图2-6 内存中搜索所有的方法 列出类的所有方法 当搜索到了比较关心的类之后,就可以直接查看它有哪些方法,比如我们想要查看
---- JUL JUL简介 JUL全称 Java Util Logging,它是java原生的日志框架,使用时不需要另外引用第三方的类库,相对其他的框架使用方便,学习简单,主要是使用在小型应用中。...ensureLogManagerInitialized方法,默认配置文件的加载在该方法中完成 final void ensureLogManagerInitialized() {...ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss} %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。...: debug是默认输出级别 ---- 配置文件加载时机 LogManager日志管理器中规定了下面这种配置文件格式名: 配置文件的加载是在静态代码块中完成的: static {...//通过父类方法,将日志信息追加写入到我们规定的文件中 super.subAppend(event); if(fileName !
JUL JUL简介 JUL全称 Java Util Logging,它是java原生的日志框架,使用时不需要另外引用第三方的类库,相对其他的框架使用方便,学习简单,主要是使用在小型应用中。...ensureLogManagerInitialized方法,默认配置文件的加载在该方法中完成 final void ensureLogManagerInitialized() {...ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss} %l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。...: image.png debug是默认输出级别 配置文件加载时机 LogManager日志管理器中规定了下面这种配置文件格式名: 配置文件的加载是在静态代码块中完成的: static...test.log中,旧日志会改名,后缀加上.序号 源码追查: //默认采用日志追加方式 protected void subAppend(LoggingEvent event) { //通过父类方法
我们在子工程可以写一个 main 方法调用方法 org.apache.poi.util.Units 类的 columnWidthToEMU 方法,在父工程同样调用这个方法,发现父工程这个方法报错不存在。...1、调用 class 的 forName 方法时,找不到指定的类。...2、 ClassLoader 中的 findSystemClass() 方法时,找不到指定的类。3、 ClassLoader 中的 loadClass() 方法时,找不到指定的类。...2.2 NoSuchMethodError NoSuchMethodError 就是程序在运行中找不到运行的方法导致的 1、有可能发生的就是 jar 冲突,可能是两个高低版本的 jar 包导致。...2、有可能是有两个 jar 包有相同的类与方法,导致程序调用过程中找不到正确的方法。
版本 2.2.x 日志系统初始化流程 应用启动时,ApplicationStartingEvent触发,屏蔽所有日志 ApplicationEnvironmentPreparedEvent触发,清空所有日志配置...根据系统属性org.springframework.boot.logging.LoggingSystem的值判断选用何种日志系统 private static final Map<String, String....Log4J2LoggingSystem"); systems.put("java.util.logging.LogManager", "org.springframework.boot.logging.java.JavaLoggingSystem...loggingSystem)) { return new NoOpLoggingSystem(); } return get(classLoader, loggingSystem); } // 获取存在的日志系统类...{ initializeWithSpecificConfig(initializationContext, configLocation, logFile); return; } // 没有指定配置文件
开发反馈,突然在本地启动不起来了,表象特征就是在本地IDEA上运行时,进程卡住也不退出,应用启动时加载相关组件的日志也不输出。症状如下图: ?...问题分析 因为没有有用的日志信息,所以不能从日志这个层面上排查问题。但是像这种没有输出日志的话,一般情况下,肯定是程序内部启动流程卡在什么地方了,只能通过打印下当前线程堆栈信息了解下。...出现NoSuchMethodError异常,是因为调用方法的时候,找不到方法了。一般出现在两个有关联的jar包,但是版本对不上了,也就是常说的jar版本依赖冲突。...查看了下,ObjectUtils是spring-core包里的一个类,当前的4.1.3版本确实没有这个unwrapOptional方法,spring-core-5.x的版本才新增了这个方法。...直接移除这个依赖,然后启动系统一切正常,日志打印了Spring加载上线文的信息。 问题总结 定位这个问题的关键在于要了解java中线程堆栈的知识,在没有足够异常日志情况下通过线程快照排查问题。
今天服务器上报错,想先去看一下日志进行排查,结果发现日志很久都没有输出过了。从上午排查到下午,刚刚解决,因此记录一下,但现在也只是知其然,并不知其所以然,所以如果大家有什么想法请在下方评论。...先说一下环境,服务器是linux,项目是运行在tomcat下的Spring项目,日志用的是log4j。 首先,从10月13号开始便没有新的日志文件了。...其实也是怪我自己大意,我其实依赖了一个基于Spring Boot的项目(虽然我只是用了里面的一些domain类,但因为设计不当,还没有把这些domain类单独提成一个_项目),而Spring Boot中一般默认就依赖的...完美,现在是log4j中的实现,得到了我想要的操作。...这次Spring Boot帮我们默认启用的是logback,那么有没有什么简单方法可以知道呢?
从Java 1.4版本开始,Java Logging成为Java SE的功能模块,其实现类存放在java.util.logging包下。...方法,启动的时候可以通过设置VM参数java.util.logging.config.file指定配置文件。...Java Logging API核心类: 日志对象:java.util.logging.Logger 日志级别:java.util.logging.Level 日志管理器:java.util.logging.LogManager...日志处理器:java.util.logging.Handler 日志过滤器:java.util.logging.Filter 日志格式器:java.util.logging.Formatter 日志记录...总结 相较于JCL的动态绑定机制,SLF4J则简单得多,采用静态绑定机制,可能你还没有很好理解这两者的本质区别,看下图: JCL框架自动检查当前环境中是否存在相关日志API,如果有就绑定,注意它内部有个固定的绑定顺序
slf4j作为一个简单日志门面,为各种loging APIs(像java.util.logging, logback, log4j)提供一个简单统一的接口,有利于维护和各个类的日志处理方式统一。...org/slf4j/impl/StaticLoggerBinder.class的资源路径,一般而言只有一个,在本博客中就在logback的jar中,如图 ? ...那么我们需要换目标跟进了,StaticLoggerBinder中只有一段静态块 static { SINGLETON.init(); } 那么我们跟进init方法...也会在classpath中寻找配置文件,先找logback.configurationFile、没有则找logback.groovy,若logback.groovy也没有,则找logback-test.xml...,若logback-test.xml还是没有,则找logback.xml,若连logback.xml也没有,那么说明没有配置logback的配置文件,那么logback则会启用默认的配置(日志信息只会打印在控制台
我们先看一个简单的例子,当我们需要程序中加入方法执行的日志信息的时候,很显然我们最容易想到的实现方法,就是在方法前后插入日志记录信息。...这时候就可以代理模式解决这个问题,代理又分为静态代理(Static proxy)和动态代理(Dynamic proxy) 静态代理 在静态代理模式中,代理与被代理对象必须实现同一个接口,代理专注于实现日志记录需求...void hello(String name) { System.out.println("Hello, " + name); } } 可以看到,在这个类中没有日志记录的代码...,其只需要专注于实现业务功能,而记录日志的工作则可以交给代理对象来实现,代理对象也要实现Ihello接口: HelloProxy.java package Reflection; import java.util.logging...方法的实现中,前后插入了日志记录的方法。
不同于common-logging是在运行时进行的动态绑定,它在编译时静态绑定真正的Log库。...OSGI的这种机制保证了插件互相独立,然而却使Apache Common-Logging无法工作。 slf4j在编译时静态绑定真正的Log库,因此可以在OSGI中使用。...在引入jul-to-slf4j-version.jar后,发现jul的日志并没有通过slf4j输出到指定的地方,这是由于从java.util.logging(JUL)迁移到slf4j——jvm自己的类不允许随便替换...日志记录器Logger 在logback中只有一个日志记录器Logger,继承自org.slf4j.Logger且是final的。...比如下面便是一个例子: 在业务代码里调用MDC类的put方法,往里扔一个有意义的值或者一个随机值。
前言 在使用java开发的过程中时常会碰到以上三个错误,其中NoClassDefFoundError、NoSuchMethodError两个error遭遇得会多一些。...这个错误通常是发生在clinit方法中,具体可能是静态变量,静态代码块。可参考寒泉子大大写的不可逆的类初始化过程 。...NoSuchMethodError 这个比较好理解了,在运行时找不到对应的类的对应方法,通常由于jar包依赖冲突导致。...NoSuchMethodError出现是多半是存在两个同fully qualified name的class,刚好优先加载到了少了方法的那个。...使用方法是,在对应的pom文件右键选择maven菜单中的tree子菜单即可生成tree.txt文件,这个操作等同于在pom文件所在的子module里mvn dependency:tree -Dverbose
日志系统在应用程序生命周期的早期初始化。因此,在通过 @PropertySource 注释加载的属性文件中是找不到日志属性的。另外,logging 属性独立于实际的logging 基础结构。...可以通过在类路径中包含适当的库来激活各种日志系统,还可以通过在类路径的根目录中提供适当的配置文件或在 Spring 环境的 logging.config 属性指定的位置提供适当的配置文件来进一步定制日志系统...另外官方文档中有明确提到,JUL(ava Util Logging) 在 FATJAR 场景下存在一些已知的类加载问题,所以要尽量避免在 FATJAR 场景下使用 JUL。...,如果存在则通过反射构建类型为 entry.getValue() 的对象;SYSTEMS 是 LoggingSystem 抽象类中的一个静态的 MAP 结构变量,其初始化是在静态代码块中完成的: static...AbstractLoggingSystem 处理逻辑 beforeInitialize 在 AbstractLoggingSystem 中没有具体的处理逻辑,是个空方法,所以主要是看下 initialize
使用@Bean给容器中添加组件 /** * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件 * * 在配置文件中用标签添加组件...* */ @Configuration public class MyAppConfig { //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名 @Bean...new HelloService(); } } 日志框架 市面上的框架 JUL(java.util.logging) JCL(Apache Commons Logging) Log4j Log4j2...spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件 logging.path=/spring/log # 在控制台输出的日志的格式 logging.pattern.console.../ 便会去静态资源文件夹下找index页面 *所有的 */favicon.ico 都是在静态资源文件下找 2)模板引擎 市面上常见的模板引擎: JSP Velocity Freemarker Thymeleaf
领取专属 10元无门槛券
手把手带您无忧上云