Springboot之日志整合LogBack(二)_kaico2018的博客-程序员宝宝

技术标签: java  springboot  logback  

前面已经介绍了各个日志框架了,这里就直接介绍 Springboot 怎么整合LogBack日志。

logbok日志使用步骤

1、引入依赖
实际开发中有时不需要引入下面这个依赖,因为有很多其他的依赖中包含了下面这个依赖。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

2、编写logback的xml配置文件(logback-spring.xml)
官方推荐使用的xml名字的格式为:logback-spring.xml而不是logback.xml,至于为什么,因为带spring后缀的可以使用这个标签。用来区分测试、生产环境。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration  scan="true" scanPeriod="10 seconds">

    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <!--日志文件存放路径-->
    <property name="log.path" value="E:/home/kaico/logs" />

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>


    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!--输出到文件-->

    <!-- 时间滚动输出 level为 DEBUG 日志 -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_debug.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档 -->
            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_info.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 WARN 日志 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_warn.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--
        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
        以及指定<appender>。<logger>仅有一个name属性,
        一个可选的level和一个可选的addtivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
              还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
              如果未设置此属性,那么当前logger将会继承上级的级别。
        addtivity:是否向上级logger传递打印信息。默认是true。
    -->
    <!--<logger name="org.springframework.web" level="info"/>-->
    <!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
    <!--
        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
        第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
        第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别: 推荐使用第二种
     -->


    <!--
        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
        不能设置为INHERITED或者同义词NULL。默认是DEBUG
        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
    -->

    <!--开发环境:打印控制台-->
    <springProfile name="hikari">
        <logger name="com.kaico" level="debug"/>
    </springProfile>

    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="DEBUG_FILE" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>

    <!--生产环境:输出到文件-->
    <!--<springProfile name="pro">-->
    <!--<root level="info">-->
    <!--<appender-ref ref="CONSOLE" />-->
    <!--<appender-ref ref="DEBUG_FILE" />-->
    <!--<appender-ref ref="INFO_FILE" />-->
    <!--<appender-ref ref="ERROR_FILE" />-->
    <!--<appender-ref ref="WARN_FILE" />-->
    <!--</root>-->
    <!--</springProfile>-->

</configuration>

3、修改application.yml配置文件
主要配置logback的配置文件的路径,还有mybatis输出sql语句的日志。

#打印sql语句到日志
logging:
  level:
    com.kaico.shiro.*: debug
  #logback日志配置文件的路径
  config: classpath:logback-spring.xml

4、代码中使用
可以整合lombok插件来使用日志框架。

package com.kaico.shiro.controller;

import com.kaico.shiro.dao.db1.SysUserDao;
import com.kaico.shiro.pojo.SysUser;
import com.kaico.shiro.service.SysUserService;
import lombok.extern.log4j.Log4j2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;
import java.util.UUID;

//@Log4j2
@RestController
@RequestMapping("test/")
public class TestController {
    

    private final static Logger log = LoggerFactory.getLogger(TestController.class);

    @Autowired
    private SysUserDao sysUserDao;

    @Autowired
    private SysUserService sysUserService;

    @RequestMapping(value = "test",method = RequestMethod.GET)
    public String test(){
    
        List<Map<String, String>> all = sysUserDao.getAll();
        for (Map<String, String> stringStringMap : all) {
    
            System.out.println("all:" + stringStringMap.entrySet().toString());
        }

        log.info("测试logback日志框架");
        return "你好。";
    }

    @RequestMapping(value = "test1",method = RequestMethod.GET)
    public String test1(){
    
        int i = sysUserService.insertUser(new SysUser());
        return "你好。" + i;
    }

    @RequestMapping(value = "test2",method = RequestMethod.GET)
    public String test2(String num){
    
        int i = sysUserDao.insertUser(new SysUser(UUID.randomUUID().toString(), "冯凯" + num));
        return "你好。" + i;
    }
}

注意

使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:

  • 第一种把改成这样就会打印sql,不过这样日志那边会出现很多其他消息
  • 第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44044929/article/details/119781452

智能推荐

MySQL(一)_weixin_45797397的博客-程序员宝宝_mysql卸载

什么是数据库?数据库是一种存储并管理数据的软件系统存储:持久化管理:增删改查一、常用的存储数据的方式:1、Java中的变量:生命周期短,不能实现持久化2、序列化:管理数据时依赖于Java中的反序列化3、txt,办公软件:没有统一的方式管理数据4、数据库二、数据库概述DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。DB:数据库(Database)SQL:结构化查询语言,(Structure Q

Linux 中一些常用的命令_dayday_upyy的博客-程序员宝宝_linux命令-daystart

Linux中一些重要目录: bin:命令,二进制可执行程序boot:内核,与启动有关的文件dev:设备文件(光驱)etc:系统的配置文件home:所有普通用户的家目录lib:系统存放库文件的地方media:多媒体mnt:临时挂载点$:表明是普通用户proc:虚拟的目录,里面存放的是进程的属性信息root:管理员的家目录selinux:安全软件tm...

adb 命令_prog_dong的博客-程序员宝宝_adb对prog的要求

Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 可以通过下列几种方法加入adb:1. 在设备上运行shell命令2.通过端口转发来管理模拟器或设备3.从模拟器或设备上拷贝来或拷贝走文件 下面对adb进行了介绍并描述了常见的使用.查询模拟器/设备实例概要Android 调试系统是一个面对客户服务系统,包括

《C程序设计语言》练习 4-4_qq_33685612的博客-程序员宝宝_在栈操作中添加几个命令

练习 4-4 在栈操作中添加几个命令,分别用于在不弹出元素的情况下打印栈顶元素; 复制栈顶元素;交换栈顶两个元素的值。另外增加一个命令用于清空栈。/*打印栈顶元素*/void printtop(void){ if (op > 0) printf("%g\n", val[op - 1]); else printf("error: stack e

树中两个结点的最低公共祖先 ----《剑指offer》面试题50_baboon_chen的博客-程序员宝宝_一棵树两个节点的最近的公共父节点

题目求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针。思路一: 如果是二叉搜索树 位于左子树的结点都比父结点小,而位于右子树的结点都比父结点大。那么在树中从上到下找到的第一个在两个输入结点的值之间的结点,就是最低的公共祖先。 二: 如果不是二叉搜索树,但是每个结点有指向父结点的指针 组织两条链表,每个链表是由叶结点指向根结点的路径。从而将问题转换成:求两个...

从零单排冲kubebuilder(一)_你大晨哥的博客-程序员宝宝

背景一直觉得这种脚手架的东西虽然方便,但是不好掌握它,调教它,归根结底还是不够了解,因此打算从最基础开始了解kubebuilder。解决什么事?首先你想使用一个东西前你肯定要知道这东西帮你解决什么事。那现在就是有这么一个需求。说开发同学不太懂k8s,最好的办法就是开发扔给k8s一个yaml,直接就来一个全套,什么pod、ingress、pvc全给你一条龙弄好,应用直接就跑了起来。相当于有一个中间人他读懂了开发扔过来的yaml并根据yaml的要求去工作。需要什么?想要完成这件事,首先我要一个中间人。

随便推点

git每次提交代码都需要输入用户名和密码_段先生~的博客-程序员宝宝

解决办法:参考地址:https://jingyan.baidu.com/article/4b07be3cf27d8148b280f36a.html

【Shiro 自学笔记二】自定义 Realm 实现 MD5 加密、加盐与再散列_Koorye的博客-程序员宝宝_hashiterations

文章目录什么是MD5加盐散列Shiro 实现 MD5 加密基本 MD5 加密加盐与散列自定义 Realm 实现登录验证自定义 Realm 实现 MD5 加密声明加密算法声明加盐和散列上一期我们完成了基本的登录操作,然而,直接通过明文密码登录显然是非常不安全的。因此,我们必须对密码进行加密以加强信息的安全性。什么是MD5MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value)

关于opencv中的CvChain 结构_weixin_33963189的博客-程序员宝宝

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

论C语言两整数平均值的4种算法_bxrx88514的博客-程序员宝宝

小学数学中我们就学过一种简单的求解两个整数平均数的算法(a+b)/2,当然它同样适用于我们的C语言#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;intmain(){inta=10;intb=20;printf("%d\n",(a+b)/2);system("pause");ret...

linux性能优化_xinqidian_xiao的博客-程序员宝宝_linux性能优化配置

最主要的工作是优化系统配置,使应用在系统上以最优的状态运行,但是由于硬件问题、软件问题、网络环境等的复杂性 和多变性,导致对系统的优化变得异常复杂,如何定位性能问题出在哪个方面,是性能优化的一大难题, 本章从系统入手,重点讲述由于系统软、硬件配置不当可能造成的性能问题,并且给出了检测系统故障和优化性能的一般方法和流程。1 cpu性能评估 Cpu是影响Linux性能的主要因素之一,下面先介绍几个...

推荐文章

热门文章

相关标签