文章目录
1.什么是日志框架
- 是一套能实现日志输出的工具包
- 能够描述系统运行状态的所有时间可以算作日志
- 用户下线
- 接口超时
- 数据库崩溃
2.日志框架的能力
- 定制输出目标
- 可以以文件的形式储存在固定的地方
- 日志文件的滚动策略,如一天一个数据文件等
- 日志存到数据库等要求
- 定制输出格式,方便后期加工和处理
- 携带上下文信息
- 运行时选择性输出,不同情况下输出的内容不同
- 灵活的配置
- 优异的性能
3.常见的日志框架
日志门面 | 日志实现 |
---|---|
Apache :JCL | Log4j |
SLF4j | Log4j2 |
jboss-logging | Logback |
Java:JUL |
最优框架:SLF4j+Logback
4.日志框架的使用
4.1Slf4j的使用
1.基本使用
-
首先基于SpringBoot搭建框架,然后书写测试类
@RunWith(SpringRunner.class) @SpringBootTest public class LoggerTest { //选择slf4j下的类,同时填写当前类的类名,这样打印出来的日志也是当前类的全包名。 //当然也可以设置其他的类名,那么就会打印出设置的类名 private final Logger logger=LoggerFactory.getLogger(LoggerTest.class); @Test public void test1(){ logger.debug("--debug--"); logger.info("--info--"); logger.error("--error--"); } }
打印后查看控制台信息,日志是当前类的全包名
2018-10-20 16:46:21.391 INFO 23112 --- [ main] com.antfin.sell.LoggerTest : --info-- 2018-10-20 16:46:21.391 ERROR 23112 --- [ main] com.antfin.sell.LoggerTest : --error--
这是因为默认的日志级别是info,小于info级别的日志不会打印。
可以查看
org.slf4j.event
查看日志级别ERROR, WAR, INFO, DEBUG, TRACE;
2.使用lombok工具
-
改进日志类,每次都需要写入当前类比较麻烦,可以使用lombok插件来简化
- 添加依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
- 使用注释
Slf4j
,变量名称直接为log
@RunWith(SpringRunner.class) @SpringBootTest //lombok.extern.slf4j.Slf4j; @Slf4j public class LoggerTest2 { @Test public void test1(){ log.debug("--debug--"); log.info("--info--"); log.error("--error--"); } }
注意:如果找不到log变量,那么添加idea需要添加插件
Lombok Plugin
,再重启即可。
3.日志中打印出变量
- 使用占位符
{}
String name="imooc";
String pass="123456";
log.info("name:{},pass:{}",name,pass);
4.2Logback的配置
- application.yml 比较简单。只能配置路径和输出格式等简单的操作。
- logback-spring.xml 比较复杂,但是相应的功能也比较强大。
4.2.1 需求出发
- 区分info和error日志
- 每天产生一个日志文件
4.2.2 application.yml
logging:
pattern:
console: "%d - %msg%n"
#path: F:\logs\springboot
file: F:\logs\springboot\sell.log
level:
com: debug
具体的可以根据注释看到:
- path和file都是指定路径的,但是file可以指定文件名
- 对于指定级别 指定范围可以指定类,也可以说是包名。或者直接是
root
4.2.3 logback-spring.xml
- logback-spring.xml位于resources目录下
1.基本版
注意格式要正确,因为没有提示要小心出错。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--控制台的输出-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--展示格式-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - %msg%n
</pattern>
</layout>
</appender>
<!--范围和级别 root整个项目都适用-->
<root level="info">
<appender-ref ref="consoleLog"/>
</root>
</configuration>
2.配置到输出文件,且每天产生一个日志文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--输出文件的配置-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>F:\logs\sell\info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--范围和级别 root整个项目都适用-->
<root level="info">
<appender-ref ref="fileInfoLog"/>
</root>
</configuration>
3.区分info和error日志
-
对于error的日志只需要在其节点内加入
<filter></filter>
进行过滤即可,意思是只拦截Error及以上级别的日志,所以只想保留INFO是不可以的<!--根据范围来过滤--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter>
-
对于info的日志也使用标签
<filter></filter>
,但使用另外一个类LevelFilter,点击该类可以看到有三个DENY\NEUTRAL\ACCEPT 操作。如果选择ACCEPT,则 则使用该条规则,选择NEUTRAL则忽略该条规则。<!--根据范围来过滤--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <!--符合级别就过滤掉--> <onMatch>DENY</onMatch> <!--符合就接受--> <onMismatch>ACCEPT</onMismatch> </filter>
-
完整的日志配置规则
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--控制台的输出-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--展示格式-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - %msg%n
</pattern>
</layout>
</appender>
<!--输出文件的配置 INFO-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--根据范围来过滤-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<!--符合级别就过滤掉-->
<onMatch>DENY</onMatch>
<!--符合就接受-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>F:\logs\sell\info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--输出文件的配置-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--根据范围来过滤-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>F:\logs\sell\error.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--范围和级别 root整个项目都适用-->
<root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>