java:slf4j、log4j、log4j2、logback日志框架的区别与示例
文章目录
- 背景
- SLF4J - 简单日志门面:
- Log4j - 强大而古老的日志框架:
- Log4j2 - Log4j的升级版:
- Logback - Log4j的继任者:
- 比较
- Springboot集成slf4j、log4j2
- 参考
背景
在Java开发中,日志记录是一个不可或缺的组成部分。为了满足不同的需求,Java社区涌现出多个日志框架,其中包括SLF4J、Log4j、Log4j2和Logback。本文将比较这些框架,以及为什么在项目中选择使用它们。
SLF4J - 简单日志门面:
SLF4J 是一个为Java提供简单日志的门面。它并不是一个具体的日志实现,而是提供了一个通用的API,允许开发者选择底层的日志框架。下面是一个简单的SLF4J使用示例:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class SLF4JExample {private static final Logger logger = LoggerFactory.getLogger(SLF4JExample.class);public static void main(String[] args) {logger.info("Hello, SLF4J!");}
}
slf4j不是一个真正意义的可用应用程序,他是一个接口层
就像java 的接口性质一样,单纯集成了slf4j 的话,执行比如log.info log.debug等方法,只能在控制台打印日志,并不会在持久化到文件,或者其他自定义介质上,slf4j至少需要一个实现层框架,比如log4j,logback等
Log4j - 强大而古老的日志框架:
Log4j 是Java社区中最早的日志框架之一,提供了丰富的功能,包括异步日志、插件支持等。下面是一个Log4j的使用示例:
import org.apache.log4j.Logger;public class Log4jExample {private static final Logger logger = Logger.getLogger(Log4jExample.class);public static void main(String[] args) {logger.info("Hello, Log4j!");}
}
Log4j2 - Log4j的升级版:
Log4j2 是 Log4j 的升级版,解决了 Log4j 1.x 存在的性能和线程安全问题。它引入了新的特性,如异步日志、插件体系结构等。以下是一个Log4j2的使用示例:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class Log4j2Example {private static final Logger logger = LogManager.getLogger(Log4j2Example.class);public static void main(String[] args) {logger.info("Hello, Log4j2!");}
}
Logback - Log4j的继任者:
Logback 是由 Log4j 的创始人开发的日志框架,旨在成为 Log4j 的继任者。它具有与 Log4j 相似的功能,并被认为是更现代和性能更好的选择。以下是一个Logback的使用示例:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LogbackExample {private static final Logger logger = LoggerFactory.getLogger(LogbackExample.class);public static void main(String[] args) {logger.info("Hello, Logback!");}
}
比较
slf4j,log4j,log4j2,logback 时间线:log4j ->slf4j ->logback ->log4j2
-
SLF4J 是一个日志门面,它允许在不修改应用代码的情况下切换不同的日志实现。一般与具体的实现框架(如Logback或Log4j2)一起使用。
-
Log4j 是一个功能强大而古老的日志框架,提供了许多高级功能。然而,由于其1.x版本存在一些问题,现在更推荐使用 Log4j2。
-
Log4j2 是 Log4j 的升级版,解决了旧版本的一些问题,性能更好,并引入了新特性。在现代项目中,是一个不错的选择。
-
Logback 是由 Log4j 的创始人开发的日志框架,旨在成为 Log4j 的继任者。它具有较好的性能和一些新特性,是一个流行的选择。
在选择日志框架时,考虑项目需求、性能、易用性和社区支持等因素是很重要的。大多数现代Java应用程序选择使用 SLF4J 作为日志门面,结合 Logback 或 Log4j2 作为底层实现,以提供较好的性能和灵活性。
Springboot集成slf4j、log4j2
Spring Boot默认使用SLF4J作为日志门面,并且通过classpath中的依赖关系,Log4j2会被自动识别并成为默认的日志实现。下面是一个简单的示例:
1、添加依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2、创建Log4j2配置文件:
在src/main/resources目录下创建一个名为log4j2.xml的文件,用于配置Log4j2。以下是一个简单的配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>
也可以不配置xml文件,使用 application.properties
logging.file.path=./logs
logging.level.root=info
logging.file.name=./logs/app.log
3、编写Spring Boot应用程序:
创建一个简单的Spring Boot应用程序,使用SLF4J进行日志记录。例如,创建一个HelloController:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {private static final Logger logger = LoggerFactory.getLogger(HelloController.class);@GetMapping("/hello")public String hello() {logger.info("你好啊,我是log4j");return "Hello, world!";}
}
可以看到命令行打印出来了
由于我们在 application.properties 配置了日志的路径,所以在这个路径下也保存了一份日志,你也可以将日志保存到数据库或者其他地方
参考
https://blog.csdn.net/madness1010/article/details/128332275
相关文章:
java:slf4j、log4j、log4j2、logback日志框架的区别与示例
文章目录 背景SLF4J - 简单日志门面:Log4j - 强大而古老的日志框架:Log4j2 - Log4j的升级版:Logback - Log4j的继任者:比较Springboot集成slf4j、log4j2参考 背景 在Java开发中,日志记录是一个不可或缺的组成部分。为了满足不同的需求,Java社区涌现出多…...
Mysql学习查缺补漏----02 mysql之DCL 数据控制语言
查看数据库里都有哪些用户。 使用root任何一个用户都可以登录。 本机登录。 也可以这样登录其他的机器。 、 修改user表。 刷新权限: 现在我们看到了只有本机才能登陆。 我们这样就可以限制这个mysql指定某台服务器登录。 详解忘记密码以及如何修改用户密码 我们…...
【Flink基础】-- 延迟数据的处理
目录 一、关于延迟的一些概念 1、什么是延迟? 2、什么导致互联网延迟?...
通过keepalived+nginx实现 k8s apiserver节点高可用
一、环境准备 K8s 主机配置: 配置: 4Gib 内存/4vCPU/60G 硬盘 网络:机器相互可以通信 k8s 实验环境网络规划: podSubnet(pod 网段) 10.244.0.0/16 serviceSubnet(service 网段): 1…...
JavaScript 数组
JavaScript 数组 用来存储一系列相关数据的一种数据类型 创建数组 字面量方式 ----- [1,2,3,4,5,6];实例化构造函数 ----- new Array(1,2,3,4,5,6);组成数组的元素可以是任意的数据类型包括数组本身; new Array(n): n 表示数组的长度 内容操作 获取(查…...
【数据结构】二叉树的实现
目录 1. 前言2. 二叉树的实现2.1 创建一棵树2.2 前序遍历2.2.1 分析2.2.2 代码实现2.2.3 递归展开图 2.3 中序遍历2.3.1 分析2.3.2 代码实现2.3.3 递归展开图 2.4 后序遍历2.4.1 分析2.4.2 代码实现2.4.3 递归展开图 2.5 求节点个数2.5.1 分析2.5.2 代码实现 2.6 求叶子节点个数…...
振弦采集仪在土体与岩体监测中的可靠性与精度分析
振弦采集仪在土体与岩体监测中的可靠性与精度分析 振弦采集仪是一种用于土体和岩体监测的重要设备,它可以通过测量振动信号来获取土体或岩体的力学参数,如应力、应变、弹性模量等。而振弦采集仪的可靠性和精度是影响其应用效果的关键因素。 首先&#x…...
C语言进阶之路-指针、数组等混合小boss篇
目录 一、学习目标: 二、指针、数组的组合技能 引言 指针数组 语法 数组指针 三、勇士闯关秘籍 四、大杂脍 总结 一、学习目标: 知识点: 明确指针数组的用法和特点掌握数组指针的用法和特点回顾循环等小怪用法和特点 二、指针、数…...
【矩阵论】Chapter 7—Hermite矩阵与正定矩阵知识点总结复习
文章目录 1 Hermite矩阵2 Hermite二次型3 Hermite正定(非负定矩阵)4 矩阵不等式 1 Hermite矩阵 定义 设 A A A为 n n n阶方阵,如果称 A A A为Hermite矩阵,则需满足 A H A A^HA AHA,其中 A H A^H AH表示 A A A的共轭转…...
Golang语言基础之切片
概述 数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性 func arraySum(x [3]int) int{sum : 0for _, v : range x{sum sum v}return sum } 这个求和函数只能接受 [3]int 类型,其他的都不支持。 切片 切片(Slic…...
SpringCloud-服务消费者Fegin调用时无法获取异常信息
一、前言 假设有以下需求: 服务消费者A调用服务提供者B往MySQL新增一条人员信息服务提供者做了一个逻辑判断:若无该人员信息则新增,若已存在该人员信息,则返回给消费者异常状态码及异常信息:“请勿添加重复数据” 问…...
re:invent 2023 Amazon Q 初体验
授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre,知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 前言 亚马逊云科技在2023 re:Invent全球大会上宣布推出 Amazon…...
认知觉醒(四)
认知觉醒(四) 第三节 耐心:得耐心者得天下 20世纪八九十年代,金庸的武侠小说风靡全国。如今,虽然几十年过去了,金庸先生也已与世长辞,但他留下的作品依然广受欢迎,被奉为经典。如此成就,自然…...
AI模型部署 | onnxruntime部署YOLOv8分割模型详细教程
本文首发于公众号【DeepDriving】,欢迎关注。 0. 引言 我之前写的文章《基于YOLOv8分割模型实现垃圾识别》介绍了如何使用YOLOv8分割模型来实现垃圾识别,主要是介绍如何用自定义的数据集来训练YOLOv8分割模型。那么训练好的模型该如何部署呢?…...
模拟电路学习笔记(一)之芯片篇(持续更新)
模拟电路学习笔记(一)之芯片篇(持续更新) 1.CD4047BE芯片 CD4047是一种包含高电压的多谐振荡器,该器件的操作可以在两种模式下完成,分别是单稳态和非稳态。CD4047需要一个外部电阻器和电容器来决定单稳态…...
如何利用CentOS7+docker+jenkins+gitee部署springboot+vue前后端项目(保姆教程)
博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…...
qt 5.15.2 主窗体事件及绘制功能
qt 5.15.2 主窗体事件及绘制功能 显示主窗体效果图如下所示: main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.setFixedWidth(600);w.setFixedHeight(6…...
(2)(2.4) TerraRanger Tower/Tower EVO(360度)
文章目录 前言 1 安装传感器并连接 2 通过地面站进行配置 3 参数说明 前言 TeraRanger Tower 可用于在 Loiter 和 AltHold 模式下进行目标规避。传感器的最大可用距离约为 4.5m。 TeraRanger Tower EVO 可用于在 Loiter 和 AltHold 模式下进行目标规避。传感器的最大可用…...
Redis_主从复制、哨兵模式、集群模式详解
Redis的主从复制 为什么Redis要引入主从复制?what? 在这里博主为小伙伴们简单的做下解释,可以了解一下 实际生产环境下,单机的redis服务器是无法满足实际的生产需求的。 第一,单机的redis服务器很容易发生单点故障&am…...
关于神舟-战神TA5NS系统重装问题
加装固态卡在log处无法开机问题 下面是我的步骤 1.按f7选择pe安装系统,然后发现卡在战神log处不转动 2.下载驱动 TA5NS驱动地址 下载RAID驱动(如果没有私信我,我网盘里有),拷到u盘中,然后进入pe系统里面…...
前端大文件上传webuploader(react + umi)
使用WebUploader还可以批量上传文件、支持缩略图等等众多参数选项可设置,以及多个事件方法可调用,你可以随心所欲的定制你要的上传组件。 分片上传 1.什么是分片上传 分片上传,就是将所要上传的文件,按照一定的大小,将…...
人大金仓(kingbase)数据库常用sql命令
一. 字段 1. 添加 alter table book add column book_id varchar not null, book_title varchar(10) default ;2. 删除 alter table book drop book_id, book_title;// 外键时 alter table book drop book_id, book_title cascade;3. 修改类型 alter table book alter colu…...
HashMap相关专题
前置知识:异或运算 异或运算介绍 异或有什么神奇之处(应用)? (1)快速比较两个值 (2)我们可以使用异或来使某些特定的位翻转,因为不管是0或者是1与1做异或将得到原值的相…...
threejs WebGLRenderer 像素比对画布大小的影响
官方文档 - WebGLRenderer .setPixelRatio ( value : number ) : undefined 设置设备像素比。通常用于避免HiDPI设备上绘图模糊 .setSize ( width : Integer, height : Integer, updateStyle : Boolean ) : undefined 将输出canvas的大小调整为(width, height)并考虑设备像素比…...
RocketMQTemplate.send() 与 RocketMQTemplate.syncSend() 方法详解
Apache RocketMQ 是一款强大的分布式消息中间件,与 Spring Boot 集成后,通过 RocketMQTemplate 提供了多种方法来发送消息。其中,send() 和 syncSend() 是两个常用的发送消息方法,本文将深入探讨它们的区别以及详细解释这两个方法…...
波奇学C++:类型转换和IO流
隐式类型转换 int i0; double pi; 强制类型转换 int* pnullptr; int a(int)p; 单参数构造函数支持隐式类型转换 class A { public:A(string a):_a(a){} private:string _a; }; A a("xxxx"); //"xxx" const char* 隐式转换为string 多参数也可以通过{…...
集成开发环境 PyCharm 的安装【侯小啾python基础领航计划 系列(二)】
集成开发环境PyCharm的安装【侯小啾python基础领航计划 系列(二)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…...
Java核心知识点整理大全27-笔记(已完结)
目录 30. 云计算 30.1.1. SaaS 30.1.2. PaaS 30.1.3. IaaS 30.1.4. Docker 30.1.4.1. 概念 30.1.4.2. Namespaces 30.1.4.3. 进程(CLONE_NEWPID 实现的进程隔离) 30.1.4.4. Libnetwork 与网络隔离 30.1.4.5. 资源隔离与 CGroups 30.1.4.6. 镜像与 UnionFS 30.1.4.7.…...
1. 使用poll或epoll创建echo服务器
1. 说明: 此篇博客主要记录一种客户端实现方式,和两种使用poll或者epoll分别创建echo服务器的方式,具体可看代码注释: 2. 相关代码: 2.1 echoClient.cpp #include <iostream> #include <cstdio> #incl…...
【对象数组根据属性排序】
// sort使用的排序方法 // 传入对象数组用于排序的对象的属性,升序/降序 function compare(property, sortType "asc") {debugger// 如果不是 asc,desc,不做下一步比较if (!(sortType "desc" || sortType "asc")) {return;}return function (…...
发明迷网站豆渣做豆腐/seo关键词排名软件流量词
最近一位想跳槽大厂的老程序员朋友面试了几家发现:6年前面试最常问的并且可以顺利拿到高薪的技能是 Dubbo ,2年前面试,只要你简历上有 Spring Cloud 项目的相关经验,肯定会打动面试官,现在呢?简历上有Dubbo和简单的Spr…...
做网站用哪个服务器好/seo推广网络
《读懂一本书:樊登读书法》_精选读后感500字我们为何要读书?这个问题好回答,也不好回答!我们读书带着目的?或者不带目的?都不重要!重要的是能够使自己成长和进步,只有这样才能积累“…...
网站建设的合同书/网络营销策略制定
一、前言为了方便小公司没有运维开发人员,利用Jenkin解决了繁琐的打包部署问题。这次我就写了一个Gogs的集成教程,我觉的Gogs私服比较简单,其他的GitLab、svn、GitHub基本上也是一样的,搭建好了,开发人员只需要提交到版…...
两个wordpress用户/2023免费b站推广大全
文章目录0 效果1 题目2 思路3 代码0 效果 1 题目 2 思路 排序后,以此判断两个相邻元素是否相等。 3 代码 int cmp(const void* p1, const void* p2){return *(int*)p1 - *(int*)p2; }bool containsDuplicate(int* nums, int numsSize){qsort(nums, numsSize, s…...
哪个网站做脚本/抖音seo关键词优化怎么做
chown (change owner) 更改所有者 查看系统所有用户 这里面都是系统默认的用户 [rootevan-01 ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x…...
班级网页设计模板图片/搜索引擎优化时营销关键词
试验一:配置区域与转发器 一、 添加DNS服务器角色 二、 创建区域,添加主机记录 三、 设置转发器 四、 验证DNS服务器...