`
wsmajunfeng
  • 浏览: 492876 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

各种log的加载过程

 
阅读更多

1. 概述

现在的log框架越来越多,目前我们系统用有使用的包括commons-logging,log4j,slf4j(还有 一个号称更快的logback暂时基本没有用到),而这些log系统又常常依赖于一些jar包顺序和静态配置,导致比较混乱,甚至出现一些难以重现的诡异 问题,因此在这里就各个log系统的初始化过程介绍一下,方便以后排查问题。
本文主要侧重多个日志系统的混合使用和加载,对于日志级别,格式等等方面不涉及。

2. 介绍

2.1. commons-logging

apache提供的日志门面接口,主要是为了避免程序和具体的log耦合。

基本使用方法:

首先需要引入commons-logging.jar(通过maven或者其他方法皆可),然后这样使用就可以了

  1. Log logger = LogFactory.getLog(TestCommonsLogging.class);
  2. logger.debug(“test debug”);

初始化过程:

其中LogFactory是实现解耦的关键,他使用log系统的查找顺序是这样的:
1. 寻找当前factory中名叫org.apache.commons.logging.Log配置属性的值。注意值可以通过java代码设置,但更多的是 在classpath中提供一个交commons-logging.properties的文件,设置在里面,比 如:org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
如果classpath中有多个文件,在1.1版本之前,使用找到的第一个,1.1版本及其以后会在配置文件中定义一个优先级,使用优先级最高的。
2. 寻找系统中属性中名叫org.apache.commons.logging.Log的值。
3. 如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger)
4. 如果应用程序运行在jdk1.4的系统中,使用相关的包装类(Jdk14Logger)
5. 使用自带的简易日志包装类(SimpleLog)

2.2 slf4j

slf4j和commons-logging功能类似

基本使用方法:

首先要引入slf4j-api-1.6.4jar,然后比如要支持log4j,就引入slf4j-log4j12-1.6.4jar

  1. Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
  2. logger.debug(“test debug”);

初始化过程:

SLF4J没有通过配置文件来指明使用哪个log,而是通过引入适配jar包来指定。如果引入了两个桥接包,就看谁在classpath的前面了。(事实 上,每个桥接包中都有一个同名类org.slf4j.impl.StaticLoggerBinder,通过 org.slf4j.LoggerFactory的静态代码块加载
loggerFactory = StaticLoggerBinder.SINGLETON.getLoggerFactory();)


2.3 log4j

这个就不用介绍了,大家都懂的。

基本使用方法

  1. Logger logger =org.apache.log4j.Logger.getLogger(Log4jTest.class);
  2. logger.debug(“test debug”);

初始化过程:

1.检查系统变量Log4j.configuration,如果有值,使用这个值设定的配置文件,否则先尝试在classpath中加载 log4j.xml,没有再尝试加载log4j.properties.找到对应的配置文件后,调用对应的DOMConfigurator或者 PropertyConfigurator来初始化
configurator.doConfigure(url, hierarchy);
2.如果都没有配置,那么需要在应用中显示调用DOMConfigurator或者PropertyConfigurator来初始化。
3.如果在程序执行的过程中,代码调用了一次XXXConfigurator.configure(),所有对应的logger的设置都会随之改变。

3. 分析一个实际例子

我们在启动jetty的时候,jetty用的是slf4j,我们在lib中放置了slf4j-api-1.6.4jar,slf4j-log4j12-1.6.4jar和log4j.properites,所以会使用log4j打印log。

在应用起来的过程中,由于是自己的classloader,不会复用jetty本身的log配置,首先加载的 是,dragoon的filter用了slf4j,而这个时候应用的log4j系统还没有初始化,于是就在类路径的jar包中随便找到了第一个 log4j.prpperties,然后正好输出到了控制台。(因此在启动中有几行dragoon的控制台输出)

servelt初始化后,webx利用commons-logging包装了log4j,在war包的WEB-INF下查找log4j配置文件并使用,覆 盖掉开始dragoon初始化的log4j提醒,这样在应用中所有的log4j都会使用新的这套配置了。因此除了系统的应用代码外,二方库和3方库如果使 用了log4j,commons-logging和slf4j的方式打log,都会使用我们WEB-INF下的log4j配置。未特殊设置的,都会打印到 root对应的appender上面去。

 

4. 参考文献:

http://commons.apache.org/logging/commons-logging-1.1.1/guide.html
http://www.slf4j.org/manual.html
http://logging.apache.org/log4j/1.2/manual.html

分享到:
评论

相关推荐

    log4j-1.2.16.zip

    java 日志log4j加载 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条...

    slf4j实现热加载日志级别

    一个简单的例子slf4j实现热加载日志级别

    Android中级教程之----Log图文详解

    这个方法通常用于输出信息性消息,例如网络连接成功、数据加载完成等。它不会输出 Log.v() 和 Log.d() 方法的信息,但会显示 Log.w() 和 Log.e() 方法的信息。 Log.w() 方法是WARN级别的输出方法,它的输出颜色是...

    android 解析 开机加载SIM联系人及对SIM卡联系人的操作

    通过自身1个星期的研究,对开机启动后加载SIM卡联系人的操作流程进行简要分析 , 同时通过Log分析 发现对SIM卡联系人操作时出现的问题,并进行分析,给刚接触这一模块的朋友提供一些经验,同时也方便自己以后深入...

    Android 9.0 Vold 挂载流程分析

    在Android 系统中所有的热插拔设备都是通过Vold 进程挂载的。通过kernel–>vold–>StorageManagerService这样的... setenv(ANDROID_LOG_TAGS, *:v, 1); android::base::InitLogging(argv, android::base::LogdLogger

    clr-boot-manager, 内核&引导加载程序管理.zip

    clr-boot-manager, 内核&引导加载程序管理 clr-boot-manager 为了在升级过程中正确地维护供应商内核和适当的垃圾收集策略,clr-boot-manager存在。 实现提供了在共享启动目录上启用正确共存的方法,例如用于uefi引导...

    vconsole.js

    平时在web应用开发过程中,我们可以console.log去输出一些信息,但是在移动端,也就是在手机上,console.log的信息我们是看不到的。 这种情况下,可以选择使用alert弹出一些信息,但是这种方法不怎么方便,也会阻断...

    snaketail-net:监视文本日志文件和Windows EventLog的尾部实用程序

    蛇尾网 监视文本日志文件和Windows EventLog的尾部实用程序 监视“大”文本日志文件 监视Windows事件日志(无需管理员权限) 支持多种窗口模式(MDI,选项卡式,浮动式) ...在窗口标题栏中显示简单的过程统计

    111_BTopenlog_

    蓝牙打开过程的一段log,包含ID识别,驱动加载,UART节点加载

    FoxLoader_UnityDemo_v1_0_0.rar

    IsDebugMode 会显示很多Log信息方便调试,非DebugMode,只会提示Warning和Error IsCheckFileMD5 下载完保存到本地,会先Check下载文件的MD5和本地之前保存的文件的MD5是否相同,不同不会进行保存,但是仍然会在内存...

    网站log日志etl项目(带模拟数据,代码,部分代码解析)

    etl大概描述:用来将数据从数据源端抽取,转换,加载到目的端的过程。一般而言etl有实时etl和离线etl,这个项目介绍的是离线etl项目,代码中没有配置远程提交集群,如需集群运行需要自行打包代码提交到集群。

    wps2019数据分析加载项-数据分析的思维和方法.pdf

    漏⽃法:流程化思考,⽤于变化、过程、流程的分析。单⼀的漏⽃分析没有⽤,和其他分析思维结合,⽐如多维和对⽐等。 如何锻炼数据分析思维:好奇⼼+⽣活中的练习。 2019-05-04 学习笔记 学习笔记 ⼤数据特点:数据...

    HBase用户手册-v2.2.docx

    2 总体介绍 7 2.1 整体介绍 7 2.2 hbase的应用 7 2.3 HBase的体系结构简介 8 ...8.1 log4j 24 8.2 configuration 25 8.3 Cluster Connections 25 8.4 Connection Pooling 26 8.5 create table 26 8.6 sing

    Android 系统 Linux系统 内核kernel启动流程 init 进程介绍

    /etc/init,/bin/init,/bin/sh 挂载tmpfs,mnt/vendor,mount/product分区,/system/bin/init/ selinux_setup,启动selinux(控制访问安全模块),初始化selinux,加载SELinux规则,配置SELinux相关log输出,nit.rc位于/...

    高性能C 通用日志组件VC-Logger.zip

    性能: 性能是组件是否值得使用的硬指标,本组件从设计到编码的过程都尽量考虑到性能优化: 支持多线程同时发送写日志请求 使用单独线程在后台写日志,不影响工作线程的正常执行 ...

    阿里巴巴开源的诊断工具Arthas介绍.ppt

    我们平时在线上或者开发中会遇到各种性能、功能等问题,在运行过程中需要查看方法入参、返回值,或者方法执行的堆栈时间,或者jar冲突时类加载来自那个jar包等问题。我们在开发过程中,可能会打印log日志、手动去...

    C# winform基于Halcon的一款通用图像处理工具

    1、添加PMA工具 2、优化Project保存与重现 ...仿照VisionPro拖拉形式进行工具间值的传递及JOB流程运行走向 工具之间采用插件,可动态加载调用 目前图像处理算法使用Halcon,预期将Opencv也做成插件式工具进行调用

    env-stage-loader:根据具有[stage] .local支持的process.env.NODE_ENV值按顺序加载.env文件。

    在构建过程或应用中尽快导入并使用 const loadStageEnv = require ( 'env-stage-loader' ) // Load env variables const values = loadStageEnv ( ) console . log ( 'resolved values' , values ) // Debug load ...

    Northwind.mdf 与 sp_dboption.sql

    重要: 对于SQLSVR2008以后的版本, 不可以直接附加MDF文件的方式加载NorthWind数据库, 只能以instnwnd.sql方式创建(含数据), 但是在执行过程中提示缺少过程sp_dboption, 需要先在MASTER库下执行sp_dboption.sql创建sp...

    MTK6577+Android编译之preloader

    Preloader 是 Android 系统启动过程中的一个重要组件,负责将 Android 内核加载到内存中。在 MTK6577+Android 编译过程中,preloader 的编译过程是非常关键的。下面我们来分析 MTK6577+Android 编译之 preloader 的...

Global site tag (gtag.js) - Google Analytics