一、简介
1.1市面上的日志框架
JUL(java.util.logging)
JCL(Apache Commons Logging)
Log4j、Log4j2、Logback、SLF4j、jboss-logging等
日志门面(日志抽象层) | 日志实现 |
SLF4j(Simple Logging Facade for Java)
|
Log4j JUL(java.util.logging) Log4j2 Logback |
1.2日志门面:SLF4j 日志中实现: Logback
二、SLF4J使用
2.1如何在系统中使用SLF4J
开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法。
给系统里导入slf4j的jar和logback的实现jar:(http://www.slf4j.org/manual.html)
2.1.1代码写法
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");
}
}
2.1.2架构
每一个日志的实现框架都有自己的配置文件,使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件;
2.1.3如何让系统中所有的日志都统一到slf4j
-- 将系统中的其他日志框架先排除出去;
-- 用中间包来替换原有的日志框架
-- 导入slf4j其他的实现
三、SpringBoot与日志的关系
总结:
1)、SpringBoot底层也是使用slf4j+logback的方式进行日志记录;
2)、SpringBoot也把其它日志都替换成了slf4j
3)、如果我们引入其它框架,一定要把这个框架的默认日志依赖移除掉
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
四、测试
约定一下:
测试一下:
结果:
4.1指定日志配置文件位置
logging.file | logging.path | Description |
none |
none | 只在控制台输出 |
my.log | none | 输出日志到my.log文件 |
none | /var/log | 输出到指定目录的spring.log |
4.2输出格式
%d表示日期时间,
%thread表示线程名,
%‐5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
五、指定配置
给类路径下放上每个日志框架自己的配置文件即可,那么SpringBoot就不使用他默认配置的了
logback.xml:直接就被日志框架识别了;(没有springProfile 标签)
logback-spring.xml:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用springProfile标签(推荐使用)
5.1 logback.xml :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--变量声明-->
<!--日志输出格式:
%d表示日期时间,
%thread表示线程名,
%‐5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
比如:%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
-->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<property name="FILE_ERROR_PATH" value="D:/logs/mall/mall.%d{yyyy-MM-dd}.%i.error.log" />
<property name="FILE_INFO_PATH" value="D:/logs/mall/mall.%d{yyyy-MM-dd}.%i.info.log" />
<!--定义控制台输出-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--输出INFO日志文件配置-->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按照上面配置的FILE_ERROR_PATH路径来保存日志 -->
<fileNamePattern>${FILE_INFO_PATH}</fileNamePattern>
<!-- 日志保存30天 -->
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 单个日志文件的最大,超过则新建日志文件存储 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--输出ERROR日志文件配置-->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--只记录ERROR级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按照上面配置的FILE_ERROR_PATH路径来保存日志 -->
<fileNamePattern>${FILE_ERROR_PATH}</fileNamePattern>
<!-- 日志保存30天 -->
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 单个日志文件的最大,超过则新建日志文件存储 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--级别大于等于INFO的则在控制台打印 默认是debug-->
<logger name="com.shop.admin" level="INFO" />
<!--级别大于等于INFO的执行appender为FILE的配置-->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_ERROR" />
</root>
</configuration>
5.2logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--变量声明-->
<!--日志输出格式:
%d表示日期时间,
%thread表示线程名,
%‐5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
比如:%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
-->
<property name="LOG_PATTERN_DEV" value="%date{yyyy-MM-dd HH:mm:ss.SSS} --- [%thread] %-5level %logger{36} - %msg%n" />
<property name="LOG_PATTERN_PROD" value="%date{yyyy-MM-dd HH:mm:ss.SSS} === [%thread] %-5level %logger{36} - %msg%n" />
<property name="FILE_ERROR_PATH" value="/logs/mall/mall.%d{yyyy-MM-dd}.%i.error.log" />
<property name="FILE_INFO_PATH" value="/logs/mall/mall.%d{yyyy-MM-dd}.%i.info.log" />
<!--定义控制台输出-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<springProfile name="dev">
<encoder>
<!-- 按照上面配置的LOG_PATTERN_DEV来打印日志 -->
<pattern>${LOG_PATTERN_DEV}</pattern>
</encoder>
</springProfile>
<springProfile name="prod"> <!--可用 spring.profiles.active=prod 测试 -->
<encoder>
<!-- 按照上面配置的LOG_PATTERN_PROD来打印日志 -->
<pattern>${LOG_PATTERN_PROD}</pattern>
</encoder>
</springProfile>
</appender>
<!--输出INFO日志文件配置-->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按照上面配置的FILE_ERROR_PATH路径来保存日志 -->
<fileNamePattern>${FILE_INFO_PATH}</fileNamePattern>
<!-- 日志保存30天 -->
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 单个日志文件的最大,超过则新建日志文件存储 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--输出ERROR日志文件配置-->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--只记录ERROR级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按照上面配置的FILE_ERROR_PATH路径来保存日志 -->
<fileNamePattern>${FILE_ERROR_PATH}</fileNamePattern>
<!-- 日志保存30天 -->
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 单个日志文件的最大,超过则新建日志文件存储 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--级别大于等于INFO的则在控制台打印 默认是debug-->
<logger name="com.main" level="INFO" />
<!--级别大于等于INFO的执行appender为FILE的配置-->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_ERROR" />
</root>
</configuration>