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排除掉