日志:slf4j+logback 的配置与使用
1. 常用日志组件和选择
日志实现
log4j
log4j2
2. 日志的使用
package com.lonely; import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; /**
* Created by 15072 on 2018/1/6.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class LoggerTest { private static Logger logger = LoggerFactory.getLogger(LoggerTest.class); @Test
public void testLogger(){
logger.debug("debug:....");
logger.info("info...");
logger.error("error...");
} }
在这里 ,我们需要在每个类中 创建一个 Logger对象,并且使用 当前类的类名来创建,那么 这个类名存在的意义在哪里?我们可以先运行 第一个测试,看下结果
因此,使用类名创建的logger 的作用就是在这里,但是如果我们需要在每个类中都这样的创建一个logger对象,不方便,因此可以通过 一个注解来帮我们实现 那就是 @Slf4j ,该注解就可以帮我们自动创建一个 log对象
@Test
public void testSl4j(){
log.debug("sl4j.debug...");
log.info("sl4j.info");
log.error("sl4j.error");
}
这里的日志输出格式 是默认的,我们可以通过的教程 来配置 日志输出配置
3. 日志的配置
logging:
pattern:
console: "%d - %msg%n"
2. 配置日志输出位置 比如磁盘 e盘
logging:
pattern:
console: "%d - %msg%n"
path: e:/
运行后,我们可以看到 在 e盘下生成了一个文件 spring.log 这文件是spring生成
logging:
pattern:
console: "%d - %msg%n"
path: e:/
file: e:/sell.log
我们可以看到 在e盘下生成了以下文件
这里注意:我们可以配置日志保存位置,以及具体输出的文件,如果同时配置的话,会使用我们指定的file为主,可以测
logging:
pattern:
console: "%d - %msg%n"
#path: e:/
file: e:/sell.log
level:
#这里可以是包名也可以是类名
com.lonely: debug
运行后,我们可以看到 原来只能看到 info 和 error 的,现在的debug也可以看到
<?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 level="info">
<appender-ref ref="consoleLog" />
</root>
</configuration>
在上面的 logback-spring.xml中,appender配置了一个规则, ConsoleAppender表明日志输出到控制台,layout表明输出格式,root节点配置表明该项目基础的日志级别为info,引入 控制台输出的规则,那么我们运行看结果
<?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> <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d -- %msg%n</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>e:/info-%d.log</fileNamePattern>
</rollingPolicy>
</appender> <root level="info">
<appender-ref ref="consoleLog" />
<appender-ref ref="fileInfoLog"/>
</root>
</configuration>
3. 如果我们想 把 info 的日志 和 error的日志区分到两个文件放置,该怎么写呢?
<?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> <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d -- %msg%n</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>e:/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>%d -- %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>e:/error-%d.log</fileNamePattern>
</rollingPolicy>
</appender> <root level="info">
<appender-ref ref="consoleLog" />
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
运行后,我们可以在 e盘下的 error.log中看到 里面只有一条记录,关于error的记录,但是我们在info的那个文件中,依旧有info和error的信息,那么如果将info提取出来呢? 能不能也想这样添加一个过滤器呢,测试一下,经过测试我们发现没有作用,因为拦截info,error还是会显示,因为error的优先级高,那么我们可以利用如下方法来处理,demo如下:
<?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> <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>%d -- %msg%n</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>e:/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>%d -- %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>e:/error-%d.log</fileNamePattern>
</rollingPolicy>
</appender> <root level="info">
<appender-ref ref="consoleLog" />
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
运行后,发现确实实现了 info 和 error的日志分开,但是 在上图例子中,虽然我们排除了 error,但是除开info,如果我们还有 warn级别的日志信息,还是会输出在 info.log文件中,因为warn优先级比info高,但是我们只是拦截了error而已。
最新文章
- Eclipse 调试Bug之使用断点的七大技巧
- FreeRTOS知识点
- phpcms中action值的含义
- 最牛逼android上的图表库MpChart(二) 折线图
- Java基础-常量,变量,成员变量,局部变量
- arm-linux-gcc 常用参数讲解 gcc编译器使用方法
- db2建立表空间
- angularjs学习总结一(表达式、指令、模型)
- 第一章 工欲善其事 必先利其器—Android SDK工具(3)
- SQL Server数据库的操作流程和连接的简单介绍
- scanf返回值问题
- web前端vertical-align的作用及对象详解
- 微信小程序开发之scroll-view
- win10安装spacemacs
- MongoDB学习笔记(转)
- 【1】HTTP协议和Socket接口区别
- python查询mysql并生成excel表
- 【转】iOS-浅谈revoke证书对App的影响
- django信号 signal
- 十二生肖swift1.2
热门文章
- mongodb增删改查操作
- Service-stack.redis 使用PooledRedisClientManager 速度慢的原因之一
- 阶段3 3.SpringMVC&#183;_03.SpringMVC常用注解_7 ModelAttribute注解
- linux之磁盘管理,网络,计时任务
- 数据存储--SQLite
- react navigation goBack()返回到任意页面(不集成redux) 一
- office web apps安装部署,配置https,负载均衡(三)服务器连接域控制器
- C#吾日三省吾身
- 【linux开发】IO端口和IO内存的区别及分别使用的函数接口
- LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询