首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你好,SLF4J

尽管现在 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 关键字修饰的静态常量)的赋值语句和静态初始化代码块合并而产生的;而执行 ()

62820

日志那点事儿——slf4j源码剖析

涉及到的内容:日志系统的关系、Slf4j下载、源文件jar包的使用、Slf4j源码分析、JVM加载机制浅谈   首先八卦一下这个日志家族的成员,下面这张图虽然没有包含全部的内容,但是基本也涵盖了日志系统的基本内容...commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现!   log4j,logback等等才是日志的真正实现。   ...提取出名字,再填写到getLogger静态方法!...方法,通过getLoggerFactory获取工厂,然后获取日志对象!...JVM,最后的文件都是Class文件,也就是字节码文件,因此需要把该文件加载到JVM才能运行。而加载的过程,只会执行静态代码块。

92950
您找到你想要的搜索结果了吗?
是的
没有找到

Java日志体系(slf4j)

我们的代码,不需要显式指定具体日志框架(例如:java.util.logging、logback、log4j),而是使用slf4j的API来记录日志便可,最终日志的格式、记录级别、输出方式等通过具体日志框架的配置来实现...; lLoggerFactory:底层日志框架中日志工厂的中介,再其实现,通过底层日志框架日志工厂获取对应的日志对象; StaticLoggerBinder:静态日志对象绑定,在编译期确定底层日志框架...第一篇的文章,笔者介绍了commons-logging的使用,对于commons-logging来说,无需pom.xml文件单独引入日志实现框架,便可进行日志打印。...,没有具体的实现,所以实际开发总需要单独添加底层日志实现。...比较 (1)slf4j使用了静态绑定方式,实现了与底层日志框架的结合, 避免了commons-logging由于加载器不同导致的日志加载失败情况的发生; (2)slf4j支持参数化日志打印,也就是占位符

4.6K71

实用FRIDA进阶:内存漫游、hook anywhere、抓包

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 内存搜索所有的方法 列出的所有方法 当搜索到了比较关心的之后,就可以直接查看它有哪些方法,比如我们想要查看

2.8K11

实用FRIDA进阶:内存漫游、hook anywhere、抓包

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 内存搜索所有的方法 列出的所有方法 当搜索到了比较关心的之后,就可以直接查看它有哪些方法,比如我们想要查看

2.3K00

Java日志框架学习--JUL和Log4j--上

---- 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 !

43710

Java日志框架学习--上

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) { //通过父方法

43220

记录一次 Spring boot 应用排错过程

开发反馈,突然本地启动不起来了,表象特征就是本地IDEA上运行时,进程卡住也不退出,应用启动时加载相关组件的日志也不输出。症状如下图: ?...问题分析 因为没有有用的日志信息,所以不能从日志这个层面上排查问题。但是像这种没有输出日志的话,一般情况下,肯定是程序内部启动流程卡在什么地方了,只能通过打印下当前线程堆栈信息了解下。...出现NoSuchMethodError异常,是因为调用方法的时候,找不到方法了。一般出现在两个有关联的jar包,但是版本对不上了,也就是常说的jar版本依赖冲突。...查看了下,ObjectUtils是spring-core包里的一个,当前的4.1.3版本确实没有这个unwrapOptional方法,spring-core-5.x的版本才新增了这个方法。...直接移除这个依赖,然后启动系统一切正常,日志打印了Spring加载上线文的信息。 问题总结 定位这个问题的关键在于要了解java中线程堆栈的知识,没有足够异常日志情况下通过线程快照排查问题。

77310

记一次SpringBoot项目启动卡住问题排查记录

开发反馈,突然本地启动不起来了,表象特征就是本地IDEA上运行时,进程卡住也不退出,应用启动时加载相关组件的日志也不输出。症状如下图: ?...问题分析 因为没有有用的日志信息,所以不能从日志这个层面上排查问题。但是像这种没有输出日志的话,一般情况下,肯定是程序内部启动流程卡在什么地方了,只能通过打印下当前线程堆栈信息了解下。...出现NoSuchMethodError异常,是因为调用方法的时候,找不到方法了。一般出现在两个有关联的jar包,但是版本对不上了,也就是常说的jar版本依赖冲突。...查看了下,ObjectUtils是spring-core包里的一个,当前的4.1.3版本确实没有这个unwrapOptional方法,spring-core-5.x的版本才新增了这个方法。...直接移除这个依赖,然后启动系统一切正常,日志打印了Spring加载上线文的信息。 问题总结 定位这个问题的关键在于要了解java中线程堆栈的知识,没有足够异常日志情况下通过线程快照排查问题。

5.6K20

log4j日志不输出的问题

今天服务器上报错,想先去看一下日志进行排查,结果发现日志很久都没有输出过了。从上午排查到下午,刚刚解决,因此记录一下,但现在也只是知其然,并不知其所以然,所以如果大家有什么想法请在下方评论。...先说一下环境,服务器是linux,项目是运行在tomcat下的Spring项目,日志用的是log4j。 首先,从10月13号开始便没有新的日志文件了。...其实也是怪我自己大意,我其实依赖了一个基于Spring Boot的项目(虽然我只是用了里面的一些domain,但因为设计不当,还没有把这些domain单独提成一个_项目),而Spring Boot中一般默认就依赖的...完美,现在是log4j的实现,得到了我想要的操作。...这次Spring Boot帮我们默认启用的是logback,那么有没有什么简单方法可以知道呢?

2.7K20

【编程开发】- 01 日志框架

从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,如果有就绑定,注意它内部有个固定的绑定顺序

72931

从源码来理解slf4j的绑定,以及logback对配置文件的加载

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则会启用默认的配置(日志信息只会打印控制台

1.2K40

Java动态代理与静态代理静态代理动态代理

我们先看一个简单的例子,当我们需要程序中加入方法执行的日志信息的时候,很显然我们最容易想到的实现方法,就是方法前后插入日志记录信息。...这时候就可以代理模式解决这个问题,代理又分为静态代理(Static proxy)和动态代理(Dynamic proxy) 静态代理 静态代理模式,代理与被代理对象必须实现同一个接口,代理专注于实现日志记录需求...void hello(String name) { System.out.println("Hello, " + name); } } 可以看到,在这个没有日志记录的代码...,其只需要专注于实现业务功能,而记录日志的工作则可以交给代理对象来实现,代理对象也要实现Ihello接口: HelloProxy.java package Reflection; import java.util.logging...方法的实现,前后插入了日志记录的方法

48320

ClassNotFoundException,NoClassDefFoundError,NoSuchMethodError排查

前言 使用java开发的过程时常会碰到以上三个错误,其中NoClassDefFoundError、NoSuchMethodError两个error遭遇得会多一些。...这个错误通常是发生在clinit方法,具体可能是静态变量,静态代码块。可参考寒泉子大大写的不可逆的初始化过程 。...NoSuchMethodError 这个比较好理解了,在运行时找不到对应的的对应方法,通常由于jar包依赖冲突导致。...NoSuchMethodError出现是多半是存在两个同fully qualified name的class,刚好优先加载到了少了方法的那个。...使用方法是,在对应的pom文件右键选择maven菜单的tree子菜单即可生成tree.txt文件,这个操作等同于pom文件所在的子module里mvn dependency:tree -Dverbose

1.9K30

SpringBoot 系列-日志详解

日志系统应用程序生命周期的早期初始化。因此,通过 @PropertySource 注释加载的属性文件是找不到日志属性的。另外,logging 属性独立于实际的logging 基础结构。...可以通过路径包含适当的库来激活各种日志系统,还可以通过路径的根目录中提供适当的配置文件或在 Spring 环境的 logging.config 属性指定的位置提供适当的配置文件来进一步定制日志系统...另外官方文档中有明确提到,JUL(ava Util Logging) FATJAR 场景下存在一些已知的加载问题,所以要尽量避免 FATJAR 场景下使用 JUL。...,如果存在则通过反射构建类型为 entry.getValue() 的对象;SYSTEMS 是 LoggingSystem 抽象的一个静态的 MAP 结构变量,其初始化是静态代码块完成的: static...AbstractLoggingSystem 处理逻辑 beforeInitialize AbstractLoggingSystem 没有具体的处理逻辑,是个空方法,所以主要是看下 initialize

1.6K30

伙计,来跟我一起学SpringBoot! 【第一弹】

使用@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

82020
领券