【日志框架】

日志打印

  • 建议用{}占位而不是字符串拼接
  • 打日志前先判断日志级别是否可用:
  1. 先根据等级过滤规则再决定写不写;
  2. 先往一个管道写了内容,但再经等级过滤丢弃,徒增开销。

日志框架

Slf4J

Slf4J 不是底层日志框架,只是门面框架(抽象),需要配合jul、log4j、logback、log4j2等底层框架(真正干活的)使用。

  1. 避免日志对代码的耦合,更换日志框架时也不需改动任何代码。不论使用哪种底层框架时,在代码层面都一样。
  2. 避免引入第三方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, stdoutlog4j.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.htmlpublic 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

    1. 尝试在 classpath下查找文件logback-test.xml;
    2. 如果文件不存在,则查找文件logback.xml;
    3. 如果两个文件都不存在,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.properties

    log4j.rootLogger=info, stdoutlog4j.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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/427738.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建《幻兽帕鲁》服务器需要怎样配置的云服务器?

随着《幻兽帕鲁》这款游戏的日益流行&#xff0c;越来越多的玩家希望能够在自己的服务器上体验这款游戏。然而&#xff0c;搭建一个稳定、高效的游戏服务器需要仔细的规划和配置。本文将分享搭建《幻兽帕鲁》服务器所需的配置及搭建步骤&#xff0c;助力大家获得更加畅快的游戏…

深入理解MySQL InnoDB线程模型

当我们谈论数据库性能时&#xff0c;存储引擎的线程模型是一个不可忽视的方面。MySQL的InnoDB存储引擎&#xff0c;作为目前最受欢迎的存储引擎之一&#xff0c;其线程模型的设计对于实现高并发、高性能的数据操作至关重要。在本文中&#xff0c;我们将深入探讨MySQL InnoDB线程…

CPMS靶场练习

关键&#xff1a;找到文件上传点&#xff0c;分析对方验证的手段 首先查看前端发现没有任何上传的位置&#xff0c;找到网站的后台&#xff0c;通过弱口令admin 123456可以进入 通过查看网站内容发现只有文章列表可以进行文件上传&#xff1b;有两个图片上传点 图片验证很严格…

Dubbo 3.x源码(16)—Dubbo服务发布导出源码(5)

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo 3.x源码(15)—Dubbo服务发布导出源码(4)&#xff0c;也就是Dubbo远程服务导出export方法的上半部分&#xff0c;也就是doLocalExport源码&#xff0c;将会得到一个Exporter。 现在我们…

C#使用IsLeapYear方法判断指定年份是否为闰年

目录 一、判断指定年是否为闰年的2个方法 1.使用IsLeapYear方法判断指定年份是否为闰年 2.使用自定义的算法计算指定年份是否为闰年 二、示例 1.方法1的实例 2.方法2的实例 一、判断指定年是否为闰年的2个方法 1.使用IsLeapYear方法判断指定年份是否为闰年 使用IsLeapY…

《Linux高性能服务器编程》笔记06

Linux高性能服务器编程 本文是读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第13章 多进程编程13.1 fork 系统调用13…

Spring Boot 整合 Camunda 实现工作流

工作流是我们开发企业应用几乎必备的一项功能&#xff0c;工作流引擎发展至今已经有非常多的产品。最近正好在接触Camunda&#xff0c;所以来做个简单的入门整合介绍。如果您也刚好在调研或者刚开始计划接入&#xff0c;希望本文对您有所帮助。如果您是一名Java开发或Spring框架…

使用强化学习进行神经网络结构搜索的代码以及修改

目录 代码一&#xff08;Using TensorFlow&#xff09;&#xff1a; 代码二&#xff08;Using TensorFlow&#xff09;&#xff1a; 代码三&#xff08;Using PyTorch&#xff09;&#xff1a; 参考&#xff1a; 本人在网上找了三个相关的代码&#xff0c;但是都有问题&…

Web--HTML基础

文章目录 安装环境HTMLhtml框架html基础标签语义标签html特殊符号 安装环境 安装vscode后 安装插件 可以先不写后台直接将前度界面展示出来 自动补全tag&#xff0c;同时修改tag时自动改另一半 在设置里将保存自动格式化的选项勾上 创建一个index.htm文件&#xff0c;这个…

基于sentinel-2 遥感数据的水体提取(水体指数法)

本文框架设置如下&#xff1a; 简单介绍senintel-2数据&#xff1b;如何利用sentinel-2数据获取水体边界/范围 1 Sentinel-2数据介绍及下载方式 有Sentinel-2A/2B两颗卫星&#xff0c;其参数基本一致&#xff0c;因此两颗卫星的数据联合使用很方便。 分辨率有&#xff1a;1…

springboot114基于多维分类的知识管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的基于多维分类的知识管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章…

黑马Java——面向对象进阶(static继承)

1.static静态变量 静态变量是随着类的加载而加载的&#xff0c;优先与对象出现的