java slf4j,Commons Logging与log4j,Logback,tinylog和异常配合使用

这篇具有很好参考价值的文章主要介绍了java slf4j,Commons Logging与log4j,Logback,tinylog和异常配合使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

maven 官网仓库地址:maven repo

历史背景

1、日志是什么?

        日志是每天记录我们程序情况的。日志管理的目的是为了记录日志。

2、为什么会有日志?

        1、问题追溯,通过日志文件的记录可以使我们运维或者程序员快速查找问题根源。

        2、状态检测,检测我们系统状况,为项目出现的问题做好预警。

        3、安全审计

3、日志级别划分

日志级别一共分为五层:1、ERROR(错误) 2、WARNING(警告)3、INFO(常规状态)4、Debug(调试信息)5、Trace(调试,信息更详细)
 

private  static Logger logger=Logger.getLogger(String.valueOf(类名.class));//对哪里做检测
public static void main(String[] args) {
    logger.info("这是一个inf");//各种行为产生的日志级别以及相应的反馈。
    logger.warning("警告!警告!");                                                         
}

4、日志对性能的影响

        1、static对Logger实例化的影响。

        2、合理判定日志等级。

        3、优先使用参数,减少字符串的拼接。

Java自带的日志类库有很多,如jdk自带的Logger、log4j、Logback,他们之间互不兼容,slf4j是解决他们之间不兼容的适配器接口。

log4j、Logback非常相似,都是java日志的框架实现,但是为什么要在log4j之后又做一个Logback呢?

是因为:

1、Logback实现了对内核的重写使得性能提高,初始化内存加载小。

2、测试充分,经过数年间Logback经受了大大小小不同级别的测试。

3、  Logback-classic非常自然地实现了slf4j,所以切换到其他的日志狂阶非常容易只需要提供几个jar包就可以了。

4、自动从新加载配置文件。当我们对配置文件做了更改之后Logback-classic自动对我们的配置文件做加载。

5、Lilith不仅仅是能够对log事件观测,还能处理大量log文件。
 

异常处理最佳实践
在Java中,异常处理是一项非常重要的技能,良好的异常处理能够使程序更加健壮和可靠。以下是一些异常处理的最佳实践:

1.不要捕获所有异常。应该尽可能地具体地捕获异常,并处理它们。

2.不要在catch语句块中使用System.out.println()等输出语句。应该使用日志记录工具,例如Log4j、Slf4j等等。

3.不要在finally语句块中使用return语句。如果在finally语句块中使用return语句,那么可能会覆盖try语句块中的return语句,导致程序出现意外行为。

4.不要忽略异常。即使是无法处理的异常,也应该在日志中记录下来,以便于后续的调试和分析。

5.不要在循环中捕获异常。应该尽可能地将try-catch语句块放在循环外面。
 

slf4j和log4j

slf4j是通用的接口规范,log4j是具体实现的日志插件,slf4j也可以搭配其他实现的jar包一起使用。

一、What
1、slf4j和log4j的区别是什么?
log4j:log for java,Apache的一个开源项目,可以通过一个配置文件灵活配置日志的输送目的地、记录级别、输出格式。

slf4j:simple log facade for java,译为简单日志门面。官方介绍为,SLF4J作为各种日志系统的简单Facade或抽象,允许最终用户在部署时插入所需的日志框架。

总结:slf4j是通用的接口规范,log4j是具体实现的日志插件。

二、Why
1、log4j为什么搭配slf4j一起使用?
在知晓了slf4j是一套接口、log4j是一套具体实现后,就需要理解编程中“接口”的意义(统一规范、解耦、提高编程灵活性和可维护性)。
同理,在实现不同项目开发中“日志记录”的过程中,引入一套通用的日志接口规范后,既能兼容不同项目中使用的不同日志实现插件,又能在后期维护中随时更换其他的日志实现插件。

2、为什么推荐使用slf4j作为日志接口规范?
日志实现插件可以根据需要更换Logback或其他。日志接口规范还有Commons Logging,而slf4j的出现主要因为对前者的不满意,所以slf4j是对Commons Logging的改进。这里改进主要看一点:支持带占位符的字符串。
例如
 

 String me = "jettech";
    String you = "zhangsan";
    // Commons Logging 打印日志
    log.info("Hello, " + you + ". I'm " + me + ".");
    // slf4j 打印日志
    log.info("Hello, {}. I'm {}.", you, me);  
————————————————

三、How

1、log4j怎样搭配slf4j使用?

1.1 引入依赖

maven坐标为

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.13</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.13</version>
    </dependency>

报错:

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
 

 检查自己的maven依赖,发现已经引入了slf4j-api-xx.jar了,这是为什么呢?其原因是,SLF4J本身不是一个日志实现库,而是一个日志库的抽象层,它必须依赖底层的日志库,SLF4J必须和其他日志库配合才能正常运行。一般来说,需要将抽象层(例如slf4j-api-xx.jar)+中间层(例如slf4j-log4j12)+实现层(例如log4j)这三层都配置好才能保证SLF4J正常运行。有的日志库也可以去掉中间层,例如slf4j-api和slf4j-simple就可以直接配合。

slf4j+log4j组合

1)抽象层+中间层+实现层的方式解决

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.7</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>2.0.7</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.slf4j</groupId>-->
<!--            <artifactId>slf4j-simple</artifactId>-->
<!--            <version>2.0.7</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

还要加个log4j配置文件:log4j.properties 在resources资源下面创建

# Set root logger level to DEBUG and its only appender to console.
log4j.rootLogger=DEBUG, console

# console is set to be a ConsoleAppender.
log4j.appender.console=org.apache.log4j.ConsoleAppender

# console uses PatternLayout.
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

或者用slf4j+logback组合

    <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.3.0</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.3.0</version>
        </dependency>

2).抽象层+实现层的方式解决

引入下面的依赖,重新编译后就正常了,注意假如你从maven库里复制来的有 test,需要改成 compile或者就不加这个scope,不加的时候默认是compile,才能正常使用,test表示只有在测试环境下,才可以使用,而springboot是运行在main方法中,不属于测试环境,所以这个包就相当于没有加入依赖,也就没有被加载到。改成compile则表示编译的时候就会加载此jar包.

可以看到,无论是第一个错误还是第二个错误,都是依赖版本的问题,官方在Jdk1.9开始对于slf4j-api以及其他如slf4j-log4j12等依赖的绑定机制不同了,Jdk1.9对应slf4j-api以及slf4j-log4j12的版本从1.8.0开始。所以,为了解决以上两个问题,(如果我们使用的是Jdk1.8及以下)我们可以直接降低这两个依赖的版本到1.8.0以下,或者升级为Jdk1.9再使用这两个依赖的版本为1.8.0以上。
 

       <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.30</version>
<!--            <scope>test</scope>-->
        </dependency>

!!!特别注意:以上slf4j-log4j12的scope要么直接去掉,要么改为compile,因为test代表只有在测试(@Test)的时候该依赖才起作用。 

1.2 创建一个静态常量的日志对象

在需要打印日志的Java Bean 中,定义属性成员:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
...
private static final Logger logger = LoggerFactory.getLogger(getClass());
...
...
logger.info("Hello, world.")

PS: 日志对象在类的实例中一般不需要修改和多份对象,所以常用static和final修饰。

2、常用的日志框架该如何组合选择?

常用组合方式为:
1. Slf4j + Logback
2. Slf4j + Log4j
3. Commons Logging + Log4j

PS: Logback更适合搭配Slf4j,不建议搭配Commons Logging, 因为Logback与Slf4j为同一作者,兼容性更好文章来源地址https://www.toymoban.com/news/detail-603847.html

到了这里,关于java slf4j,Commons Logging与log4j,Logback,tinylog和异常配合使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java.lang.ClassCastException: class org.apache.logging.slf4j.SLF4JLoggerContext cannot be cast 解决方案

      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作

    2024年02月11日
    浏览(33)
  • 应用中日志的优雅使用(整合log4j2与SLF4J)

    应用中不可直接使用日志系统( Log4j、 Logback) 中的 API,而应依赖使用日志框架( SLF4J、 JCL–Jakarta Commons Logging) 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 日志框架( SLF4J、 JCL–Jakarta Commons Logging)的使用方式(推荐使用 SLF4J) 所有

    2023年04月09日
    浏览(28)
  • 【异常】org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4

    这个错误表明在你的项目中同时引入了 log4j-slf4j-impl 和 log4j-to-slf4j 两个依赖,而这两者是互斥的,不能同时存在。 解决这个问题有两种方式: 移除冲突的依赖 : 在你的项目的构建文件(如 pom.xml )中,找到引入的依赖列表,检查是否同时引入了 log4j-slf4j-impl 和 log4j-to-slf

    2024年02月04日
    浏览(25)
  • logging.level的含义及设置 【java 日志 (logback、log4j)】

    日志级别 tracedebuginfowarnerrorfatal 常用的有:debug,info,warn,error 通常我们想设置日志级别,会用到 logging.level.root=info logging.level设置日志级别,后面跟生效的区域。root表示整个项目。 也可以写某个包,或者某个类。 例如:logging.level.com.ali.service=error。在com.ali.service包下所有

    2024年02月10日
    浏览(27)
  • 使用@Slf4j后引入log,idea标红

    引入@Slf4j注解 idea标红Cannot resolve symbol ‘log’ 引入Lombok插件 如果在Marketplace查不到时,不妨关闭菜单再打开试下

    2024年01月18日
    浏览(23)
  • Maven编译java及解决程序包org.apache.logging.log4j不存在问题

    1、首先新建一个文件夹,比如hello Hello里新建pom.xml 注意上面dependencies部分用于解决程序包org.apache.logging.log4j不存在问题,即 Maven编译java及解决程序包org.apache.logging.log4j不存在问题 和文件夹srcmainjava java里新建Exploit.java和LogTest.java Exploit.java LogTest.java 2、然后使用meve compile编

    2024年02月10日
    浏览(25)
  • @Slf4j 变量log找不到符号,附上网上一般处理流程

    编译时,总是报:找不到符合,符号:变量 log。可是我按照其他项目明明是可以正常编译的,至少可以说明IDEA的配置,相关插件都是没问题的    一般问题处理: 问题1、缺失插件 打开File——settings——Plugins 在其中搜索Lombok并进行安装   问题2、编译时没有编译注解 打开

    2024年02月16日
    浏览(26)
  • slf4j java: 程序包org.slf4j不存在问题解决

    Error:(17, 1) java: 程序包org.slf4j不存在 1、本来就集成了日志依赖,后面添加了一个新的maven依赖,导致lombok.extern.slf4j.@Slf4j注解有问题。 解决办法:手动引入slf4j依赖和log4j依赖 旭东怪的个人空间-旭东怪个人主页-哔哩哔哩视频 哔哩哔哩旭东怪的个人空间,提供旭东怪分享的视

    2024年02月12日
    浏览(35)
  • 单元测试报错解决java.lang.NoClassDefFoundError: org/apache/logging/log4j/util/ReflectionUtil

    原因是新版本的log4j-core包中不包含org/apache/logging/log4j/util/ReflectionUtil这个类,在2.2版本后这个类被迁移到log4j-jcl包中。 引入新的包即可 maven引入 gradle引入 即可解决

    2024年02月16日
    浏览(29)
  • JAVA基础 - SLF4J: Class path contains multiple SLF4J bindings

    告警描述 告警显示,在类路径下包含了多个SLF4J的绑定,然后选择了一个实现类。 如何解决 方案一 根据项目的实际情况,删除多余的JAR包,多个JAR包路径如下: 方案二 查看项目的POM文件中是否有重复的SLF4J引入,如何查看?: 找到多余的SLF4J,然后将其排除:

    2024年02月04日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包