Log4j与Log4j2日志记录详解

匿名 (未验证) 提交于 2019-12-03 00:22:01

一个完整的项目里,日志是必不可少的,也是很重要的一部分。程序从开发,测试,维护,运行等环节,都需要向控制台等位置输出大量的信息,如果程序出了问题,那么这些信息能快速反映出问题的所在,帮助我们定位到问题。而且这些信息的输出,在很多时候是使用System.out.println()无法完成的,而且使用System.out.println()这是IO操作,这会拖慢系统的效率。
日志信息根据用途与记录内容的不同,可以分为调试日志,运行日志,异常日志等。
Log4j 全称为Log for java ,也就是专门用来记录java语言的日志记录工具。目前有两个版本,Log4j与Log4j2。
Log4j的下载地址:http://logging.apache.org/log4j/1.2/download.html
Log4j2的下载地址:http://logging.apache.org/log4j/2.x/download.html,下载是下载的是后缀为bin.zip,然后再解压即可。

使用上面的包的话,直接将下载的依赖包复制粘贴到项目的lib目录下,add to build path就可以了。
如果是使用Maven管理依赖的话,需要添加下面的依赖:

    <!-- 日志文件管理包 -->     <dependency>         <groupId>log4j</groupId>         <artifactId>log4j</artifactId>         <version>1.2.17</version>      </dependency>     <dependency>         <groupId>org.slf4j</groupId>         <artifactId>slf4j-api</artifactId>         <version>1.7.12</version>     </dependency>     <dependency>         <groupId>org.slf4j</groupId>         <artifactId>slf4j-log4j12</artifactId>         <version>1.7.12</version>     </dependency>             <dependency>             <groupId>log4j</groupId>             <artifactId>log4j</artifactId>             <version>1.2.17</version>         </dependency>         <!--测试需要的包 -->         <dependency>             <groupId>junit</groupId>             <artifactId>junit</artifactId>             <version>4.12</version>             <scope>test</scope>         </dependency>         <dependency>             <groupId>junit</groupId>             <artifactId>junit</artifactId>             <version>3.8.1</version>             <scope>compile</scope>         </dependency>         <dependency>             <groupId>junit</groupId>             <artifactId>junit</artifactId>             <version>3.8.1</version>         </dependency>         <dependency>             <groupId>junit</groupId>             <artifactId>junit</artifactId>             <version>RELEASE</version>             <scope>compile</scope>         </dependency>

由于是使用Maven管理项目,所以在Resources目录下建立log4j.properties文件,如果是使用eclipse直接导包,那么log4j.properties文件应该放在与src相同级别的目录下。

下面是log4j.properties文件

### 设置### log4j.rootLogger = debug,stdout,D,E  ### 输出信息到控制抬 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n  ### 输出DEBUG 级别以上的日志到=D://logs/error.log ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender #输出到的文件目录 log4j.appender.D.File = D://logs/log.log log4j.appender.D.Append = true #Debug log4j.appender.D.Threshold = DEBUG  log4j.appender.D.layout = org.apache.log4j.PatternLayout #输出的格式 log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  ### 输出ERROR 级别以上的日志到=D://logs/error.log ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File =D://logs/error.log  log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR  log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

测试代码* MyTest.class *

import org.apache.log4j.Logger;  public class MyTest {     private static Logger logger = Logger.getLogger(MyTest.class.getClass());     @org.junit.Test     public void test() {         // debug级别         logger.debug("这是一个debug级别的信息");         // info级别         logger.info("这是一个info级别的信息");         // error级别         logger.error("这是一个error级别的信息");     } } 

控制台输出结果:

查看日志文件信息我们可以看到:

如果我们需要输出sql语句,无法使用private static Logger logger = Logger.getLogger(MyTest.class.getClass());这句代码,则只需要在log4j.properties文件里面添加

# mybatis的 #log4j.logger.com.ibatis = debug     #log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = debug     #log4j.logger.com.ibatis.common.jdbc.ScriptRunner = debug     #log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = debug     #log4j.logger.java.sql.Connection = debug # 普通的sql的 log4j.logger.java.sql.Statement = debug     log4j.logger.java.sql.PreparedStatement = debug     log4j.logger.java.sql.ResultSet =debug    

如果需要在代码里面自己控制输出,使用:

// 定义一个static Logger对象 private static Logger logger = Logger.getLogger(MyTest.class.getClass());

在配置文件log4j.properties配置的话:
1.配置根Logger,也是最顶层,最重要的配置,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,OFF就是所有的信息都不会打印,ALL就是所有信息都会打印,DEBUG模式使用比较多,因为程序出错的时候我们需要去查看日志才能定位问题。

// off 最高等级,用于关闭所有日志记录。 // fatal 指出每个严重的错误事件将会导致应用程序的退出。 // error 指出虽然发生错误事件,但仍然不影响系统的继续运行。 // warm 表明会出现潜在的错误情形。 // info 一般和在粗粒度级别上,强调应用程序的运行全程。 // debug 一般用于细粒度级别上,对调试应用程序非常有帮助。 // all 最低等级,用于打开所有日志记录。 // 基本语法:log4j.rootLogger = [ level ] , appenderN1, appender1, … // 比如下面的 log4j.rootLogger = debug,stdout,D,E

使用appender输出信息到目的地,每一个目的地后面都有自己的属性,我们可以进行定义。

org.apache.log4j.ConsoleAppender(控制台),   org.apache.log4j.FileAppender(文件),   org.apache.log4j.DailyRollingFileAppender(每天一个日志文件),   org.apache.log4j.RollingFileAppender(文件大小到达指定大小的时候产生一个新的文件),   org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

上面有一句log4j.appender.stdout.layout = org.apache.log4j.PatternLayout定义了日志输出的layout,那么layout的基本几种如下:

org.apache.log4j.HTMLLayout(HTML表格布局),   org.apache.log4j.PatternLayout(自定义布局),   org.apache.log4j.SimpleLayout(包含日志信息级别和信息字符串),   org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

自定义布局中,输出的时候的定义比如log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n,格式语法如下:

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL   %r 输出消耗的毫秒数   %c 输出类的全名   %t 输出产生该日志事件的线程名   %n 输出一个回车换行符,Windows平台为“rn”,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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!