web日志源码分析
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容介绍了"web日志源码分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通过本图可以理清楚日
千家信息网最后更新 2025年12月02日web日志源码分析
本篇内容介绍了"web日志源码分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
通过本图可以理清楚日志之间的关系,
commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现!
log4j,logback等等才是日志的真正实现。
目前的日志框架有jdk自带的logging,log4j1、log4j2、logback
目前用于实现日志统一的框架apache的commons-logging、slf4j
为了理清它们的关系,与繁杂的各种集成jar包,如下:
log4j、log4j-api、log4j-core
log4j-1.2-api、log4j-jcl、log4j-slf4j-impl、log4j-jul
logback-core、logback-classic、logback-access
commons-logging
slf4j-api、slf4j-log4j12、slf4j-simple、jcl-over-slf4j、slf4j-jdk14、log4j-over-slf4j、slf4j-jcl
1.jdk 自带的log,
java.util.logging.Logger l = java.util.logging.Logger.getLogger(Deme.class.getName());
查看源码,主要是构建LoggerManage的时候读取配置文件
public static LogManager getLogManager() { if (manager != null) { manager.ensureLogManagerInitialized(); } return manager;}final void ensureLogManagerInitialized() { final LogManager owner = this;//省略 // Read configuration. owner.readPrimordialConfiguration();}private void readPrimordialConfiguration() { //省略 readConfiguration();}public void readConfiguration() throws IOException, SecurityException {//省略//默认是jre目录下的lib/logging.properties文件,也可以自定义修改系统属性"java.util.logging.config.file",源码如下: String fname = System.getProperty("java.util.logging.config.file"); if (fname == null) { fname = System.getProperty("java.home"); if (fname == null) { throw new Error("Can't find java.home ??"); } File f = new File(fname, "lib"); f = new File(f, "logging.properties"); fname = f.getCanonicalPath(); } try (final InputStream in = new FileInputStream(fname)) { final BufferedInputStream bin = new BufferedInputStream(in); readConfiguration(bin); } }2.1 log4j1 真正实现日志读写
//jar包引入//初始化,查看源码,org.apache.log4j.Logger logger1 = org.apache.log4j.Logger.getLogger("class or className"); log4j log4j 1.2.17
public class Logger extends Category { //可以看到 Logger继承了Category 类,这个类打印日志信息的时候有用。 Logger getLogger(String name) { return LogManager.getLogger(name); }}public class LogManager { //主要是 LogManager 的getLogger方法 Logger getLogger(final String name) { // Delegate the actual manufacturing of the logger to the logger repository. return getLoggerRepository().getLogger(name); } //LogManager 类有个静态方法 static { //初始化一个logger仓库Hierarchy,然后绑定到LoggerManager上,主要是通过getLoggerRepository()方法获取。 // By default we use a DefaultRepositorySelector which always returns 'h'. Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG)); repositorySelector = new DefaultRepositorySelector(h); /** Search for the properties file log4j.properties in the CLASSPATH. */ String override =OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY, null); // if there is no default init override, then get the resource // specified by the user or the default config file. if(override == null || "false".equalsIgnoreCase(override)) { String configurationOptionStr = OptionConverter.getSystemProperty(DEFAULT_CONFIGURATION_KEY ,null); //省略代码 // 这里配置文件有个加载顺序 // log4j.defaultInitOverride > log4j.configuration > log4j.xml > log4j.properties } //通过查看Hierarchy这个类}public class Hierarchy implements LoggerRepository, RendererSupport, ThrowableRendererSupport { private LoggerFactory defaultFactory; //创建Logger工厂 Hashtable ht; //存放工厂创建的Logger Logger root; //用于承载解析配置文件的结果,设置级别,同时存放appender //省略 //构造方法 public Hierarchy(Logger root) { ht = new Hashtable(); listeners = new Vector(1); this.root = root; // Enable all level levels by default. setThreshold(Level.ALL); this.root.setHierarchy(this); rendererMap = new RendererMap(); defaultFactory = new DefaultCategoryFactory(); }}2.2 log4j2 日志源码解析
//添加jar包,org.apache.logging.log4j log4j-api 2.2 og4j2分成2个部分:log4j-api: 作为日志接口层,用于统一底层日志系统log4j-core : 作为上述日志接口的实现,是一个实际的日志框架web.xml 添加如下信息 org.apache.logging.log4j log4j-core 2.2 org.apache.logging.log4j.web.Log4jServletFilter log4jServletFilter org.apache.logging.log4j.web.Log4jServletFilter //创建对象Logger logger = LoggerFactory.getLogger(DemeMapping.class); log4jServletFilter /* REQUEST FORWARD INCLUDE ERROR
//LoggerFactory的getlogger方法public final class LoggerFactory { public static Logger getLogger(Class> clazz) { Logger logger = getLogger(clazz.getName()); if (DETECT_LOGGER_NAME_MISMATCH) { Class> autoComputedCallingClass = Util.getCallingClass(); if (nonMatchingClasses(clazz, autoComputedCallingClass)) { Util.report(String.format("Detected logger name mismatch. Given name: \"%s\"; computed name: \"%s\".", logger.getName(), autoComputedCallingClass.getName())); Util.report("See http://www.slf4j.org/codes.html#loggerNameMismatch for an explanation"); } } return logger; } //获取logger对象 public static Logger getLogger(String name) { //最终获取的是Log4jLoggerFactory对象实现了ILoggerFactory接口 ILoggerFactory iLoggerFactory = getILoggerFactory(); //调用的其实是Log4jLoggerFactory这个类 return iLoggerFactory.getLogger(name); } public static ILoggerFactory getILoggerFactory() { //初始化,并且改变INITIALIZATION_STATE = 3 performInitialization(); case 3: return StaticLoggerBinder.getSingleton().getLoggerFactory(); } //主要看里面bind方法 private static final void bind() { String msg; try { //这里通过类加载方式找到StaticLoggerBinder对象, //代码里面定义路径:"org/slf4j/impl/StaticLoggerBinder.class">3 logback 日志解析
需要的jar包
logback-core
logback-classic
slf4j-api
//添加maven依赖ch.qos.logback logback-core 1.1.3 ch.qos.logback logback-classic 1.1.3 //或者 org.slf4j slf4j-api 1.7.12 framework.pisces pisces-log 1.2.3-beta com.fasterxml.jackson.module jackson-module-jaxb-annotations com.fasterxml.jackson.dataformat jackson-dataformat-xml com.fasterxml.jackson.module jackson-module-jaxb-annotations com.fasterxml.jackson.jaxrs jackson-jaxrs-xml-provider slf4j-log4j12 org.slf4j log4j log4j
//申明变量org.slf4j.Logger logger2 = LoggerFactory.getLogger("");//用到的也是 LoggerFactory来创建public final class LoggerFactory { public static Logger getLogger(String name) { ILoggerFactory iLoggerFactory = getILoggerFactory(); return iLoggerFactory.getLogger(name); }}//这里的调用和slf4j是一样getILoggerFactory()-> performInitialization(); -> bind(); -> findPossibleStaticLoggerBinderPathSet(); -> 返回LoggerContext对象//唯一不同是构造StaticLoggerBinder的地址是 "org/slf4j/impl/StaticLoggerBinder.class" ,在调用StaticLoggerBinder.getSingleton(); 用的是 logback-classic-0.9.21.jar包下的StaticLoggerBinder public class StaticLoggerBinder implements LoggerFactoryBinder { //可以看到这里初始化并赋值 LoggerContext 对象 private LoggerContext defaultLoggerContext = new LoggerContext(); static { SINGLETON.init(); } void init() { try { //这里就是初始化并存储值defaultLoggerContext,看看autoConfig()方法,里面主要是findURLOfDefaultConfigurationFile(true); 方法在读取配置文件, new ContextInitializer(defaultLoggerContext).autoConfig(); } private static StaticLoggerBinder SINGLETON = new StaticLoggerBinder(); public static StaticLoggerBinder getSingleton() { return SINGLETON; } private StaticLoggerBinder() { defaultLoggerContext.setName(CoreConstants.DEFAULT_CONTEXT_NAME); }}"web日志源码分析"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
日志
方法
源码
对象
文件
接口
配置
框架
分析
代码
信息
内容
实际
工厂
时候
更多
知识
系统
统一
不同
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
sql数据库怎样追踪查询
2018强网杯网络安全大赛
p2p网络技术有什么用
网络安全的厂商有哪些
数据库查阅所有记录
小猎犬互联网科技
世界第一互联网科技公司
nosql云数据库
如何做好网络安全的
qtp 数据库检查点
山西惠普服务器维修调试价格
网络安全手抄报作品一等奖
北京中启能软件开发
台账和数据库有什么区别
上海迷你工控机服务器
表格进阶就是数据库吗
我国网络安全保护的基本方式
在数据库视图中添加列
stitp项目软件开发类
网络安全法 法定代表人
网络安全教育的家长
电子认证网关服务器
过敏性鼻炎数据库
程序员进阶服务器环境
网络安全知识与技能竞赛
斑马网络技术有限公司郝飞
软件开发与运维实习报告
计算机网络技术有
国家社科期刊学术数据库
数据库jndi