SpringBoot教程(二)日志

Logback 

一、springboot 默认日志

1、默认日志框架 Logback :

默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了。

从上图可以看到,日志输出内容元素具体如下:

  • 时间日期:精确到毫秒
  • 日志级别:ERROR, WARN, INFO, DEBUG or TRACE
  • 进程ID
  • 分隔符:— 标识实际日志的开始
  • 线程名:方括号括起来(可能会截断控制台输出)
  • Logger名:通常使用源代码的类名
  • 日志内容

2、SpringBoot默认配置了【org.slf4j】

定义了一套接口,是一个日志门面,可实现多个日志系统间快速切换(通过修改配置文件)

具体日志实现可以选用Log4j, commons logging, logback 或者 java.util.logging。

3、使用实例

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class StudyBootDemoApplication {
    protected static final Logger logger = LoggerFactory.getLogger(StudyBootDemoApplication.class);

    public static void main(String[] args) {
        logger.info("SpringBoot开始加载");
        SpringApplication.run(StudyBootDemoApplication.class, args);
        logger.info("SpringBoot加载完毕");
    }
}

springboot有默认配置,所以可以不用自己定义log配置,若需要设置日志级别以及输出文件则需要

在application.properties中简单配置:


#配置日志
logging.level.root=INFO
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
logging.path=./log/info.log

4、由于默认配置不够灵活,不够友好,所以引用外部配置

logback配置方式:

spring boot默认会加载classpath:logback-spring.xml或者classpath:logback-spring.groovy

 

 1. 使用自定义配置文件,配置方式为:

#主配置文件,配置了这个会优先读取里面的属性覆盖主配置文件的属性
spring.profiles.active=dev
server.port=8888

logging.config=classpath:logback-all.xml
  • 注意:不要使用logback这个来命名,否则spring boot将不能完全实例化

 logback-all.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 文件输出格式 -->
    <property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" />
    <!-- test文件路径 -->
    <property name="TEST_FILE_PATH" value="c:/opt/roncoo/logs" />
    <!-- pro文件路径 -->
    <property name="PRO_FILE_PATH" value="/opt/roncoo/logs" />

    <!-- 开发环境 -->
    <springProfile name="dev">
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${PATTERN}</pattern>
            </encoder>
        </appender>
        
        <logger name="com.roncoo.education" level="debug"/>

        <root level="info">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>

    <!-- 测试环境 -->
    <springProfile name="test">
        <!-- 每天产生一个文件 -->
        <appender name="TEST-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 文件路径 -->
            <file>${TEST_FILE_PATH}</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 文件名称 -->
                <fileNamePattern>${TEST_FILE_PATH}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
                <!-- 文件最大保存历史数量 -->
                <MaxHistory>100</MaxHistory>
            </rollingPolicy>
            
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>${PATTERN}</pattern>
            </layout>
        </appender>
        
        <root level="info">
            <appender-ref ref="TEST-FILE" />
        </root>
    </springProfile>

    <!-- 生产环境 -->
    <springProfile name="prod">
        <appender name="PROD_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${PRO_FILE_PATH}</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${PRO_FILE_PATH}/warn.%d{yyyy-MM-dd}.log</fileNamePattern>
                <MaxHistory>100</MaxHistory>
            </rollingPolicy>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>${PATTERN}</pattern>
            </layout>
        </appender>
        
        <root level="warn">
            <appender-ref ref="PROD_FILE" />
        </root>
    </springProfile>
</configuration>
  • application.properties配置文件中的spring.profiles.active=dev 一定要配置,否则不起作用。

二、使用Log4j。

由于springboot没有集成Log4j,所以需要自己来集成。如果是用这种方式,就不要在application.properties中配置log了。

1、修改pom.xml文件

过滤掉自带的spring-boot-starter-logging,然后添加spring-boot-starter-log4j依赖包。

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
         <!-- 排除自带的logback依赖,这一个就可以去掉所有自带的日志实现系统 -->
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
     </dependency>    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j</artifactId>
        <version>1.3.8.RELEASE</version>
    </dependency>

2、 在resources目录下新建log4j.properties配置文件

 配置info,error,console,debug四种输出格式。

project=datasight
logdir=./logs/${project}

### set log levels ###
log4j.rootLogger = info,stdout
# config this project appender,log level:info,error #
log4j.logger.com.ts.report = info,error,bizInfo,bizError

### 控制台输出 ###  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.Target=System.out  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=[%-d{yyy-MM-dd HH\:mm\:ss}]-[%p]-[%l] - %m%n 

# info log everyday file#
log4j.loger.bizInfo = info,bizInfo
log4j.appender.bizInfo=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.bizInfo.File=${logdir}/info.log 
log4j.appender.bizInfo.layout=org.apache.log4j.PatternLayout  
log4j.appender.bizInfo.DatePattern='_'yyyy-MM-dd
log4j.appender.bizInfo.layout.ConversionPattern=[%-d{yyy-MM-dd HH\:mm\:ss}]-[%p]-[%l] - %m%n 
log4j.appender.bizInfo.Threshold=INFO 
#log4j.additivity.bizInfo=false  

##  error log ##
log4j.loger.bizError = info,bizError
log4j.appender.bizError = org.apache.log4j.DailyRollingFileAppender
log4j.appender.bizError.File = ${logdir}/error.log
log4j.appender.bizError.layout = org.apache.log4j.PatternLayout
log4j.appender.bizError.DatePattern='_'yyyy-MM-dd
log4j.appender.bizError.layout.ConversionPattern =[%-d{yyy-MM-dd HH\:mm\:ss}]-[%p]-[%l] - %m%n 
log4j.appender.bizError.Threshold = ERROR

3、在使用到的类中声明log以及输出log信息。

//Log4j自带的
private static final Logger LOGGER = Logger.getLogger(Application.class);

//或者用SLF4j门面都可以
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);

输出结果如下:

 

4、附录:

1、过滤掉自带的spring-boot-starter-logging,然后没有添加spring-boot-starter-log4j依赖包,console显示的是

三、Logback和Log4j

1、比较

1. Logback简介

Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch。它当前分为下面下个模块:

  • logback-core:其它两个模块的基础模块
  • logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
  • logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

2. 为什么选择logback而不是log4j

更快的执行速度

基于我们先前在log4j上的工作,logback 重写了内部的实现,在某些特定的场景上面,甚至可以比之前的速度快上10倍。在保证logback的组件更加快速的同时,同时所需的内存更加少。

充分的测试

Logback 历经了几年,数不清小时数的测试。尽管log4j也是测试过的,但是Logback的测试更加充分,跟log4j不在同一个级别。我们认为,这正是人们选择Logback而不是log4j的最重要的原因。人们都希望即使在恶劣的条件下,你的日记框架依然稳定而可靠。

logback-classic 非常自然的实现了SLF4J

logback-classic中的登陆类自然的实现了SLF4J。当你使用 logback-classic作为底层实现时,涉及到LF4J日记系统的问题你完全不需要考虑。更进一步来说,由于 logback-classic强烈建议使用SLF4J作为客户端日记系统实现,如果需要切换到log4j或者其他,你只需要替换一个jar包即可,不需要去改变那些通过

SLF4J API 实现的代码。这可以大大减少更换日记系统的工作量。

 

2、注意

在java世界里, 日志框架通常有log4j 和slf4j, 而日志实现常用有log4j和logback, 通常情况下:

log4j -- > log4j
slf4j --> logback

如果应用需要log4j的代码能被logback打印,则需要log4j-over-slf4j桥接器, 同样,如果想sl4j的代码能被log4j打印,则需要sl4j-log4j桥接器

log4j --> log4j-over-sl4j --> logback
slf4j --> slf4j-log4j --> log4j

但log4j-over-sl4j 和slf4j-log4j 是2个相互冲突的jar,不允许在同一个classloader内部。

当只使用logback时,maven需要把所有的slf4j-log4j12排除掉

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值