日志:slf4j+logback 的配置与使用

2023-11-12

1. 常用日志组件和选择

java开发日志处理是发现和调试bug所 必不可少的,那么现在企业中常用的日志组件有哪些呢,JCL 、 JUL、  SLF4j、Log4j、  Log4j2 、 Logback、 jboss-loggin 等,一般日志是配套出现的,一般是由  一个日志门面 和 一个日志实现 配套使用,
那么 组成以下结构
日志门面 日志实现
    JCL      log4j
  SLF4j    log4j2
       jboss-loggin   logback
      JUL
那么,下面开始 一个个排除
JUL:实现简陋,很多地方受到开发者的吐槽,所以 首先排除
jboss-loggin:自诞生之初,就不是为了服务大众,不受到什么青睐,所以 也排除
log4j:log4j虽然声名显赫,但是在这里 首先要知道一点  slf4j 、log4j、logback 这三个框架都是同一个作者ceki 开发的,作者说 log4j 太烂,不想修改了,因此开发了 升级版的 log4j,也就是 logback ,因此在这里 我们划掉 log4j
log4j2:log4j2不是log4j的升级版,而是apache开发的,log4j2 该框架很优秀,正是因为太优秀,设计时与 部分框架对其支持的程度有限,不一定会什么时候踩坑,而log4j2在设计时的性能是优于logback的,但是 99%的开发者不会有机会体会到这种差距,因为  logback也很优秀,足够我们日常开发,所以我们划掉 log4j2
JCL:划掉JCL 主要是因为 日志实现上我们选择了 logback,而 logback和slf4j 毕竟是同一个作者写的,亲生的,合得来,而且在springboot 中 ,也是使用的  slf4j + logback,所以我们划掉了 JCL
因此,最后剩下的就是我们 这篇博客的 内容了 ,如何配置和使用  SLF4j + logback

2. 日志的使用

2.1 在这里我们新建一个springboot项目做测试
2.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对象,并且使用 当前类的类名来创建,那么 这个类名存在的意义在哪里?我们可以先运行 第一个测试,看下结果
由上图可知,我们的类名在 日志中 是为了方便我们找到异常是在哪个类中,进行锁定,不信的话,我们可以在新建一个测试类, LoggerTest2,里面什么都不写, 然后将 LoggerFactory.getLogger(LoggerTest2.class); ,我们可以在测试一次,看看结果

因此,使用类名创建的logger 的作用就是在这里,但是如果我们需要在每个类中都这样的创建一个logger对象,不方便,因此可以通过 一个注解来帮我们实现 那就是  @Slf4j ,该注解就可以帮我们自动创建一个 log对象
但是 如果使用 @Slf4j 注解 需要两点,
2.添加 lombok的依赖
测试一下,编写测试方法
@Test
    public void testSl4j(){
        log.debug("sl4j.debug...");
        log.info("sl4j.info");
        log.error("sl4j.error");
    }

这里的日志输出格式 是默认的,我们可以通过的教程 来配置 日志输出配置

3. 日志的配置

日志可以通过两种方法配置,一种是  application.yml配置,一种是  lobback-spring.xml配置
3.1 application.yml配置,这种配置方法 配置项较少,一般有以下属性配置
1. 配置输出格式 为  时间  -  消息  换行
logging:
  pattern:
    console: "%d - %msg%n"

2. 配置日志输出位置 比如磁盘 e盘
logging:
  pattern:
    console: "%d - %msg%n"
  path: e:/
运行后,我们可以看到 在 e盘下生成了一个文件  spring.log  这文件是spring生成

3. 配置日志输出文件 ,这样可以指定日志输出到哪个位置
logging:
  pattern:
    console: "%d - %msg%n"
  path: e:/
  file: e:/sell.log
我们可以看到 在e盘下生成了以下文件

这里注意:我们可以配置日志保存位置,以及具体输出的文件,如果同时配置的话,会使用我们指定的file为主,可以测
试,看e盘下具体生成什么文件
4. 配置日志 输出级别
日志一般主要看重的有5个级别,优先级如 DEBUG<INFO<WARN<ERROR<FATAL等,而springboot默认配置
是 INFO级别, 所以 我们测试代码中写了三行,在结果中我们只看到了 info 和 error的 因为 debug优先级比info低,所以我们
看不到。那么我们配置一下格式 logging.level.包名或类名: 级别 即可, 举例如下
logging:
  pattern:
    console: "%d - %msg%n"
  #path: e:/
  file: e:/sell.log
  level:
    #这里可以是包名也可以是类名
    com.lonely: debug
运行后,我们可以看到 原来只能看到 info 和 error 的,现在的debug也可以看到
3.2 lobback-spring.xml 配置

1. 我们先把 application.yml的关于日志的注释掉,新建一个文件  logback-spring.xml,为什么要取这个名字呢,Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),如果我们想自定义名字,也可以,可以在 application.yml中通过  logging.config=classpath:/xxx.xml等方式配置。
2.  注意几个 xml节点的含义
appender:配置项,规则,通过这个节点内容配置,我们可以配置输出位置(控制台,文件),输出格式等
root:根节点,表明整个项目基本的日志级别,里面可以应用多个appender规则
     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>

    <root level="info">
        <appender-ref ref="consoleLog" />
    </root>
</configuration>
在上面的 logback-spring.xml中,appender配置了一个规则, ConsoleAppender表明日志输出到控制台,layout表明输出格式,root节点配置表明该项目基础的日志级别为info,引入 控制台输出的规则,那么我们运行看结果
从结果上来看,配置的是 info级别,所以 debug的没有输出,现在如果我想把日志输出到文件怎么处理呢,可以使用如下配置,添加一个 appender规则,由于日志可能比较多,一般是按照日期来输出日志,因此如下配置了每天一个日志到指定位置
<?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的日志区分到两个文件放置,该怎么写呢?
我们现在 在新建一个规则,结构如上图,只是在里面添加了一个过滤器,使用的是范围过滤,也就是拦截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">
        <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而已。
以上就是 关于  slf4j日志的总结,边学边敲边分享~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

日志:slf4j+logback 的配置与使用 的相关文章

随机推荐

  • HTTP系列(七)—— 网关

    在 HTTP 刚诞生的年代 人们只是使用它来发送静态的在线文档 但是随着用户需求的驱动 静态的资源已经无法满足人们的需求了 人们更加期望的是在 Web 上发布复杂的资源 所以 为了解决这个问题 就提出了网关的概念 什么是网关 网关 抽象出了
  • 编译原理 CS-143(更新至week4)

    编译原理 CS 143 Pre Course Survey Navigation Your Course 01 01 Introduction 8m20s 01 02 Structure of a Compiler 13m53s 编译器结构
  • AcWing 238. 银河英雄传说 并查集模板题

    题 参考 include
  • 基于vspd DLL二次开发的虚拟串口工具

    最近项目需要 早期使用com0com做虚拟串口工具的二次开发 但是发现在系统兼容性上存在很多的问题 后来改用vspd 的免费dll做开发 在稳定性和兼容性上确实提升了很多 功能调用非常简单 可以参照如下的demo 库文件的话自行下载和链接
  • 十大机器人教育

    随着机器人行业的迅猛发展 机器人教育正越来越被大家所关注 一方面 很多大城市的中小学都开始利用机器人教育来促进信息技术教育及培养学生动手能力 另一方面 家长们也越发意识到机器人教育的重要性 机器人教育是指通过组装 搭建 编程 运行机器人 激
  • 用c语言输出整数每一位,【c语言】   输出一个整数的每一位

    先以1000以内整数为例 include int main int num 0 int a b c printf 请输入1000以内的数字 gt scanf d num if num lt 1000 a num 100 百位数字 b num
  • Kubernetes入门到实践 (一) Kubernetes介绍 与 yum安装Kubernetes集群

    文章目录 一 Kubernetes 介绍 二 Kubernetes 核心功能介绍 三 Kubernetes 节点组件介绍 四 Kubernetes集群的安装与配置 1 Kubernetes集群的五种安装方式对比 2 安装前的环境准备 2 1
  • Caffe源码中各种依赖库的作用及简单使用

    1 Boost库 它是一个可移植 跨平台 提供源代码的C 库 作为标准库的后备 在Caffe中用到的Boost头文件包括 1 shared ptr hpp 智能指针 使用它可以不需要考虑内存释放的问题 2 date time posix t
  • 如何在win11上运行VC6.0

    说明 win11是在win10的基础上开发的不完全 体 VC6 0在win11上不能正常运行 方法 1 下载安装软件 安装包链接 https pan baidu com s 17cV V9BqOCEhqm5Ss8i8Zw 提取码 64mz
  • 抓取餐厅菜单信息 - 从餐饮网站获取餐厅菜单信息及价格

    目录 1 分析目标网站的结构 2 安装所需库 3 编写爬虫程序 4 提取所需数据并保存结果
  • Android Studio支持系统签名(证书)

    让Android Studio集成系统签名 需要用到一个工具keytool importkeypair 这个工具的作用是将系统签名的相关信息导入到已有的签名文件里 可从这里下载 相关文件 platform x509 pem platform
  • Java WebService _CXF、Xfire、AXIS2、AXIS1_四种发布方式(优缺点对比)

    xis axis2 Xfire以及cxf对比 http ws apache org axis http axis apache org axis2 java core http xfire codehaus org http cxf apa
  • DVP,LVDS和MIPI

    Mipi 接口 和 LVDS 接口区别 主要区别 1 LVDS接口只用于传输视频数据 MIPI DSI不仅能够传输视频数据 还能传输控制指令 2 LVDS接口主要是将RGB TTL信号按照SPWG JEIDA格式转换成LVDS信号进行传输
  • 记录自己在结构光三维重建领域的学习过程(五)

    读了一篇论文 Domain randomization for transferring deep neural networks from simulation to the real world 讲的是域随机化 但其实我没有认真看 其实
  • html转pdf

    html转pdf 本地安装wkhtmltopdf Java操作wkhtmltopdf实现Html转PDF 本地测试
  • sqlite3的交叉编译

    比如说我们在qtcreator中编写程序的时候想用到sqlite3数据库 但是因为qtcreator中的编译器中的库中并没有sqlite3的库 所以肯定编译不了 所以若想在qtcreator中编译sqlite3的程序 首先的将sqlite3
  • 初级python爬虫薪资-月薪2万的爬虫工程师,Python需要学到什么程度?

    Python 爬虫学到什么样就可以找工作了 非计算机专业 正在自学python 很多教程里提到的网站的爬虫都会写了 比如拉勾网 豆瓣 实习僧 京东 淘宝 某妹子图等等 但是因为不是计算机专业的 也没学所谓的四大名著 不知道那四大对找工作重要
  • 残体字符设计:INVETA

    残体字符设计是logo设计中很常见的一种风格 它通过删减 多余 的笔画来实现残缺的字符 让读者通过 脑补 还原出原来的文字 以此独特的风格加深用户的产品印象 Github支持STL文本格式的3D模型预览 奈何STL格式非常简陋 难以表示复杂
  • android 的 Testing Support Library 测试支持包(库)

    Testing Support Library 测试支持包 库 这个库提供了一系列的api来快速的创建和运行测试对于你的app 包括jUnit 4 和用户 UI 的测试 创建可以使用android studio IDE 或者通过命令行 两种
  • 日志:slf4j+logback 的配置与使用

    1 常用日志组件和选择 java开发日志处理是发现和调试bug所 必不可少的 那么现在企业中常用的日志组件有哪些呢 JCL JUL SLF4j Log4j Log4j2 Logback jboss loggin 等 一般日志是配套出现的 一