• Spring的日志管理


    一、spring的日志依赖

    Logging是spring中唯一强制的外部依赖,spring中默认使用的日志是commons-logging,简称JCL,这里说的强制性,是因为在spring-core这个模块中引入了该依赖。不过,引入了该依赖,也无需做任何其他的配置,它是日志门面,它内部会有自己的算法去找日志门面的实现类,比如log4j,如果说没有引入其他日志依赖,它默认就会去找JDK自带的java.util.logging简称jul作为其日志实现类,所以说用起来还是赏心悦目的!

    二、使用log4j1.x和2.x和jul

    log4j1.x版本已经停止更新了,log4j2.x习惯性叫做log4j2


    log4j出现很久了,一直有很多人在使用,但是毕竟停止更新了,已经不再推荐使用了。

    如何使用log4j作用spring自带的commons-logging的日志实现呢?

    用起来也是相当简单啊,我们以Maven为例,首先添加Log4j的jar包,另外需要一份日志配置文件 (log4j.properties or log4j.xml),放在类路径的根目录下。

    下面是maven:

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.24.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
    

    下面一个简单的log4j的配置文件

    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
    

    同样的如果说使用log4j2作为JCL的日志实现,和log4j用法是一样的。

    下面这是Maven依赖

    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-jcl</artifactId>
            <version>2.6.2</version>
        </dependency>
    </dependencies>
    

    If you also wish to enable SLF4J to delegate to Log4j, e.g. for other libraries which use SLF4J by default, the following dependency is also needed:

    <dependencies>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.6.2</version>
      </dependency>
    </dependencies>
    

    log4j2.xml的一个简单示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
      <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
          <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
      </Appenders>
      <Loggers>
        <Logger name="org.springframework.beans.factory" level="DEBUG"/>
        <Root level="error">
          <AppenderRef ref="Console"/>
        </Root>
      </Loggers>
    </Configuration>
    

    如果没有提供log4jlog4j2之类的日志实现,那么commons-logging就会默认使用jdk自带的java.util.logging

    二、不使用自带的Commons Logging

    如果觉得spring自带的JCL不合适,可以自己进行替换,有以下两种方法:

    • 直接从spring-core排除掉commons-logging的依赖,因为spring-core是唯一明确依赖JCL的模块
    • 依赖于一个特殊commons-logging,它是一个空jar包,参考slf4j
    // 从spring-core中排除掉
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.24.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    

    使用SLF4J代替jCL

    需要下面几个依赖,一个是排除掉JCL,第二个是要架起JCL与slf4j直接的桥梁,毕竟如spring-core中使用了,其实这里slf4j巧妙的将诸如spring-core中用到的commons-logging的类或接口,在jcl-over-slf4j中写了一份同名的,但在具体的方法或接口等实现类中,再去具体找其他日志实现框架,它起到了一个日志门面的作用。

    第三个是slf4j对接log4j的jar包,因为Log4j早就停更了,所以啊,这又是适配Log4j与slf4j之间的Jar包,最后一个就是log4j自身的jar包了。

    下面是依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.24.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.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
    

    如果选用logback作用slf4j,那就简单多了,因为logback出现的比较晚,它实现了slf4j,那就不需要中间包了,下面是Maven依赖。

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.7</version>
        </dependency>
    </dependencies>
    

    以上是阅读spring官方文档时个人的一点点理解,记之于笔墨。

    附官方文档链接:spring官方文档

    你所看得到的天才不过是在你看不到的时候还在努力罢了!
  • 相关阅读:
    获取父页面标签对象,获取当前标签div高度
    响应回车事件
    解决checkbox的attr(checked)一直为undefined问题
    返回键 隐藏、、收起键盘textView|textField
    ios9 之后,Xcode7不推荐使用UIAlertView,改用UIAlertController+UIAlertAction(按钮)
    判断是否是 首次 进入app,,以及Xcode7之后前导页的设置
    根据 字数 确定 UI控件高度
    对于限制UITextView输入的字符数
    block 反向传值回调
    NSUserDefault的使用
  • 原文地址:https://www.cnblogs.com/heliusKing/p/11192263.html
Copyright © 2020-2023  润新知