`
JustOnly
  • 浏览: 6353 次
  • 性别: Icon_minigender_1
  • 来自: 火星
最近访客 更多访客>>
社区版块
存档分类
最新评论

log4j的使用(1)

阅读更多
log4j简介
    在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。
   简单的说log4j就是帮助开发人员进行日志输出管理的API类库。它最重要的特点就是可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地以及日志信息的输出格式。
   Log4j除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。程序员经常会遇到脱离java ide环境调试程序的情况,这时大多数人会选择使用System.out.println语句输出某个变量值的方法进行调试。这样会带来一个非常麻烦的问题:一旦哪天程序员决定不要显示这些System.out.println的东西了就只能一行行的把这些垃圾语句注释掉。若哪天又需调试变量值,则只能再一行行去掉这些注释恢复System.out.println语句。使用log4j可以很好的处理类似情况。
    一般的记录的样式为 [日志信息]-[操作开始的时间]-[日志级别]-[日志类别]-[用户名]-[操作名]-[消息]。

log4j的特性列表:

  • 在运行速度方面进行了优化
  • 使用基于名称的日志(logger)层次结构
  • 是fail-stop的
  • 是线程安全的
  • 不受限于预定义的实用工具集
  • 可以在运行时使用property和xml两种格式的文件来配置日志记录的行为
  • 在一开始就设计为能够处理Java异常
  • 能够定向输出到文件(file)、控制台(console)、java.io.OutputStream、java.io.Writer、远程服务器、远程Unix Syslog守护者、远程JMS监听者、NT EventLog或者发送e-mail
  • 使用DEBUG、INFO、WARN、ERROR和FATAL五5个级别
  • 可以容易的改变日志记录的布局(Layout)
  • 输出日志记录的目的地和写策略可以通过实现Appender接口来改变
  • 支持为每个日志(logger)附加多个目的地(appender)
  • 提供国际化支持


log4j使用方法
1.定义配置文件
   Log4j的初始化,通常使用配置文件灵活配置log日志的输出方式(输出优先级、输出目的地、输出格式)。
   Log4j支持两种配置文件格式,一种是XML 格式的文件log4j.xml,一种是Java特性文件log4j.properties(键=值)。
   需把log4j.jar和Log4j.properties(或者log4j.xml)放入classpath,log4j默认会在classpath中寻找log4j的配置文件。
  可指定配置文件位置如:
  set JAVA_OPTS=%JAVA_OPTS% -Dlog4j.configuration=
   或在程序中指定   log4j.xml  --PropertyConfigurator.configure()(DOMConfigurator.configure()).
                                  Log4j.properties --PropertyConfigurator.configure("String path");

2.组成部分
   Log4j中有三个主要的组件,它们分别是Logger、Appender和Layout.
   (1)logger指定log的名字,打印级别和采用哪种或者哪几种Appender。
   (2)Appender用来指明log信息打印到什么地方(如控制台,文件等).
   (3)Layout的作用是控制Log信息的输出格式.
  
2.1 配置Logger
log4j.rootLogger = [ level ] , appenderName, appenderName, …

    Logger的名称是区分大小写的,依据名称可以确定其层次结构(即父子关系),规则如下:
         如果Logger A的名称后跟一个点(.)是Logger B的名称的前缀就认为Logger A是Logger B的祖先。
         如果在Logger A和Logger B之间,Logger B没有任何其它的祖先就认为Logger A是Logger B的父亲。
    在Logger的层次结构的最顶层是rootLogger,它会永远存在,而且不能通过名字取到。 即 所有的logger都是继承于rootLogger,如果某个logger没有被分配level,那么它将从一个被分配了级别的最接近它的父logger那里继承level。因此在定义日志的时候通常会给rootLogger赋予一个level。

    level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。
    Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。
    appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。

    Logger选择日志记录请求(log request)的规则:   
        假设Logger M具有q级的Level,这个Level可能是设置的也可能是继承到的。   
        如果向Logger M发出一个Level为p的日志记录请求,那么只有满足p>=q时这个日志记录请求才会被处理。
    比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。

    另一种说法:
    当某个logger的logging request(即printing method(error(),info()..))的级别高于或者等于该logger的级别(即在log4j.properties或者 log4j.xml中定义)的时候,该logging request就为enable. 一旦该logger的logging request为enable,那么该logging request将总会打印到该logger所有的appender中包括它的所有父logger的appender。(而不会管父logger的级别如何)。除非该logger的父logger的additivity设置为false,默认的情况下为true。
    某个logger的additivity设置为false,表示log只打印到本log的appender中,而不再打印到其父logger的appender。

图示 1. Logger的层次结构图(附件中)
    Loger x.y是Logger x.y.z的祖先,因为x.y.是x.y.z的前缀,这符合规则的前一条。另外在Logger x.y和Logger x.y.z之间,Logger x.y.z没有其它的祖先,因此Logger x.y是Logger x.y.z的父亲,这符合规则的后一条。这样我们依据上面的规则就可以构造出如图1所示的Logger的层次结构。

    从图1中我们还可以看到每一个Logger都有一个Level,根据该Level的值Logger决定是否处理对应的日志请求。如果Level没有被设置,就象图1中的Logger x.y一样,又该怎么办呢?答案是可以从祖先那里继承。
    如 果Logger C没有被设置Level,那么它将沿着它的层次结构向上查找,如果找到就继承并结束,否则会一直查找到root logger结束。因为log4j在设计时保证root logger会被设置一个默认的Level,所以任何logger都可以继承到Level。
    图1中的Logger x.y没有被设置Level,但是根据上面的继承规则,Logger x.y继承了root logger的Level。


2.2 配置Appender
    log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.option = valueN

其中,Log4j提供的appender有以下几种:
    org.apache.log4j.ConsoleAppender(控制台),
    org.apache.log4j.FileAppender(文件),
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

    每个Logger可以有多个Appender,但是相同的Appender只会被添加一次。
    Appender的附加性意味着 Logger C会将日志记录发给它的和它祖先的所有Appender。在图1中Logger a会将日志记录发给它自己的JDBCAppender和它的祖先root logger的ConsoleAppender和FileAppender。Logger x.y.z自己没有Appender,它将把日志记录发给它的祖先root logger的ConsoleAppender和FileAppender,如果Logger x.y也含有Appender,那么它们也会包括在内。
    Appender的附加性是可以被中断的。假设Logger C的一个祖先为Logger P,如果Logger P的附加性标志(additivity flag)设置为假,那么Logger C会将日志记录只发给它的和在它和Logger P之间的祖先(包括Logger P)的Appender,而不会发给Logger P的祖先的Appender。Logger的附加性标志(additivity flag)默认值为ture。
    在图1中如果没有设置 Logger a的附加性标志(additivity flag),而是使用默认值true,那么Logger a会将日志记录发给它自己的JDBCAppender和它祖先root logger的ConsoleAppender和FileAppender,这和上面的描述相同。如果设置Logger a的附加性标志(additivity flag)的值false,那么Logger a会将日志记录发给它自己的JDBCAppender而不会在发给它祖先root logger的ConsoleAppender和FileAppender了。

2.3 配置layout  -- 日志信息的格式(布局)
    log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1

log4j.appender.appenderName.layout.option = valueN

其中,Log4j提供的layout有以下几种:
    org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

    Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
        %m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)


3.在代码中使用Log4j
    (1)获取日志记录器,这个记录器将负责控制日志信息。
        public static Logger getLogger( String name) 
        log4j是线程安全的,所以一般建议定义logger时采用static
        通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:
        static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;

    (2)读取配置文件
当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:
        BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
PropertyConfigurator.configure ( String configFilename) :
            读取使用Java的特性文件编写的配置文件,但是要注意日志记录先前的配置不会被清除和重设。
        例:
                PropertyConfigurator.configure(".\\src\\log4j.properties")
        DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

       注:在web程序中使用log4j注意问题
            --由于jsp或servlet在执行状态时没有当前路径概念,
            所以使用PropertyConfigurator.configure(String)语句找log4j.properties文件时,
            要给出相对于当前jsp或servlet的路径转化成为一个绝对的文件系统路径。
            方法是使用servletcontext.getrealpath(string)语句。如下:
            //得到当前jsp路径
            String prefix =  getServletContext().getRealPath("/");
            //读取log4j.properties
            PropertyConfigurator.configure(prefix+"\\WEB-INF\\log4j.properties");

            --相应的log4j.properties设置某个属性时也要在程序中设置绝对路径。例:
            log4j.appender.R.File属性设置日志文件存放位置。我们可以用读写.properties配置文件的方法进行灵活设置。

(3)插入记录信息(格式化日志信息)
    Logger.debug ( Object message ) ;
    Logger.info ( Object message ) ;
    Logger.warn ( Object message ) ;
    Logger.error ( Object message ) ;

4.性能优化:
    if  (logger.isDebugEnabled())
         {      log.debug("hello" + i + j);      }
    而不是直接在程序中调用:
    logger.debug("hello" + i + j);
    log类提供isTraceEnable()、isDebugEnable()、isInfoEnable()等判断当前调试级别是否大于设置级别,如果大于或等于则返回真。这样在logger打印条件不满足的情况下就不用执行字符串的操作。
    实际开发过程中,我们通常会使用Jakarta Commons Logging (JCL),它提供的是一个日志(Log)接口(interface),允许程序开发人员使用不同的具体日志实现工具:Log4J, JDK 1.4等。
    如果应用程序的classpath中有log4j, Commons Logging则使用相关的包装(wrapper)类(Log4JLogger)
    如果应用程序运行在jdk1.4的系统中, Commons Logging使用相关的包装类(Jdk14Logger)

5. 其他相关程序配置
    Log4j提供了BasicConfigurator,它只是为root logger添加Appender。其中,
  • BasicConfigurator.configure()为root logger添加一个关联着PatternLayout.TTCC_CONVERSION_PATTERN的ConsoleAppender
  • BasicConfigurator.configure(Appender appender)为root logger添加指定的Appender
    我们可以把BasicConfigurator看成是一个简单的使用程序配置Log4j环境的示例。
    例如,要给root logger添加两个Appender(A和B),下面的代码分别完成了这个要求。
    不使用BasicConfigurator:
        Logger root = Logger.getRootLogger();
        root.addAppender(A);
        root.addAppender(B);
    使用BasicConfigurator:
        BasicConfigurator.configure(A);
        BasicConfigurator.configure(B);

6.log4j.propertiest配置
Property文件是由key=value这样的键值对所组成的,可以使用#或!作为注释行的开始。下面给出了两个简单的示例:

非常简单的示例1:

log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

稍显复杂的示例2:
log4j.rootLogger=, A1, A2
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %-5p [%t] %-17c{2}(%13F:%L)%3x - %m%n
log4j.appender.A2=org.apache.log4j.FileAppender
log4j.appender.A2.File=filename.loglog4j.appender.A2.Append=false
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-5r %-5p [%t] %c{2} - %m%n   

注:log4j.logger.logger_name=[level|INHERITED|NULL], appenderName, appenderName, ...
    上面只有INHERITED和NULL需要说明一下,其它部分和root logger相同。INHERITED和NULL的意义是相同的。如果我们使用了它们,意味着这个logger将不在使用自己的Level而是从它的祖先那里继承。
    Logger的附加性标志(additivity flag)可以使用log4j.additivity.logger_name=[false|true]来配置。

ObjectRenderer配置:我们可以通过ObjectRenderer来定义将消息对象转换成字符串的方式。语法为 log4j.renderer.fully.qualified.name.of.rendered.class=fully.qualified.name.of.rendering.class。如:
//my.Fruit类型的消息对象将由my.FruitRenderer转换成字符串
log4j.renderer.my.Fruit=my.FruitRenderer
对上面的各个配置元素的语法理解之后,在来看示例1和2就很容易了。
PropertyConfigurator不支持Filter的配置。
如果要支持Filter您可以使用DOMConfigurator,即使用XML文件的方式配置。

XML文件配置
要使用DOMConfigurator.configure()来读取XML格式的配置文件。
XML文件格式的定义是通过org/apache/log4j/xml/log4j.dtd来完成的,各个配置元素的嵌套关系如下:
<!---->
这里没有给出更为详细的内容,要了解详细的内容需要查阅log4j.dtd。
下面这个简单的示例可以使您对XML配置文件的格式有一个基本的认识:

<!----><o:p></o:p>

这里没有给出更为详细的内容,要了解详细的内容需要查阅log4j.dtd<o:p></o:p>

下面这个简单的示例可以使您对XML配置文件的格式有一个基本的认识:

<!---->

这里没有给出更为详细的内容,要了解详细的内容需要查阅log4j.dtd。

下面这个简单的示例可以使您对XML配置文件的格式有一个基本的认识:

-<-!-ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?,categoryFactory?)->
这里没有给出更为详细的内容,要了解详细的内容需要查阅log4j.dtd。
下面这个简单的示例可以使您对XML配置文件的格式有一个基本的认识:
-<-?-xml version="1.0" encoding="UTF-8" -?->
-<-!-DOCTYPE log4j SYSTEM "log4j.dtd"->
-<-log4j->
 -<-appender name="A1" class="org.apache.log4j.FileAppender"->
 -<-layout class="org.apache.log4j.PatternLayout"->
 -<-param name="ConversionPattern" value="%-5p %c{2} - %m-n"-/->
 -<-/layout->
 -<-/appender->
 -<-appender name="A2" class="org.apache.log4j.FileAppender"->
 -<-layout class="org.apache.log4j.TTCCLayout"->
 -<-param name="DateFormat" value="ISO8601" -/->
 -<-/layout->
 -<-param name="File" value="warning.log" -/->
 -<-param name="Append" value="false" -/->
 -<-/appender->
 -<-category name="org.apache.log4j.xml" priority="debug"->
 -<-appender-ref ref="A1" -/->
 -<-/category->
 -<-root priority="debug"->
 -<-appender-ref ref="A1" -/->
 -<-appender-ref ref="A2" -/->
 -<-/root->
-<-/log4j>

默认初始化过程在LogManager类的静态初始化器中完成。具体步骤如下
    检查系统属性log4j.defaultInitOverride,如果值为false则执行初始化过程,否则跳过初始化过程。
    将系统属性log4j.configuration的值赋给变量resource。
    如果log4j.configuration没有被定义则使用默认值log4j.properties。     试图转换变量resource到一个url。   
    如果变量resource不能转换成一个url,
    那么将使用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)得到一个url。
    如果还是得不到url,将忽略默认初始化过程。
    如果得到url将使用PropertyConfigurator或DOMConfigurator来配置,也可以使用自定义的XXXConfigurator。
参考资料
图解 Tomcat 体系结构
Apache Log4j项目主页
Log4j Documentation,这里的资源非常的丰富。
一切源于网络,个人资料拼图,谢谢合作。
  • 描述: LOG4j层次结构图
  • 大小: 22.4 KB
分享到:
评论

相关推荐

    老生常谈Log4j和Log4j2的区别(推荐)

    然后使用Logger.getLogger()方法获取日志记录器,而Log4j2需要import org.apache.logging.log4j.Level、org.apache.logging.log4j.LogManager和org.apache.logging.log4j.Logger,使用LogManager.getLogger()方法...

    log4j使用教程(详解)

    Log4j是一款广泛使用的开源日志框架,由Apache软件基金会开发。本文将深入探讨Log4j的基本概念、配置与使用方法。 1. **什么是Log4j** Log4j是一个基于Java的日志记录工具,它提供了灵活的控制来记录日志信息,...

    若依框架使用的log4j2.16.0,修复log4j漏洞log4j2下载最新log4j2.16.0下载

    Log4j是一个广泛使用的Java日志记录框架,它允许开发者在应用程序中轻松地记录各种级别的日志信息,如DEBUG、INFO、WARN、ERROR等。在2021年底,一个重大的安全漏洞(CVE-2021-44228)被发现在Log4j2的早期版本中,...

    logging-log4j2-log4j-2.15.0-rc2.zip maven 资源库

    如果是maven本地仓库使用,需要将zip包解压到maven资源库的/org/apache/logging/log4j下 log4j严重漏洞 log4j logging-log4j2-log4j-2.15.0-rc2 log4j-1.2-api-2.15.0.jar log4j-api-2.15.0.jar log4j-core-2.15.0....

    log4j简单使用

    1. **日志级别**: Log4j支持多个日志级别,包括TRACE、DEBUG、INFO、WARN、ERROR、FATAL和OFF。开发者可以根据需要设置不同的级别,控制哪些信息被记录。 2. **Logger**: Logger是Log4j的基本组件,用于创建和发送...

    Log4j2简介及与Log4j效率对比

    Log4j2是Apache软件基金会推出的日志框架,它是Log4j 1.x的重构版本,旨在提供更为高效且灵活的日志解决方案。与Log4j 1.x相比,Log4j2在设计上进行了重大改进,并解决了Logback等其他日志框架中存在的某些体系结构...

    SpringBoot框架配置log4j和log4j2的配置代码

    Log4j和Log4j2是两种广泛使用的Java日志框架,它们提供了灵活的日志配置和高性能的日志处理能力。本文将详细介绍如何在SpringBoot项目中配置Log4j和Log4j2。 ### SpringBoot与Log4j Log4j是Apache的一个开源项目,...

    Log4j2结合Slf4j配置使用

    Log4j2 结合 Slf4j 配置使用 Log4j2 是一个功能强大且广泛使用的日志记录工具,它提供了灵活的日志记录机制和高性能的日志记录能力。Slf4j 则是一个简单的日志记录门面,提供了统一的日志记录接口。今天,我们将...

    Log4j2学习用到的jar包及apache-log4j-2.19.0-bin.zip

    分别有disruptor-3.3.4.jar(Log4j2异步日志的底层实现)、log4j-api-2.19.0.jar(log4j门面)、log4j-core-2.19.0.jar(log4j实现)、log4j-slf4j-impl-2.19.0.jar(SLF4J与Log4j绑定)、slf4j-api-1.7.30.jar(SLF...

    log4j.jar各个版本

    log4j-1.2rc1.jar, log4j-1.3alpha-7.jar, log4j-api-2.0.2-javadoc.jar, log4j-api-2.0.2-sources.jar, log4j-api-2.0.2.jar, log4j-boot.jar, log4j-bridge-0.9-sources.jar, log4j-bridge-0.9-tests.jar, log4j-...

    log4j使用详解log4j使用详解

    ### Log4j 使用详解 #### 一、Log4j简介 Log4j 是 Apache 的一个开源项目,通过使用 Log4j,开发者能够控制日志信息的输出等级及去向,从而更加灵活地处理日志信息。它具有强大的功能,简单的配置,并且能够支持...

    log4j+slf4j实现 log4j测试代码,log4j+slf4j实现 log4j测试代码

    Log4j和SLF4J(Simple Logging Facade for Java)是两个广泛使用的日志框架,它们各有优势并常被一起使用以提供更灵活的日志解决方案。本文将详细探讨如何通过SLF4J接口来使用Log4j进行日志记录,并展示一个测试代码...

    Log4j使用实例

    ### Log4j 使用实例详解 #### 一、Log4j简介 Log4j 是一个开源的日志记录框架,由 Apache 软件基金会提供。它允许开发者根据需求配置日志等级,并灵活选择日志信息的输出方式。Log4j 的核心组件包括 Logger、...

    Log4j2、Fastjson、Log4j的BurpSuite插件亲测有效

    Log4j、Log4j2和Fastjson的安全性问题在过去曾引起广泛关注,例如Log4j2的CVE-2021-44228(也被称为Log4Shell漏洞),这是一个远程代码执行漏洞,影响了许多使用Log4j2的系统。这个插件可能就是为了检测和利用这些...

    log4j使用详解 j2EE

    #### 四、在代码中使用Log4j 要在代码中使用Log4j,首先需要获取一个Logger实例。 - **语法**:`public static Logger getLogger(String name)` - **示例**: ```java import org.apache.log4j.Logger; ...

    log4j使用与java中log4j记录日志如何写入数据库

    1. **配置文件**:Log4j的配置文件通常是`log4j.properties`或`log4j.xml`,它定义了日志的级别(如DEBUG、INFO、WARN、ERROR、FATAL)、输出目的地(控制台、文件、数据库等)以及布局格式。 2. **日志类**:在...

    log4j-2.18.0

    1. 确认当前使用的log4j2版本,如果是在受影响范围内,立即停止使用并准备升级。 2. 下载并部署log4j-2.18.0的更新版本,替换原有的库文件。 3. 配置更新后的log4j2,禁用可能导致问题的JNDI查找功能,增强系统安全...

    SSM整合中的Log4j日志的配置详情

    四、在 Maven 项目中引入 Log4j 依赖 在 Maven 项目中,需要引入 Log4j 依赖项,以便使用 Log4j。下面是一个基本的 Maven 依赖项配置: ``` &lt;groupId&gt;log4j &lt;artifactId&gt;log4j &lt;version&gt;1.2.16 ``` 这个配置...

    如何使用Log4j如何使用Log4j

    #### 四、使用Log4j记录日志 1. **引入Log对象**: ```java protected final Log log = LogFactory.getLog(getClass()); ``` 在Java类中,需要引入Log对象以便记录日志信息。 2. **记录日志信息**: ```...

    log4j-core-2.15.0.jar log4j-2.15.0-rc2

    Apache log4j2零日漏洞,根据 log4j-2.15.0-rc2 版本编译生成log4j-api-2.15.0.jar 1.解压你的jar jar xvf XXX.jar 2. 删除旧版本jar cd ./BOOT-INF/lib rm -rf log4j-api-*.jar 3. 上传新版本log4j-api-2.15.0....

Global site tag (gtag.js) - Google Analytics