文档章节

2.3.2 Spring 内部日志机制(logging)

流光韶逝
 流光韶逝
发布于 2016/07/16 10:18
字数 1863
阅读 24
收藏 0
点赞 0
评论 0
  • 原文地址日志模块

  • 日志是spring一个非常重要的依赖,因为:a.它是唯一强制依赖,B.每个人都希望看到他们使用工具的输出;c.spring整合大量其他工具,它们也需要日志依赖.应用开发者的一个重要目标就是:在整个应用的核心区域可以对日志进行统一配置,包括所有额外组件. 由于有很多日志框架,曾经使这个目标变得更困难; spring的强制日志依赖是Jakarta Commons Logging API(JCL).我们编译JCL,我们也使JCL 日志对其他继承了spring框架的类可见.使用相同的日志类库对用户来说非常重要:保持向后兼容性,可以使spring的应用集成更加容易.我们这么做的目的是为了让spring的一个模块明确依赖commons-logging(JCL的规范实现),并使其他模块在编译期间依赖该模块; 例如你使用了Maven并好奇你从哪里得到commons-logging依赖,它将从spring特别是从叫spring-core的核心模块获得; 使用commons-logging最便捷的地方是你不需要其他东西来使你的应用工作.它有一组运行时发现算法,可以在classpath下明显的地方查找日志框架,并使用它认为合适的那个(或者你可以告诉它你需要那个).如果没有发现其他日志框架,它就会从JDK中使用那些更漂亮些的日志(java.util.logging或简化的JUL).你应该发现你的spring项目可以在大多数没有控制台的环境下运行并日志记录,而且这很重要;

    ###不要使用Commons Logging 不幸的是,commons-logging的可以方便最终用户的运行期间发现算法是有问题的.如果时间能倒流,我们能重新开发spring,那就让我们重新选一个不同的日志依赖吧.这个首选项可以是java简单日志门面(Simple Logging Facade for Java,SLF4J),它同样可以和spring一起运行在其他工具里; 这里有两种基本的方式抛弃commons-logging: 1.移除(exclude)spring-core模块的依赖(它是明确需要commons-logging依赖的模块); 2.将特定需要commons-logging依赖的地方用一个空jar来替换类库(更多细节可以在 SLF4J FAQ 中查找);移除commons-logging,将这些添加到你的maven依赖管理区域;

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.1.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

如果只这样的话项目就会报错,因为它的classpath现在缺少JCL API的实现;你可以提供一个新的日志 模块来修复它;

使用SLF4J

SLF4J是一个更简洁的依赖,它比common-logging更高效,因为它使用了运行时绑定来代替后者的运行时发现算法,这样更好的进行日志框架整合.这意味着你必须要明确的明白运行时发生了什么,或对其进行相应的声明或配置.SLF4J支持许多common logging框架,所以你可以选择一个你使用过的,对其绑定后进行配置和管理; SLF4J提供了对许多日志框架的绑定,包括JCL,同时它也做反向操作:桥接其他日志框架和它本身.所以使用spring的SLF4J你需要将commons-logging 依赖替换为SLF4-JCL桥接.你做完之后,spring的日志调用将转化为SLF4J API,只要你的项目中其他类库使用API,然后你就可以只在一个地方去配置和管理日志; 一个更通用的选项是将SLF4J桥联到spring,然后将SLF4J绑定到Log4J中.你需要提供四个依赖(还要移除已存在的commons-logging):有bridge(桥联),SLF4J API,Log4J框架的绑定,log4j自身的实现.在Maven中可能这么做

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.1.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.5.8</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.5.8</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.8</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>
</dependencies>
```	

这看起来可能要用很多依赖才能使用一些日志.虽如此,但它是可选择的;它在面对类加载器的问题时比普通的common-logging框架做的更好,尤其是你使用一些严格的容器,例如OSGI平台(如电网的sg-uap).据说另一显著优势是:它们在编译期间完成了绑定而非运行期;
   ###使用LogBack

   对于SLF4J的使用者而言,有一个更通用的选择,那就是使用Logback [logback](http://logback.qos.ch/) ,这将使用更少的步骤和更少的依赖.这会去掉其他的绑定步骤,因为Logback直接实现了SLF4J,这样你就只需要两个依赖就可以了而不是四个(只用jcl-over-slf4j和logback).还有,为了保持slf4J的版本一致性,你需要从其他非spring依赖中移除slf4j-api依赖;

  ###使用log4j
   许多人使用Log4J作为日志框架用来配置和管理.它非常高效而且容易建立;实际上我们创建和检测spring时在运行时就使用他(log4J).Spring也为启动和配置Log4J提供了一些支持,所以在许多模块中log4J可作为编译期可选择的依赖;
       要想将log4J和默认的JCL依赖(commons-logging)一起使用,你需要将log4J加入到classpath中,并提供一个配置文件(log4j.properties或者log4j.xml在根路径下).对于maven用户来说,可以如此配置声明:

<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.1.RELEASE</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> </dependencies> ``` 此处为简单的log4j.properties文件内容

log4j.rootCategory=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n

log4j.category.org.springframework.beans.factory=DEBUG
```	    
###运行容器中的原生JCL(Runtime Containers with Native JCL)
 许多人在一个提供了JCL实现的容器中运行项目;	IBM的Websphere Application Server(WAS)是一个典型;这经常出问题,还没有啥银弹方案,简单的移除你项目中的commons-logging在大部分场景是没有用的
    要清楚明白:这个问题无关JCL本身,甚至无关commons-logging;也不是绑定commons-logging到其他架构(如 log4J)中. 它会失败是因为我们使用的是1.1版本,而这些容器中使用的1.0的版本,这样他们就会改变commons-logging的运行发现算法.spring并没有使用JCL API的其他无用部分,所以无法破解,然当你的spring或项目尝试使用其他日志时,你就会发现对Log4J的绑定就不起作用了;
    在WAS环境下,最简单的事就是反转类加载器的层次,这样我们就可以用应用本身来管理JCL依赖,而不是用WAS容器.然该选项不总是打开的,但是公共社区应该还有其的可用方法的建议,而且你的具体操作取决于容器的确切版本和其功能集;

© 著作权归作者所有

共有 人打赏支持
流光韶逝
粉丝 19
博文 90
码字总数 126606
作品 0
济南
程序员
Spring Boot日志集成实战

Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架,Sprin...

Java技术栈 ⋅ 06/08 ⋅ 0

Spring Boot干货系列:(七)默认日志logback配置解析

转载自:点击打开链接 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如...

u012843873 ⋅ 04/23 ⋅ 0

Spring Boot中日志每日分割

问题 想使用Spring Boot中日志输出,这样以后遇到问题,就可以翻看日志数据,看看程序运行的过程,便于排查错误。 logback基础配置 logback-spring.xml application.properties 上面两步,主...

亚林瓜子 ⋅ 06/12 ⋅ 0

服务端常规知识详解

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.前言 公司老项目的后台,均是基于spring框架搭建,其中还用到了log4j.jar等开源架包。...

李晓晖 ⋅ 2015/11/04 ⋅ 0

后端发送数据到前端出现溢出问题

用户编辑某个页面时,后台会把一个大的实体(包含所有模块数据)返回到前端。经常出现以下报错,但是重新请求下可能就没有了。是不是因为数据量很大的缘故呢?信息如下: 09:55:04.448 [qtp6...

琴麻岛 ⋅ 04/27 ⋅ 0

Spring Boot中Starter是什么

比如我们要在Spring Boot中引入Web MVC的支持时,我们通常会引入这个模块spring-boot-starter-web,而这个模块如果解压包出来会发现里面什么都没有,只定义了一些POM依赖。 经过研究,Start...

easonjim ⋅ 2017/09/30 ⋅ 0

Spring Boot Starters启动器

Starters是什么? Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数...

Java技术栈 ⋅ 06/10 ⋅ 0

Spring Boot学习笔记—日志

开发应用时,日志框架的依赖是不可避免的。应用依赖的其他框架中,可能又依赖了其他不同的框架,例如你的应用使用的Logback,但Spring系列框架使用的Log4j,还有某某框架依赖的Commons Loggi...

chace0120 ⋅ 2015/12/23 ⋅ 0

java日志,需要知道的几件事

java日志,需要知道的几件事 如果对于commons-loging 、log4j 、slf4j 、LogBack 等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解...

maoxiajun ⋅ 2012/02/10 ⋅ 2

基于SpringBoot,更简洁的后台管理系统--Guns

Guns 新版Guns基于SpringBoot全面升级,完美整合springmvc + shiro + mybatis-plus + beetl! 在不用写xml配置(V1.0)的基础上进一步简化项目配置,让您更专注于业务开发!抛弃传统spring xml的配...

naan1993 ⋅ 2017/05/18 ⋅ 69

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 42分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部