实际项目开发过程中,日志是一个重要且必须的内容,通过日志我们可以监测代码部署之后的运行状况,包括查看出错原因、收集我们想要的信息等等。

使用Log4J,程序员可以控制日志信息输送的目的地,包括控制台,文件,GUI组件和NT事件记录器,也可以控制每一条日志的输出格式,或通过定义每一条日志信息的级别,更加细致地控制日志的生成过程。

1 Log4j的组成

Log4j由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout)。

  1. Logger:控制要启用或禁用哪些日志记录语句,并对日志信息进行级别限制
  2. Appenders指定了日志将打印到控制台还是文件中
  3. Layout则控制日志信息的显示格式。

一个logger可以用多个appender,也就是说日志信息可以同时输出到多个设备上,每个appender对应一种layout。

所以,记录器用来整合日志信息,一个日志信息调整好以后,交给记录器的所有Appender,每一个Appender根据自己的格式输出日志信息。

2 Log4j的使用

这里只介绍maven引入log4j的依赖

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
</dependency>

2.1 logger对象的创建/获取

Logger被指定为实体,由一个String类的名字识别。Logger的名字是大小写敏感的,且名字之间具有继承关系,子名用父名作为前缀,用点“.”分隔,例如x.y是x.y.z的父亲。

public static Logger logger= Logger.getLogger("NLPProcess");

root Logger(根Logger)是所有Logger的祖先,它有如下属性:

1.它总是存在的。

2.它不可以通过名字获得。

root Logger可以通过以下语句获得:

public static Logger logger= Logger.getRootLogger();

2.2 日志级别

每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:

A:off         最高等级,用于关闭所有日志记录。

B:fatal       指出每个严重的错误事件将会导致应用程序的退出。

C:error      指出虽然发生错误事件,但仍然不影响系统的继续运行。

D:warm     表明会出现潜在的错误情形。

E:info         一般和在粗粒度级别上,强调应用程序的运行全程。

F:debug     一般用于细粒度级别上,对调试应用程序非常有帮助。

G:all           最低等级,用于打开所有日志记录。


package log4j;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class Log4jTest {

    public static void main(String[] args) {
        
        Logger logger = Logger.getLogger(Log4jTest.class);
        
        //使用默认的配置信息,不需要写log4j.properties
        BasicConfigurator.configure();
        //设置日志输出级别为info,这将覆盖配置文件中设置的级别
        logger.setLevel(Level.INFO);
        //下面的消息将被输出
        logger.info("this is an info");
        logger.warn("this is a warn");
        logger.error("this is an error");
        logger.fatal("this is a fatal");
        #下面的消息不被输出
        logger.debug("this is a debug");

    }

}

2.3 Appender

Appender用来指定日志信息输出到哪个地方,可以同时指定多个输出目的地。Log4j允许将信息输出到许多不同的输出设备中,一个log信息输出目的地就叫做一个Appender。

每个Logger都可以拥有一个或多个Appender,每个Appender表示一个日志的输出目的地。可以使用

Logger.addAppender(Appender app)

为Logger增加一个Appender,也可以使用

Logger.removeAppender(Appender app)

为Logger删除一个Appender。

以下为Log4j几种常用的输出目的地。

a:org.apache.log4j.ConsoleAppender:将日志信息输出到控制台。

b:org.apache.log4j.FileAppender:将日志信息输出到一个文件。

c:org.apache.log4j.DailyRollingFileAppender:将日志信息输出到一个日志文件,并且每天输出到一个新的日志文件。

d:org.apache.log4j.RollingFileAppender:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件。

e:org.apache.log4j.WriteAppender:将日志信息以流格式发送到任意指定地方。

f::org.apache.log4j.jdbc.JDBCAppender:通过JDBC把日志信息输出到数据库中。

例如我们将日志信息输出到一个文件中

Logger logger = Logger.getLogger(Log4jTest.class);
SimpleLayout layout = new SimpleLayout();
FileAppender fa=new FileAppender(layout, "/Users/apple/log4j");
logger.addAppender(fa);

那么在logger整合的所有信息都会被FileAppender发送到相应的文件中

2.4 Layout

存在三种Layout

  1. HTMLLayout:格式化日志输出为HTML表格形式
  2. SimpleLayout:以一种非常简单的方式格式化日志输出,它打印三项内容:级别-信息。如:INFO - info
  3. PatternLayout::根据指定的转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转化模式格式
#SimpleLayout
INFO - this is an info
WARN - this is a warn
ERROR - this is an error
INFO - this is an info
WARN - this is a warn
ERROR - this is an error


#HTMLLayout
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Log4J Log Messages</title>
<style type="text/css">
<!--
body, table {font-family: arial,sans-serif; font-size: x-small;}
th {background: #336699; color: #FFFFFF; text-align: left;}
-->
</style>
</head>
<body bgcolor="#FFFFFF" topmargin="6" leftmargin="6">
<hr size="1" noshade>
Log session start time Sat Aug 05 15:59:06 CST 2017<br>
<br>
<table cellspacing="0" cellpadding="4" border="1" bordercolor="#224466" width="100%">
<tr>
<th>Time</th>
<th>Thread</th>
<th>Level</th>
<th>Category</th>
<th>Message</th>
</tr>

<tr>
<td>0</td>
<td title="main thread">main</td>
<td title="Level">INFO</td>
<td title="pku.nlp.Log4jTest category">pku.nlp.Log4jTest</td>
<td title="Message">this is an info</td>
</tr>

<tr>
<td>1</td>
<td title="main thread">main</td>
<td title="Level"><font color="#993300"><strong>WARN</strong></font></td>
<td title="pku.nlp.Log4jTest category">pku.nlp.Log4jTest</td>
<td title="Message">this is a warn</td>
</tr>

<tr>
<td>1</td>
<td title="main thread">main</td>
<td title="Level"><font color="#993300"><strong>ERROR</strong></font></td>
<td title="pku.nlp.Log4jTest category">pku.nlp.Log4jTest</td>
<td title="Message">this is an error</td>
</tr>

3 log4j配置文件

配置Log4j环境就是指配置root Logger,包括把Logger为哪个级别,为它增加哪些Appender,以及为这些Appender设置Layout等等。因为所有其他的Logger都是root Logger的后代,所以它们都继承了root Logger的性质。这些可以通过设置系统属性的方法来隐式地完成,也可以在程序中调用XXXConfigurator.configure()方法来显式地完成。有以下几种方式来配置Log4j。

A:配置放在文件里,通过环境变量传递文件名等信息,利用Log4j默认的初始化过程解析并配置。

B:配置放在文件里,通过应用服务器配置传递文件甸等信息,利用一个特定的Servlet来完成配置。

C:在程序中调用BasicConfigurator.configure()方法。

D:配置放在文件里,通过命令行PropertyConfigurator.configure(args[])解析log4j.properties文件并配置Log4j。


3.1 采用配置文件进行配置

static Logger logger = Logger.getLogger(mycalss.class);
PropertyConfigurator.configure("classes/my.properties");


#将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示
log4j.rootCategory=INFO, stdout , R

#定义名为stdout的控制台Appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#定义stdout的layout为PatternLayout
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n   

#定义名为R的文件Appender
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
#文件路径
log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log
#定义Layout
log4j.appender.R.layout=org.apache.log4j.PatternLayout 
#如果是pattern布局,就要制定的打印信息的具体格式  
1log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n   

#指定com.neusoft包下的所有类的等级为DEBUG
log4j.logger.com.neusoft=DEBUG   
#指定com.opensymphony.oscache包下的所有类的等级为DEBUG
log4j.logger.com.opensymphony.oscache=ERROR   
log4j.logger.net.sf.navigator=ERROR   
log4j.logger.org.apache.commons=ERROR   
log4j.logger.org.apache.struts=WARN   
log4j.logger.org.displaytag=ERROR   
log4j.logger.org.springframework=DEBUG   
log4j.logger.com.ibatis.db=WARN   
log4j.logger.org.apache.velocity=FATAL   
   
log4j.logger.com.canoo.webtest=WARN   
   
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN   
log4j.logger.org.hibernate=DEBUG   
log4j.logger.org.logicalcobwebs=WARN  

登录发表评论 注册

反馈意见