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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【7月更文挑战第5天】Apache Log4j 2是一个日志框架,它是Log4j的升级版,提供了显著的性能提升,借鉴并改进了Logback的功能,同时修复了Logback架构中的问题。Log4j2的特点包括API与实现的分离,支持SLF4J,自动重新加载配置,以及高级过滤选项。它还引入了基于lambda表达式的延迟评估,低延迟的异步记录器和无垃圾模式。配置文件通常使用XML,但也可以是JSON或YAML,其中定义了日志级别、输出目的地(Appender)和布局(Layout)。

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.

通过在子节点中加入进行日志布局

%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

级别之间是包含的关系,意思是如果你设置日志级别是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记录日志,只需要申明下面的成员变量(其实不一定要是成员变量,只是为了方便调用而已)

private static Logger logger = LogManager.getLogger(MyApp.class.getName());

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

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

7.2代码设计

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

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

7.3参考代码

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:

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参考代码

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.小结

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



每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问):


Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

 


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1天前
|
Web App开发 敏捷开发 数据管理
自动化测试框架的设计与实现
【9月更文挑战第32天】在软件开发的海洋中,自动化测试如同一艘精确导航的船只,确保我们的应用程序能够在波涛汹涌的技术潮流中稳健航行。本文将带你领略自动化测试框架的设计之美,从搭建基础到功能扩展,再到维护实践,我们将一起探索如何打造一个既高效又灵活的自动化测试体系。
|
17天前
|
敏捷开发 IDE 测试技术
自动化测试框架的选择与应用
【9月更文挑战第16天】在软件开发周期中,测试环节扮演着至关重要的角色。随着敏捷开发和持续集成的流行,自动化测试成为提升软件质量和效率的关键手段。本文将探讨如何根据项目需求选择合适的自动化测试框架,并通过实际案例分析展示其在软件开发过程中的应用。我们将从单元测试、集成测试到端到端测试等多个层面,讨论自动化测试的最佳实践和常见问题解决策略。
|
7天前
|
敏捷开发 Java 测试技术
自动化测试框架的选择与应用
【9月更文挑战第26天】在软件开发的海洋里,自动化测试是那一盏指路明灯。它不仅加快了开发周期,还提升了软件质量。本文将带你探索自动化测试框架的世界,了解它们的核心特性、适用场景及如何根据项目需求做出明智选择。让我们一起启航,找到那把打开高效、稳定软件生产大门的钥匙。
|
12天前
|
Web App开发 JavaScript Java
自动化测试的利剑:Selenium WebDriver入门与实践
【9月更文挑战第21天】在软件开发的海洋中,自动化测试犹如一艘船,帮助开发者们快速航行至质量保证的彼岸。本文将作为你的罗盘,指引你了解和掌握Selenium WebDriver这一强大的自动化测试工具。通过深入浅出的方式,我们将探索Selenium WebDriver的基本概念、安装过程以及编写简单测试脚本的方法。无论你是刚接触自动化测试的新手,还是希望提升测试技能的开发者,这篇文章都将为你提供有价值的指导。
|
8天前
|
敏捷开发 数据管理 测试技术
自动化测试框架的设计与实现
【9月更文挑战第25天】 本文将引导读者深入理解自动化测试框架的核心概念,并展示如何从零开始构建一个简单且有效的自动化测试框架。通过通俗易懂的语言和实际代码示例,我们将探讨测试框架设计的关键步骤、实现方法以及常见问题的解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
10天前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
|
19天前
|
敏捷开发 Java 测试技术
探索自动化测试的奥秘:从Selenium到Appium
【9月更文挑战第14天】软件测试,这个看似枯燥乏味却至关重要的领域,正经历着一场革命。随着技术的进步,自动化测试工具如Selenium和Appium已成为质量保证的利器。本文将带你一探这些工具的神秘面纱,了解它们如何简化测试流程、提升效率,并确保软件产品的质量。准备好,我们将深入自动化测试的世界,解锁其背后的原理和实践技巧。
|
8天前
|
设计模式 测试技术 持续交付
自动化测试框架的设计与实现
【9月更文挑战第25天】本文旨在探讨如何设计并实现一个高效、可扩展的自动化测试框架,以提升软件测试的效率和质量。通过分析当前流行的测试框架特点,结合最佳实践,提出一套完整的解决方案。文章不仅涵盖框架设计的理论依据,还包括具体实现步骤和示例,帮助读者深入理解自动化测试框架的搭建过程。
|
12天前
|
Web App开发 测试技术 持续交付
自动化测试的利器:Selenium与Python的完美结合
【9月更文挑战第21天】在软件开发的世界里,测试是确保产品质量的关键步骤。随着敏捷开发和持续集成的流行,自动化测试工具变得尤为重要。本文将介绍如何使用Selenium和Python进行高效的自动化测试,不仅提供代码示例,还深入探讨如何设计测试用例、选择正确的测试框架、以及如何整合到CI/CD流程中。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
24 3
|
25天前
|
Web App开发 Java 测试技术
自动化测试的利器:Selenium WebDriver入门与实践
【9月更文挑战第8天】在软件开发的海洋中,测试是确保我们不会溺水的那根救生索。Selenium WebDriver,作为自动化测试的明星工具,让这根救生索更加结实可靠。本文将带你快速上手Selenium WebDriver,从基础设置到实际操作,再到实战演练,让你的开发之旅更加平稳顺畅。
下一篇
无影云桌面