当前位置:网站首页>【日志框架】
【日志框架】
2022-08-04 00:51:00 【昱浑】
日志打印
- 建议用{}占位而不是字符串拼接
- 打日志前先判断日志级别是否可用:
- 先根据等级过滤规则再决定写不写;
- 先往一个管道写了内容,但再经等级过滤丢弃,徒增开销。
日志框架
Slf4J
Slf4J 不是底层日志框架,只是门面框架(抽象),需要配合jul、log4j、logback、log4j2等底层框架(真正干活的)使用。
- 避免日志对代码的耦合,更换日志框架时也不需改动任何代码。不论使用哪种底层框架时,在代码层面都一样。
- 避免引入第三方jar而其中日志框架不一致时需要同时维护不同的日志框架对应的配置文件。
补充:更老的门面框架还有jcl, 所以会看到有程序应用 jcl + log4j 这种搭配。Slf4J 后采用 Slf4J + log4j,但一些 jcl + log4j 项目也想用Slf4J 时,可以通过引入 jcl-over-slf4j log桥接工具的依赖,将原本输出到jcl的日志输出重定向到 SLF4J。
如果只用了slf4j,而没有使用任何底层框架,就会出现以下错误:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
log4j
- 依赖
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
- 配置文件 log4j.properties
log4j.rootLogger=info, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
- 代码
输出import org.apache.log4j.Logger; //更多请阅读:https://www.yiibai.com/log4j/log4j_sample_program.html public class log4jExample{ static Logger log = Logger.getLogger(log4jExample.class.getName()); public static void main(String[] args) { if (log.isDebugEnabled()) { log.debug("### Hello this is an debug message"); } log.info("### Hello this is an info message"); // 不支持占位符 } }
2022-07-27 21:10:03,358 INFO [org.example.log4jExample] - ### Hello this is an info message
logback (原生实现 SLF4J)
Logback 旨在作为流行的 log4j 项目的继承者,在 log4j 1.x 停止的地方接手。
Logback 的架构非常通用,可以在不同的情况下应用。 目前,logback 分为三个模块,logback-core、logback-classic 和 logback-access。
logback-core 模块为其他两个模块奠定了基础。
logback-classic 模块可以同化为 log4j 1.x 的显着改进版本。 此外,logback-classic 原生实现了 SLF4J API。
logback-access 模块与 Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能。 请注意,您可以轻松地在 logback-core 之上构建自己的模块。
依赖
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
默认配置
Logback 默认配置的步骤 参考:https://www.cnblogs.com/warking/p/5710303.html
- 尝试在 classpath下查找文件logback-test.xml;
- 如果文件不存在,则查找文件logback.xml;
- 如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台。
logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
<logger name="com.apache.ibatis" level="DEBUG"/>
</configuration>
代码
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogbackExample { static Logger log = LoggerFactory.getLogger(LogbackExample.class); public static void main(String[] args) { if (log.isDebugEnabled()) { log.debug("### Hello this is an debug message"); } log.info("### Hello this is an info message"); // 不支持占位符 } }
输出
129 [main] INFO org.example.LogbackExample - ### Hello this is an info message
如果需要将日志按规则生成到文件,也可以在logback.xml中配置;logback.xml中各标签的含义,查阅上文。
如图可以配置将日志信息同时实时输出到终端和离线输出到日志文件。@Slf4j 注解
能够少写两行代码,不用每次都在类的最前边写上:
private static final Logger logger = LoggerFactory.getLogger(this.XXX.class);
需要 lombok依赖。如果是基于SpringBoot,因为默认加入了Slf4j-api和logback的依赖,所以只需要添加lombok的依赖即可。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
- 代码
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SLF4JExample {
public static void main(String[] args) {
if (log.isDebugEnabled()) {
log.debug("### Hello this is an debug message");
}
log.info("### Hello this is an info message"); // log 由lombok提供,如报错是idea的问题
}
}
log4j 适配 Slf4j
- 依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.28</version>
</dependency>
只需要依赖 slf4j-log4j12,它自身依赖log4j 和 slf4j-api 两个包。
配置
由于底层框架仍然使用的是log4j,仍然需要 配置文件: log4j.propertieslog4j.rootLogger=info, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
代码
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogSlf4jExample { static Logger log = LoggerFactory.getLogger(LogSlf4jExample.class); public static void main(String[] args) { if (log.isDebugEnabled()) { log.debug("### Hello this is an debug message"); } log.info("### Hello this is an info message"); // 不支持占位符 } }
在代码层面已经实现和使用logback时一样了,都是从 org.slf4j.LoggerFactory 这个包下 getLogger来获取 Logger 对象。
当然也可以使用 @Slf4j 注解的方法。代码是一样的,无法看出底层框架是log4j还是logback。
边栏推荐
- 如何通过单步调试的方式找到引起 Fiori Launchpad 路由错误的原因试读版
- pcl点云数据 转化为 Eigen::Map
- The problem of disorganized data output by mnn model
- Read FastDFS in one article
- outputBufferIndex = mDecode.dequeueOutputBuffer(bufferInfo, 0) 一直返回为-1
- 无代码7月热讯 | 微软首推数字联络中心平台;全球黑客马拉松...
- 《The Google File System》新说
- BGP实验(含MPLS)
- 2022-08-03: What does the following go code output?A: 2; B: 3; C: 1; D: 0.package main import "fmt" func main() { slice := []i
- C# wpf使用ffmpeg命令行实现录屏
猜你喜欢
MATLAB三维绘图命令plot3入门
c语言分层理解(c语言操作符)
Salesforce's China business may see new changes, rumors may be closing
Talking about the future development direction of my country's industrial parks
114. 如何通过单步调试的方式找到引起 Fiori Launchpad 路由错误的原因
c语言分层理解(c语言指针(上))
带你造轮子,自定义一个随意拖拽可吸边的悬浮View组件
win10+cuda11.7+pytorch1.12.0安装
The problem of disorganized data output by mnn model
nodeJs--async/await
随机推荐
Node.js的基本使用(三)数据库与身份认证
七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
jmeter跨平台运行csv等文件
字符串变形
2023年第六届亚太应用数学与统计学国际会议(AMS 2023)
114. How to find the cause of Fiori Launchpad routing error by single-step debugging
GeoAO:一种快速的环境光遮蔽方案
现货白银需要注意八大事项
pcl点云数据 转化为 Eigen::Map
做项目一定用得到的NLP资源【分类版】
Tanabata festival coming, VR panoramic look god assists for you
Justin Sun: Web3.0 and the Metaverse will assist mankind to enter the online world more comprehensively
Sqlnet. Ora file with the connection of authentication test
哎,又跟HR在小群吵了一架!
c语言分层理解(c语言指针(上))
新一代服务网关Gateway的实践笔记
jmeter distributed stress test
LeetCode 19:删除链表的倒数第 N 个结点
typescript50 - type specification between cross types and interfaces
R3LIVE论文学习(二):VIO子系统