`
egox
  • 浏览: 43912 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Log4j教程【转】

阅读更多

为什么要用日志(Log)? 
这个……就不必说了吧。 

为什么不用System.out.println()? 
功能太弱;不易于控制。如果暂时不想输出了怎么办?如果想输出到文件怎么办?如果想部分输出怎么办?…… 

为什么同时使用commons-logging和Log4j?为什么不仅使用其中之一? 
Commons-loggin的目的是为“所有的Java日志实现”提供一个统一的接口,它自身的日志功能平常弱(只有一个简单的SimpleLog?),所以一般不会单独使用它。 
Log4j的功能非常全面强大,是目前的首选。我发现几乎所有的Java开源项目都会用到Log4j,但我同时发现,所有用到Log4j的项目一般也同时会用到commons-loggin。
我想,大家都不希望自己的项目与Log4j绑定的太紧密吧。另外一个我能想到的“同时使用commons-logging和Log4j”的原因是,简化使用和配置。 
强调一点,“同时使用commons-logging和Log4j”,与“单独使用Log4j”相比,并不会带来更大的学习、配置和维护成本,反而更加简化了我们的工作。
我想这也是为什么“所有用到Log4j的项目一般也同时会用到commons-loggin”的原因之一吧。 

Commons-logging能帮我们做什么? 
l ) 提供一个统一的日志接口,简单了操作,同时避免项目与某个日志实现系统紧密耦合 
2) 很贴心的帮我们自动选择适当的日志实现系统(这一点非常好!) 
3) 它甚至不需要配置 

这里看一下它怎么“‘很贴心的’帮我们‘自动选择’‘适当的’日志实现系统”: 
1)首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类; 
2)如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类; 
3)否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类; 
4)否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类); 
5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog; 
(以上顺序不保证完全准确,请参考官方文档) 

可见,commons-logging总是能找到一个日志实现类,并且尽可能找到一个“最合适”的日志实现类。我说它“很贴心”实际上是因为:
1、可以不需要配置文件;
2、自动判断有没有Log4j包,有则自动使用之;
3、最悲观的情况下也总能保证提供一个日志实现(SimpleLog)。 
可以看到,commons-logging对编程者和Log4j都非常友好。 
为了简化配置commons-logging,一般不使用commons-logging的配置文件,也不设置与commons-logging相关的系统环境变量,
而只需将Log4j的Jar包放置到classpash中就可以了。这样就很简单地完成了commons-logging与Log4j的融合。
如果不想用Log4j了怎么办?只需将classpath中的Log4j的Jar包删除即可。 
代码应该怎么写? 
我们在需要输出日志信息的“每一人”类中做如下的三个工作: 
1、导入所有需的commongs-logging类: 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
2、在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类成员: 
private static Log log = LogFactory.getLog(YouClassName.class); 
注意这里定义的是static成员,以避免产生多个实例。 
LogFactory.getLog()方法的参数使用的是当前类的class,这是目前被普通认为的最好的方式。为什么不写作LogFactory.getLog(this.getClass())?因为static类成员访问不到this指针! 

3、使用org.apache.commons.logging.Log类的成员方法输出日志信息: 
log.debug("111"); 
log.info("222"); 
log.warn("333"); 
log.error("444"); 
log.fatal("555"); 
这里的log,就是上面第二步中定义的类成员变量,其类型是org.apache.commons.logging.Log,通过该类的成员方法,
我们就可以将不同性质的日志信息输出到目的地(目的地是哪里?视配置可定,可能是stdout,也可能是文件,还可能是发送到邮件,甚至发送短信到手机……详见下文对log4j.properties的介绍): 
debug() 输出“调试”级别的日志信息; 
info() 输出“信息”级别的日志信息; 
warn() 输出“警告”级别的日志信息; 
error() 输出“错误”级别的日志信息; 
fatal() 输出“致命错误”级别的日志信息; 
根据不同的性质,日志信息通常被分成不同的级别,从低到高依次是:“调试(DEBUG)”“信息(INFO)”“警告(WARN)”“错误(ERROR)”“致命错误(FATAL)”。
为什么要把日志信息分成不同的级别呢?这实际上是方便我们更好的控制它。比如,通过Log4j的配置文件,我们可以设置“输出‘调试’及以上级别的日志信息”
(即“调试”“信息”“警告”“错误”“致命错误”),这对项目开发人员可能是有用的;我们还可以设置“输出“警告”及以上级别的日志信息”(即“警告”“错误”“致命错误”),
这对项目最终用户可能是有用的。 
仅从字面上理解,也可以大致得出结论:最常用的应该是debug()和info();而warn()、error()、fatal()仅在相应事件发生后才使用。 

从上面三个步骤可以看出,使用commons-logging的日志接口非常的简单,不需要记忆太多东西:仅仅用到了两个类Log, LogFactory,
并且两个类的方法都非常少(后者只用到一个方法,前者经常用到的也只是上面第三步中列出的几个),同时参数又非常简单。 

下面给出一个完整的Java类的代码: 

package liigo.testlog; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

public class TestLog 

private static Log log = LogFactory.getLog(TestLog.class); 

public void test() 

log.debug("111"); 
log.info("222"); 
log.warn("333"); 
log.error("444"); 
log.fatal("555"); 


public static void main(String[] args) 

TestLog testLog = new TestLog(); 
testLog.test(); 



只要保证commons-logging的jar包在classpath中,上述代码肯定可以很顺利的编译通过。那它的执行结果是怎么样的呢?恐怕会有很大的不同,请继续往下看。 

Log4j在哪里呢?它发挥作用了吗? 
应该注意到,我们上面给出的源代码,完全没有涉及到Log4j——这正是我们所希望的,这也正是commons-logging所要达到的目标之一。 
可是,怎么才能让Log4j发挥它的作用呢?答案很简单,只需满足“classpath中有Log4j的jar包”。
前面已经说过了,commons-logging会自动发现并应用Log4j。所以只要它存在,它就发挥作用。(它不存在呢?自然就不发挥作用,commons-logging会另行选择其它的日志实现类。) 
注意:配置文件log4j.properties对Log4j来说是必须的。如果classpath中没有该配置文件,或者配置不对,将会引发运行时异常。 
Log4j中有三个主要的组件,它们分别是 Logger、Appender和Layout
Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。
一个Log可以继承另外一个Log的属性(输出到哪里,日志等级,日志格式等等)。
怎么继承?Log4j是根据Log的名字来判断继承关系的,比如:名字为“cn.dahe.lib”的Log就是“cn.dahe.lib.log”的parent,明白了吧!Log4j还有一个rootLogger,相当于Java的Object。
回过头来看“LogFactory.getLog(Test.class)”这里的“Test.class”事实上传进去的是Test这个类的完整路径(包名+类名),
“test.Test”。这样如果存在“test”这个Log那么Test这个Log就继承它,否则就继承rootLogger。
rootLogger,它永远存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法。
Appender则是用来指明将所有的log信息存放到什么地方,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。
Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息
参数的意义
输出级别的种类
ERROR、WARN、INFO、DEBUG
ERROR 为严重错误 主要是程序的错误
WARN 为一般警告,比如session丢失
INFO 为一般要显示的信息,比如登录登出
DEBUG 为程序的调试信息
配置日志信息输出目的地
log4j.appender.appenderName = fully.qualified.name.of.appender.class
1.org.apache.log4j.ConsoleAppender(控制台)
2.org.apache.log4j.FileAppender(文件)
3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
配置日志信息的格式
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
控制台选项
Threshold=DEBUG:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
FileAppender 选项
Threshold=DEBUF:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
RollingFileAppender 选项
Threshold=DEBUG:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
日志信息格式中几个符号所代表的含义:
-X号: X信息输出时左对齐;
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。
Log4J配置文件的基本格式如下:
#配置根Logger
log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderName2 ,...
#配置日志信息输出目的地Appender
log4j.appender.appenderName  =  fully.qualified.name.of.appender.class 
  log4j.appender.appenderName.option1  =  value1 
  … 
  log4j.appender.appenderName.optionN  =  valueN 
#配置日志信息的格式(布局)
log4j.appender.appenderName.layout  =  fully.qualified.name.of.layout.class 
  log4j.appender.appenderName.layout.option1  =  value1 
  … 
  log4j.appender.appenderName.layout.optionN  =  valueN  
配置文件示例
log4j.rootLogger=DEBUG,A1,R
#log4j.rootLogger=INFO,A1,R
# ConsoleAppender 输出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
# File 输出 一天一个文件,输出路径可以定制,一般在根路径下
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=blog_log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
文件配置Sample2
下面给出的Log4J配置文件实现了输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,A1,im 
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true
################### 
# Console Appender 
################### 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.Threshold=DEBUG 
log4j.appender.CONSOLE.Target=System.out 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
##################### 
# File Appender 
##################### 
log4j.appender.FILE=org.apache.log4j.FileAppender 
log4j.appender.FILE.File=file.log 
log4j.appender.FILE.Append=false 
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
# Use this layout for LogFactor 5 analysis
######################## 
# Rolling File 
######################## 
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender 
log4j.appender.ROLLING_FILE.Threshold=ERROR 
log4j.appender.ROLLING_FILE.File=rolling.log 
log4j.appender.ROLLING_FILE.Append=true 
log4j.appender.ROLLING_FILE.MaxFileSize=10KB 
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#################### 
# Socket Appender 
#################### 
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender 
log4j.appender.SOCKET.RemoteHost=localhost 
log4j.appender.SOCKET.Port=5001 
log4j.appender.SOCKET.LocationInfo=true 
# Set up for Log Facter 5 
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout 
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
######################## 
# Log Factor 5 Appender 
######################## 
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender 
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
######################## 
# SMTP Appender 
####################### 
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender 
log4j.appender.MAIL.Threshold=FATAL 
log4j.appender.MAIL.BufferSize=10 
[email=log4j.appender.MAIL.From=chenyl@yeqiangwei.com]log4j.appender.MAIL.From=chenyl@yeqiangwei.com[/email]
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com 
log4j.appender.MAIL.Subject=Log4J Message 
[email=log4j.appender.MAIL.To=chenyl@yeqiangwei.com]log4j.appender.MAIL.To=chenyl@yeqiangwei.com[/email]
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout 
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
######################## 
# JDBC Appender 
####################### 
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender 
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test 
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver 
log4j.appender.DATABASE.user=root 
log4j.appender.DATABASE.password= 
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') 
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout 
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.A1.File=SampleMessages.log4j 
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' 
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
################### 
#自定义Appender 
################### 
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net 
log4j.appender.im.username = username 
log4j.appender.im.password = password 
log4j.appender.im.recipient = corlin@yeqiangwei.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout 
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

最后文件路径设置问题
System.setProperty("DeployDirectory", "../");
log4j.appender.ROLLING_FILE.File=${DeployDirectory}

分享到:
评论
1 楼 on_way_ 2014-01-17  
useful for me

相关推荐

    log4j使用教程(详解)

    **日志框架Log4j详解** 在Java编程中,日志记录是不可或缺的一部分,它用于追踪应用程序的运行状态,帮助开发者在出现问题时定位错误、调试程序。Log4j是一款广泛使用的开源日志框架,由Apache软件基金会开发。本文...

    log4j教程

    ### Log4j教程:深入解析与实践 #### 引言 Log4j是Apache软件基金会下的一个开源项目,旨在提供一种灵活的日志记录机制,使开发者能够轻松地控制日志信息的流向、格式以及级别,而无需修改应用程序的源代码。这种...

    Log4j教程

    本教程将深入探讨Log4j的核心概念、配置以及实际应用。 ### 一、Log4j概述 Log4j是一个灵活的日志系统,允许程序员在运行时选择日志级别,改变日志输出格式,甚至选择将日志信息存储到不同的目的地(如控制台、...

    Log4j 教程

    **Log4j 教程** Log4j 是一个广泛使用的 Java 日志框架,它为应用程序提供了灵活的日志记录功能。这个教程将深入讲解 Log4j 的核心概念、配置以及如何在实际项目中应用。 1. **日志的重要性** 在软件开发中,日志...

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

    log4j-api-2.12.4.ja和log4j-core-2.12.4.jar

    此次提及的`log4j-api-2.12.4.jar`和`log4j-core-2.12.4.jar`是Log4j 2框架的两个关键组件,版本号为2.12.4,这个版本主要修复了之前版本中可能存在的安全漏洞。 **log4j-api-2.12.4.jar** 是Log4j 2框架的API模块...

    log4j_jar包跟教程说明

    本教程将深入探讨Log4j的基本概念、配置及使用方法。 1. **Log4j简介** - Log4j是一个轻量级的日志记录工具,具有强大的可配置性和灵活性。 - 它提供了多种级别的日志记录,如DEBUG、INFO、WARN、ERROR和FATAL,...

    log4j中文手册.pdf

    《log4j中文手册》是Java开发人员必备的参考资料,它详细介绍了log4j这个广泛使用的日志记录框架。Log4j是Apache软件基金会开发的一个开源项目,主要用于生成应用程序运行时的日志信息,帮助开发者进行调试、性能...

    Log4J教程PDF

    ### Log4J 教程详解 #### Log4j 概述 Log4j 是一个流行的开源日志框架,被广泛应用于 Java 应用程序中。它由 Apache 软件基金会维护,因其高度的灵活性、丰富的功能以及易于配置等特点而备受青睐。与传统的 `System...

    Log4j教程.docx

    Log4j是一个广泛使用的日志框架,主要用于Java应用程序,但已被移植到多种其他编程语言,如C、C++、C#、Perl、Python和Ruby。它由Apache软件基金会发布,遵循Apache Software License,允许自由使用、修改和分发。...

    Log4j使用教程

    **Log4j使用教程** Log4j是一款广泛应用于Java开发中的日志记录框架,它提供了灵活的日志配置,便于调试、监控和维护应用程序。本文将详细介绍Log4j的基本概念、配置以及在实际项目中的应用。 ### 一、Log4j简介 ...

    最详细的Log4j使用教程

    本教程将深入介绍如何使用Log4j进行日志记录,包括配置、基本用法和组件。 一、入门实例 1. 首先,你需要创建一个新的Java工程,并导入Log4j的库文件,例如`log4j-1.2.17.jar`。确保这个库文件在项目的类路径中,...

    log4J中文 教程 .pdf文件

    本教程将深入探讨Log4J的核心概念、配置方法以及实际应用。 **1. Log4J简介** Log4J是由Apache软件基金会开发的一个开源日志组件,主要针对Java应用程序。它提供了灵活的日志记录功能,包括不同的日志级别(DEBUG,...

    log4j2_detect_gui.zip

    《Log4j2检测工具——理解与应用》 在当今的软件开发中,日志记录是必不可少的一个环节,Log4j作为Java中最流行的日志框架之一,被广泛应用于各种项目中。然而,2021年曝光的Log4Shell漏洞(CVE-2021-44228)引发了...

    log4j-2.17.1的jar包,导入即可使用

    Log4j是Java编程语言中广泛使用的日志记录框架,特别是在企业级应用和大型系统中。这个"**log4j-2.17.1**"的版本是该框架的一个更新,提供了修复的安全漏洞和性能优化。以下是关于Log4j 2.17.1的一些关键知识点: 1...

    tomcat9 slf4j+log4j2 写日志.zip

    本教程主要关注如何在Tomcat 9环境中使用SLF4J(Simple Logging Facade for Java)和Log4j2进行日志记录,并解决可能出现的日志不写入问题。 首先,SLF4J是一个日志门面,它为各种日志框架提供了抽象层,如Logback...

    log4j配置详解 新手入门教程

    #### 四、Log4j的使用 在代码中使用Log4j非常简单,只需要通过`LogFactory.getLog()`方法获取对应的Logger实例即可。例如: ```java protected final Log log = LogFactory.getLog(getClass()); if (log....

Global site tag (gtag.js) - Google Analytics