`

jeesite 日志过多

 
阅读更多

 

问题描述:日志过多,catalog变的过大

环境:gradle 配置

compile "org.slf4j:slf4j-api:${slf4jVersion}"
compile "org.slf4j:slf4j-log4j12:${slf4jVersion}"
compile "org.slf4j:jcl-over-slf4j:${slf4jVersion}"
compile "org.slf4j:jul-to-slf4j:${slf4jVersion}"
其中log4j:1.2.17,jcl-over-slf4j:1.7.7,slf4j-api:1.7.12,slf4j-log4j12:1.7.7,jcl-over-slf4j:1.7.7
配置都没有问题,但是日志仍然是过多,而且log4j里设置不生效

原因分析:发现引入的jar包中有LogBack的jar包,具体发现是StaticLoggerBinder;有多个

问题解决:删除logback的jar包后就可以了

知识补充:如使用SLF4j 的时候为了避免冲突,一定要保障只有一种实现类jar 包在里面。

--------------------------------------------------

转自:http://singleant.iteye.com/blog/934593

如果对于commons-loging 、log4j 、slf4j 、LogBack 等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所帮助,当然如果对这块有更深刻理解的同学,也贡献出自己的知识和见解。

一、     概念

Commons-logging : apache最早提供的日志的门面接口。避免和具体的日志方案直接耦合。类似于JDBC 的api 接口,具体的的JDBC driver 实现由各数据库提供商实现。通过统一接口解耦,不过其内部也实现了一些简单日志方案。

Log4j : 经典的一种日志解决方案。内部把日志系统抽象封装成Logger 、appender 、pattern 等实现。我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。

Slf4j : 全称为Simple Logging Facade for JAVA:java简单日志门面。 是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案。和commons-loging 应该有一样的初衷。个人感觉设从计上更好一些,没有commons 那么多潜规则。同时有两个额外特点:

1. 能支持多个参数,并通过{} 占位符进行替换,避免老写logger.isXXXEnabled 这种无奈的判断,带来性能提升见:http://www.slf4j.org/faq.html#logging_performance 。

2.OSGI 机制更好兼容支持

一图胜千言,官网上的一个图:


 

从上图可以发现,选择还是很多的。

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

http://logback.qos.ch/reasonsToSwitch.html

二、     常见日志方案和注意事项

1.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);

代码上,没有依赖任何的log4j 内部的类。那么log4j 是如何被装载的?

Log 是一个接口声明。LogFactory 的内部会去装载具体的日志系统,并获得实现该Log 接口的实现类。而内部有一个Log4JLogger 实现类对Log 接口同时内部提供了对log4j logger 的代理。LogFactory 内部装载日志系统流程:

1.   首先,寻找org.apache.commons.logging.LogFactory 属性配置

2.   否则,利用JDK1.3 开始提供的service 发现机制,会扫描classpah 下的META-INF/services/org.apache.commons.logging.LogFactory 文件,若找到则装载里面的配置,使用里面的配置。

3.   否则,从Classpath 里寻找commons-logging.properties ,找到则根据里面的配置加载。

4.   否则,使用默认的配置:如果能找到Log4j 则默认使用log4j 实现,如果没有则使用JDK14Logger 实现,再没有则使用commons-logging 内部提供的SimpleLog 实现。

从上述加载流程来看,如果没有做任何配置,只要引入了log4j 并在classpath 配置了log4j.xml ,则commons-logging 就会使log4j 使用正常,而代码里不需要依赖任何log4j 的代码。

 

 

2.Commons-logging+log4j+slf4j

如果在原有commons-logging 系统里,如果要迁移到slf4j, 使用slf4j 替换commons-logging ,也是可以做到的。原理使用到了上述commons-logging 加载的第二点。需要引入Org.slf4j.jcl-over-slf4j-1.5.6.jar 。这个jar 包提供了一个桥接,让底层实现是基于slf4j 。原理是在该jar 包里存放了配置META-INF/services/org.apache.commons.logging.LogFactory =org.apache.commons.logging.impl.SLF4JLogFactory ,而commons-logging 在初始化的时候会找到这个serviceId ,并把它作为LogFactory 。

完成桥接后,那么那么简单日志门面SLF4J 内部又是如何来装载合适的log 呢?

原理是SLF4J 会在编译时会绑定import org.slf4j.impl.StaticLoggerBinder; 该类里面实现对具体日志方案的绑定接入。任何一种基于slf4j 的实现都要有一个这个类。如:

org.slf4j.slf4j-log4j12-1.5.6: 提供对 log4j 的一种适配实现。

Org.slf4j.slf4j-simple-1.5.6: 是一种 simple 实现,会将 log 直接打到控制台。

……

那么这个地方就要注意了:如果有任意两个实现slf4j 的包同时出现,那就有可能酿就悲剧,你可能会发现日志不见了、或都打到控制台了。原因是这两个jar 包里都有各自的org.slf4j.impl.StaticLoggerBinder ,编译时候绑定的是哪个是不确定的。这个地方要特别注意!!出现过几次因为这个导致日志错乱的问题。

 

 

3.Slf4j+logback

Slf4j 和log4j 作者都是同一个人。

Logback 号称在性能各方面有很多优势,也很诱人。

直接使用SLf4j 也很简单:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

代码里也看不到任何具体日志实现方案的痕迹。

Logback 没用过,看到过一些诱人介绍。具体大家可以去研究。logback 。

注意事项

使用日志配置的时候一定要明白需求,同时避免冲突。

如使用SLF4j 的时候为了避免冲突,一定要保障只有一种实现类jar 包在里面。

当遇到日志错乱等问题时,可以从这几个方面来排查

 

  • 大小: 124.7 KB
分享到:
评论

相关推荐

    jeesite-framework-反编译_jeesite4.0_jeesite4_jeesite-framework_jees

    jeesite-framework-反编译_jeesite4.0_jeesite4_jeesite-framework_jeesite_Framework_源码.zip

    jeesite-说明文档

    jeesite-说明文档

    jeesite 源码文档.

    jeesite 源码文档.jeesite 源码文档.jeesite 源码文档.jeesite 源码文档.jeesite 源码文档.jeesite 源码文档.jeesite 源码文档.jeesite 源码文档.jeesite 源码文档.jeesite 源码文档.jeesite 源码文档.jeesite 源码...

    jeesite工程

    jeesite 开源框架

    jeesite 成功版已测试

    jeesite 可用版本 我的系统w7 64 无需tomcat 直接可用 对了你还得自己搭建maven插件

    jeesite项目基础结构

    jeesite项目基础结构

    jeesite源码最新

    jeesite源码最新(官网)

    jeesite源码包

    jeesite源码包

    JeeSite 免费开源框架开发配置说明

    JeeSite 免费开源框架开发配置说明 JeeSite 是一个免费开源框架,用于开发企业信息管理系统。该框架提供了一个基础架构,帮助开发者快速搭建企业信息管理系统。下面是 JeeSite 开发配置说明的详细介绍: 目录结构 ...

    Jeesite 登录login涉及到shiro验证和授权的流程分析

    实习生阶段:进来公司没任何培训,给了我们几个实习生一个月的时间自学SSM框架、掌握开源JeeSite框架和使用JeeSite开发一个小demo(突然感觉头有点大,没人带)然后自己被分配了做涉及使用shiro的登录模块的开发,...

    jeesite项目

    jeesite项目源码+Mysql脚本程序

    jeesite源码

    jeesite源码

    jeesite-master

    jeesite 框架

    jeesite-framework-4.1.9-SNAPSHOT.jar

    jeesite部署时,会出现无法下载部分jeesite-XXX的jar包的问题,可将jar包直接引用

    thinkgem-jeesite-master.zip

    JeeSite 提供了常用工具进行封装,包括日志工具、缓存工具、服务器端验证、数据字典、当前组织机构数据 (用户、机构、区域)以及其它常用小工具等。另外还提供一个强大的在线 代码生成 工具, 此工具提供简单的单表...

    jeesite.rar

    包含jeesite-common-4.1.9-SNAPSHOT.jar、jeesite-framework-4.1.9-SNAPSHOT.jar、jeesite-module-core-4.1.9-SNAPSHOT.jar、jeesite-module-jflow-4.1.9-SNAPSHOT.jar、jeesite-module-swagger-4.1.9-SNAPSHOT.jar...

    jeesite 框架maven数据仓库包

    jeesite 框架maven数据仓库包,有这个包指向maven,断网也可以用

    jeesite学习

    JeeSite是一个开源的企业信息管理系统基础框架。主要定位于“企业信息管理”领域,可用作企业信息管理类系统、网站后台管理类系统等。JeeSite是非常强调开发的高效性、健壮性和安全性的。 JeeSite是轻量级的,简单...

Global site tag (gtag.js) - Google Analytics