Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-上篇(详解教程)

《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-上篇(详解教程)

作者头像
北京-宏哥
修改于 2024-04-19 08:04:44
修改于 2024-04-19 08:04:44
38100
代码可运行
举报
运行总次数:0
代码可运行

1.简介

Apache Log4j 是一个非常古老的日志框架,并且是多年来最受欢迎的日志框架。 它引入了现代日志框架仍在使用的基本概念,如分层日志级别和记录器。

2015 年 8 月 5 日,该项目管理委员会宣布 Log4j 1.x 已达到使用寿命。 建议用户使用 Log4j 1 升级到 Apache Log4j 2。因此宏哥觉得有必要介绍一下Log4j 2,今天就单独一篇介绍一下。

2.Log4j2简介

Apache Log4j 2是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。

与 Logback 一样,Log4j2 提供对 SLF4J 的支持,自动重新加载日志配置,并支持高级过滤选项。 除了这些功能外,它还允许基于 lambda 表达式对日志语句进行延迟评估,为低延迟系统提供异步记录器,并提供无垃圾模式以避免由垃圾收集器操作引起的任何延迟。

所有这些功能使 Log4j2 成为这三个日志框架中最先进和最快的。

3.log4j2优点

log4j2参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:

(1)异常处理:在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制。

(2)性能提升:log4j2相较于log4j 1和logback都具有很明显的性能提升。

(3)自动重载配置:参考了logback的设计,提供自动刷新参数配置,可以动态的修改日志的级别而不需要重启应用。

(4)无垃圾机制,log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvm gc。

 4.log4j2配置说明

log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本常用.xml后缀的文件进行配置,除此之外还包含.json和.jsn配置文件

log4j2虽然采用xml风格进行配置,依然包含三个组件,分别是 Logger(记录器)、Appender(输出目的地)、Layout(日志布局)。

4.1XML配置文件解析

(1)根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).

status用来指定log4j本身的打印日志的级别.monitorinterval为log4j 2.x新特点自动重载配置。指定自动重新配置的监测间隔时间,单位是s,最小是5s。

(2)Appenders节点,常见的有三种子节点:Console、File、RollingFile

Console节点用来定义输出到控制台的Appender.File节点用来定义输出到指定位置的文件的Appender.RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.

通过在子节点中加入<PatternLayout pattern="自定义信息格式"/>进行日志布局

%c 输出所属类的全名,可写为 %c{Num} ,Num类名输出的范围 如:"com.sun.aaa.classB",%C{2}将使日志输出输出范围为:aaa.classB%d 输出日志时间其格式为 可指定格式 如 %d{HH:mm:ss}等%l 输出日志事件发生位置,包括类目名、发生线程,在代码中的行数%n 换行符%m 输出代码指定信息,如info(“message”),输出message%p 输出日志的优先级,即 FATAL ,ERROR 等%r 输出从启动到显示该条日志信息所耗费的时间(毫秒数)%t 输出产生该日志事件的线程名

(3)Loggers节点,常见的有两种:Root和Logger.

Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

5.日志的级别

我们现在要调用logger的方法,不过在这个Logger对象中,有很多方法,所以要先了解log4j的日志级别,log4j规定了默认的几个级别:trace<debug<info<warn<error<fatal等。这里要说明一下:

级别之间是包含的关系,意思是如果你设置日志级别是trace,则大于等于这个级别的日志都会输出。

基本上默认的级别没多大区别,就是一个默认的设定。你可以通过它的API自己定义级别。你也可以随意调用这些方法,不过你要在配置文件里面好好处理了,否则就起不到日志的作用了,而且也不易读,相当于一个规范,你要完全定义一套也可以,不用没多大必要。

这不同的级别的含义大家都很容易理解,这里就简单介绍一下:

trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。

debug:调试么,我一般就只用这个作为最低级别,trace压根不用。是在没办法就用eclipse或者idea的debug功能就好了么。

info:输出一下你感兴趣的或者重要的信息,这个用的最多了。

warn:有些信息不是错误信息,但是也要给程序员的一些提示,类似于eclipse中代码的验证不是有error 和warn(不算错误但是也请注意,比如以下depressed的方法)。

error:错误信息。用的也比较多。

fatal:级别比较高了。重大错误,这种级别你可以直接停止程序了,是不应该出现的错误么!不用那么紧张,其实就是一个程度的问题。

6.环境准备

6.1准备工作

1.下载地址:https://logging.apache.org/log4j/2.x/download.html 宏哥可以通过下载地址下载最新版本是2.17.2。如下图所示:

2.去官方下载log4j 2,导入jar包,基本上你只需要导入下面两个jar包就可以了(xx是乱七八糟的版本号):

(1)log4j-core-xx.jar

(2)log4j-api-xx.jar

下载好了之后,将jar包添加到Eclipse项目的lib中去。如下图所示:

 到此准备工作已经完成了,下边宏哥开始实战!

7.项目实战

7.1开始使用

我们知道,要在某个类中使用log4j记录日志,只需要申明下面的成员变量(其实不一定要是成员变量,只是为了方便调用而已)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static Logger logger = LogManager.getLogger(MyApp.class.getName());

这里getLogger有一个参数指定的是这个logger的名称,这个名称在配置文件里面可是有需要的,这个待会儿再说。

声明了Logger对象,我们就可以在代码中使用他了。

7.2代码设计

1.在这里宏哥随便写个测试类,调用就是这么简单,log4j的核心在配置文件上。如下图所示:

2.如果没有自定义配置文件,上面这个类在写一个main方法,调用测试类的方法。就可以运行代码测试你写的测试类。如下图所示:

7.3参考代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * @author 北京-宏哥
 * 
 * @公众号:北京宏哥
 * 
 * 《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出(详解教程)
 *
 * 2022年3月24日
 */

public class Test {
    
    static Logger logger = LogManager.getLogger(Test.class.getName());

    public boolean hello() {
        logger.entry(); // trace级别的信息,单独列出来是希望你在某个方法或者程序逻辑开始的时候调用,和logger.trace("entry")基本一个意思
        logger.error("Did it again!"); // error级别的信息,参数就是你输出的信息
        logger.info("我是info信息"); // info级别的信息
        logger.debug("我是debug信息");
        logger.warn("我是warn信息");
        logger.fatal("我是fatal信息");
        logger.log(Level.DEBUG, "我是debug信息"); // 这个就是制定Level类型的调用:谁闲着没事调用这个,也不一定哦!
        logger.exit(); // 和entry()对应的结束方法,和logger.trace("exit");一个意思
        return false;
    }
    public static void main(String[] args) {
        
        Test t = new  Test();
        t.hello();
    }
}
7.4运行代码

1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

从上图可以看到,只有>=ERROR的日志输出来了(这是因为Log4j有一个默认的配置,它的日志级别是ERROR,输出只有控制台)。

7.5定义日志级别

1.宏哥自己新建一个xml文件放在SRC目录下,即根目录下。命令为log4j2.xml,定义好了日志,把日志级别改成了TRACE,如下图所示:

 2.参考XML:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>  
<configuration status="OFF">  
  <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="TRACE">  
      <appender-ref ref="Console"/>  
    </root>  
  </loggers>  
</configuration>  

3.再次运行代码,控制台输出如下图所示:

 从上边的xml文件可以看到宏哥把configuration>loggers>root的level属性改为trace,就可以输出刚才写的所有信息了。

 8.外部引用xml配置文件

8.1代码设计
8.2参考代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package testSuites;

import java.io.File;  
import java.io.FileInputStream;    
import org.apache.logging.log4j.LogManager;  
import org.apache.logging.log4j.Logger;  
import org.apache.logging.log4j.core.config.ConfigurationSource;  
import org.apache.logging.log4j.core.config.Configurator;  
  
/**
 * @author 北京-宏哥
 * 
 * @公众号:北京宏哥
 * 
 * 《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j2实现日志输出(详解教程)
 *
 * 2022年3月27日
 */

public class ConfigTest {  
      
    private static Logger logger = LogManager.getLogger(ConfigTest.class);  
    /** 
     * log4j 2读取配置文件 
     * log4j 2读取的配置文件可以分为三类:src下的配置文件、绝对路径的配置文件、相对路径的配置文件 
     */  
      
    //第一类  加载src下的配置文件  
    public static void test0(){  
        //src下的配置文件会默认的被log4j的框架加载,我们就不显示的加载了  
        //直接测试  
        logger.info("我打印了.......");  
        //输出内容  
        //11:06:16.957 [main] INFO  testSuites.ConfigTest - 我打印了.......
    }  
      
    //第二类  绝对路径的配置文件  
    public static void test1(){  
        //我们将log4j2.xml放在D盘下  
        //这是需要手动的加载  
        //绝对路径配置文件        
        ConfigurationSource source;  
        try {  
            //方法1  使用  public ConfigurationSource(InputStream stream) throws IOException 构造函数  
            source = new ConfigurationSource(new FileInputStream("F:\\workspace\\Bjhg_Selenium\\log4j2.xml"));  
              
            //方法2 使用 public ConfigurationSource(InputStream stream, File file)构造函数  
            File config=new File("F:\\workspace\\Bjhg_Selenium\\log4j2.xml");  
            source = new ConfigurationSource(new FileInputStream(config),config);  
              
            //方法3 使用 public ConfigurationSource(InputStream stream, URL url) 构造函数  
            String path="F:\\workspace\\Bjhg_Selenium\\log4j2.xml";  
            source = new ConfigurationSource(new FileInputStream(path),new File(path).toURL());  
              
            //source.setFile(new File("D:\log4j2.xml"));          
            //source.setInputStream(new FileInputStream("D:\log4j2.xml"));        
            Configurator.initialize(null, source);                
            Logger logger = LogManager.getLogger(ConfigTest.class.getName());         
            logger.trace("trace...");         
            logger.debug("debug...");         
            logger.info("info...");       
            logger.warn("warn...");       
            logger.error("error...");         
            logger.fatal("fatal...");  
            //一下是运行效果  
            /*11:57:38.457 [main] ERROR testSuites.ConfigTest - error...
              11:57:38.461 [main] FATAL testSuites.ConfigTest - fatal...*/  
        } catch (Exception e) {  
            e.printStackTrace();  
        }         
    }  
      
    //第三类  相对路径的配置文件加载  
    public static void test2(){  
        //这里需要注意路径中不要出现中文和空格,如果存在中文,请使用url转码  
        ConfigurationSource source;  
        try {  
            //方法1 使用System.getProperty  
            String config=System.getProperty("user.dir");  
            source = new ConfigurationSource(new FileInputStream(config+"/log4j2.xml"));  
            Configurator.initialize(null, source);  
            Logger logger = LogManager.getLogger(ConfigTest.class.getName());         
            logger.trace("trace...");         
            logger.debug("debug...");         
            logger.info("info...");       
            logger.warn("warn...");       
            logger.error("error...");         
            logger.fatal("fatal...");  
              
            //输出内容  
            /*11:57:38.457 [main] ERROR testSuites.ConfigTest - error...
              11:57:38.461 [main] FATAL testSuites.ConfigTest - fatal...*/  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
      
    public static void main(String[] args) {  
        //test0();  
        //test1();  
        test2();  
    }  
}  
8.3运行代码

1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

9.小结

 好了,时间也不早了,今天就分享和讲解到这里,希望对您有所帮助,感谢您耐心地阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
log4j2的使用_logback log4j
配置文件的格式:log2j配置文件可以是xml格式的,也可以是json格式的, 配置文件的位置:log4j2默认会在classpath目录下寻找log4j2.xml、log4j.json、log4j.jsn等名称的文件,如果都没有找到,则会按默认配置输出,也就是输出到控制台,也可以对配置文件自定义位置(需要在web.xml中配置),一般放置在src/main/resources根目录下即可
全栈程序员站长
2022/10/04
4490
log4j2的使用_logback log4j
《手把手教你》系列基础篇(八十八)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-下篇(详解教程)
上一篇宏哥讲解和分享了如何在控制台输出日志,但是你还需要复制粘贴才能发给相关人员,而且由于界面大小限制,你只能获取当前的日志,因此最好还是将日志适时地记录在文件中直接打包发给相关人员即可。因此这一篇宏哥主要讲解和分享如何通过log4j2将日志输出到文件中。
北京-宏哥
2022/04/27
2960
《手把手教你》系列基础篇(八十八)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-下篇(详解教程)
《手把手教你》系列基础篇(八十九)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-上篇(详解教程)
 今天讲解和分享这篇文章主要是由于log4j2前段时间新闻发现 Apache Log4j2 近日被公开的远程代码执行漏洞在全球引起了重大影响:https://www.oschina.net/news/172999,因此可以用logback日志框架替换一下。slf4j是Java的简单日志门面API,很多日志实现都可以与之集成,如JDK logging (java.util.logging), log4j和logback。优点是代码里不会有具体的日志实现类,减少侵入。与log4j相比,logback具有一些优势,如更好的性能、更少的内存使用、自动重加载配置文件以及过滤功能等。
北京-宏哥
2022/04/27
4790
《手把手教你》系列基础篇(八十九)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-上篇(详解教程)
《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
  自动化测试中如何输出日志文件。任何软件,都会涉及到日志输出。所以,在测试人员报bug,特别是崩溃的bug,一般都要提供软件产品的日志文件。开发通过看日志文件,知道这个崩溃产生的原因,至少知道触发崩溃的条件是什么。同样在自动化测试框架设计,日志文件输出是不可或缺的。我们习惯通过日志输出来记录我们用例执行的情况。当然测试报告更直观,但是如果出现问题,往往是日志文件更有效。这里我们介绍如何通过Log4j.jar来帮助我们输出一个日志。
北京-宏哥
2022/04/27
7010
《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
Log4j 2.0在开发中的高级使用详解—读取配置文件(六)
log4j中配置日志文件存放的位置不一定在src下面,即根目录下。这个时候我们需要解决如何加载配置文件的问题。在log4j1.x中解决的方法就比较多了。如:PropertyConfigurator.configure();和DOMConfigurator.configure ();这两种方法读取。而在log4j2.x当中,这两个类都已经不存在了。这个时候我们该如何去加载配置文件呢? 答案也很简单,就是log4j2.x的版本给我提供了ConfigurationSource和Configurator这两
业余草
2019/01/21
3K0
spring引入log4j2日志框架
Log4j2是Apache的一个开源项目,通过使用Log4j2,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
逍遥壮士
2020/09/18
1.7K0
spring引入log4j2日志框架
带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J
使用过Log4J和LogBack的同学肯定能发现,这两个框架的设计理念极为相似,使用方法也如出一辙。其实这个两个框架的作者都是一个人,Ceki Gülcü,俄罗斯程序员。
码老思
2023/10/19
3.7K0
带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J
浅谈Log4j和Log4j2的区别
log4j是通过一个.properties的文件作为主配置文件的,而现在的log4j 2则已经弃用了这种方式,采用的是.xml,.json或者.jsn这种方式来做,可能这也是技术发展的一个必然性,毕竟properties文件的可阅读性真的是有点差。
BUG弄潮儿
2022/06/30
8220
快速了解常用日志技术(JCL、Slf4j、JUL、Log4j、Logback、Log4j2)
JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框架使用方便,学习简单,能够在小型应用中灵活使用。
ha_lydms
2023/08/09
1.3K0
快速了解常用日志技术(JCL、Slf4j、JUL、Log4j、Logback、Log4j2)
Log4j2 日志
Apache Log4j2 是 Log4j 的升级,对其前身 Log4j 1.x进行了重大改进,并提供了Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。
JanYork_简昀
2022/05/23
3680
Log4j2 日志
springboot整合篇-springboot整合log4j2
log4j2设计之初是为了审计,log4j2是log4j 1.x 的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升。
Java开发者之家
2021/06/17
6400
logging总结 - log4j2使用流程[归档存储]
<web-app> 2.5 以前要多个依赖 log4j-web,还需要在web.xml配置listener、filter
wuweixiang
2018/08/14
1.6K0
高性能的Java日志框架log4j2
Apache Log4j2 和 Logback 对比有很大的改进。除了内部设计的调整外,主要有以下几点的大升级:
神秘的寇先森
2021/04/13
1.2K0
高性能的Java日志框架log4j2
SSM项目配置Log4j2
在Spring5.x版本之后,原来的Log4j有很多东西废弃了,所以改用log4j2
别团等shy哥发育
2023/02/25
6250
SSM项目配置Log4j2
细说log4j
可能做过java项目的基本上都是用过log4j,它是用来做java日志的。比如我们做一个项目分为很多的模块,那我们怎么想要知道它什么时候启动了,这时候我们可以使用log4j标记某某模块启动了。 努力的人绝对不会成为落后的标兵,加油!废话不多说,进入log4j。 一、log4j简介 1.1、log4j概述   log for java(java日志)   Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器
用户1195962
2018/01/18
1.7K0
细说log4j
Java日志体系(log4j2)
1 log4j2 1.1 简介 log4j2,一个日志的实现框架,是log4j的升级版本,于2014年7月正式亮相。与第一代log4j不同,log4j2完全重写了log4j的日志实现,并不是在原有基础
贾博岩
2018/05/11
2.9K0
Log4j 2.0在开发中的高级使用详解—配置简单的文件输出(四)
在log4j 1.x的版本中,我们想将日志输出的文件中,需要很复杂的配置。这点已经在2.0的版本中得到了大大的改善。 简单的配置,以及灵活的应用,已经成为了一种趋势。不管我们以追加的形式写日志文件,还是覆盖的形式,配置他们都是小菜。 还有比如日志文件大小自动分割,自动备份,无死锁,高性能等等。更令人欣喜的是,它支持json格式的配置,加载快,轻巧,异步读写。 好吧,来看它的使用吧。 看配置文件log4j2.xml代码:
业余草
2019/01/21
8710
还在用Logback?Log4j2的异步性能已经无敌了,还不快试试
Logback 算是JAVA 里一个老牌的日志框架,从06年开始第一个版本,迭代至今也十几年了。不过logback最近一个稳定版本还停留在 2017 年,好几年都没有更新;logback的兄弟 slf4j 最近一个稳定版也是2017年,有点凉凉的意思。
JAVA日知录
2021/04/23
1.1K0
还不了解,日志框架吗?
经过上面,我们已经知道常用的日志框架有:Log4j JUL JCL Slf4j Logback Log4j2
Java_慈祥
2024/08/06
1540
还不了解,日志框架吗?
细说log4j之log4j 2.x
从图中可以看出,log4j2中的主要组件为:Filter,Appender,Logger,他们的层次关系为: Configuration -- Filter -- Appender - Layout -- Filter -- Logger -- Filter 2. log4j 2.x配置 log4j 2.x的配置文件格式和1.x的配置文件格式完全不同,需要特别注意。 log4j 2.x从2.4版本开始支持properties配置文件,名称必须为:log4j2.properties。但是,对于log4j 2.x的配置,建议使用xml格式:log4j2.xml,各个组件配置非常灵活。 log4j 2.x 配置框架: 简洁模式:
编程随笔
2019/09/11
8390
细说log4j之log4j 2.x
推荐阅读
相关推荐
log4j2的使用_logback log4j
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文