16Log4J

Log4J


Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

Log4j由三个重要的部件构成:

  1. 记录器(Loggers)
  2. 输出源(Appenders)
  3. 布局(Layouts)。

记录器按照布局中指定的格式把日志信息写入一个或多个输出源。输出源可以是控制台、文本文件、XML文件或Socket,甚至还可以把信息写入到Windows事件日志或通过电子邮件发送。我们可以通过配置文件来部署这些组件。

Log4j最主要的三大基本构件:
1.Categories(对log信息进行分类筛选,通俗的讲就是什么信息应该被输出,什么log信息应该被忽略)
2.Appenders(定义了log信息输出的设备,log信息应该被输出到什么地方,控制台、文件、网络设备等)
3.Layouts(对log信息进行格式化)
    软件开发人员能通过这三大构件实现根据日志的类型和优先级进行记录,并且能在程序运行时去控制log 信息输出的格式(formatted)和往什么地方输出(控制台、log文件)

12.2  定义配置文件

Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键值)。下面将介绍使用log4j.properties文件作为配置文件的方法:
    1. 配置根Logger
    Logger 负责处理日志记录的大部分操作。
    其语法为:

log4j.rootLogger = [   level ] , appenderName, appenderName, …

其中, level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理, 则应用程序中所有DEBUG级别的日志信息将不被打印出来。

ALL : 打印所有的日志,

OFF:关闭所有的日志输出。

AppenderName: 就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。

2、配置日志信息输出目的地 Appender(输出端)

扫描二维码关注公众号,回复: 6252664 查看本文章

   Appender 负责控制日志记录操作的输出。其语法为:

   log4j.appender.appenderName = fully.qualified.name.of.appender.class

   log4j.appender.appenderName.option1 = value1

   log4j.appender.appenderName.optionN = valueN

   这里的appenderName为在①里定义的,可任意起名。其中,Log4j提供的appender有以下几种:

   a. org.apache.log4j.ConsoleAppender(控制台),

   b. org.apache.log4j.FileAppender(文件),

   c. org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

   d. org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。

   e. org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

   例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender用来定义一个名为stdout的输出目的地,ConsoleAppender为控制台。

3. 配置日志信息的格式(布局)Layout

   Layout 负责格式化Appender的输出。其语法为:

   log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

   log4j.appender.appenderName.layout.option1 = value1

   log4j.appender.appenderName.layout.optionN = valueN

   其中,Log4j提供的layout有以下几种:

   org.apache.log4j.HTMLLayout(以HTML表格形式布局),

   org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

   org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

   org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

12.3  格式化日志信息

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:

打印参数

说明

%m

输出代码中指定的消息

%p

输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

%r

输出自应用启动到输出该log信息耗费的毫秒数

%c

输出所属的类目,通常就是所在类的全名

%t

输出产生该日志事件的线程名

%n

输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

%d

输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

%l

输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

表 12.1

12.4  配置log4j的步骤

12.4.1  步骤描述

配置一个配置文件的基本步骤如下:
1) 定义一个Logger。在定义Logger时指定该Logger的级别级其输出目的地。定义Logger的格式为
log4j.rootLogger = [ level ], appendName1, appendName2, …appendNameN。
2) 定义appender的输出目的地。定义一个appender的输出目的地的格式为
log4j.appender.appenderName = fully.qualified.name.of.appender.class。
log4j提供的输出端有ConsoleAppender、FileAppender 、DailyRollingFileAppender、RollingFileAppender和WriterAppender。
3) 定义appender的除布局模式外的其它相关参数,如例3中第6、7、8定义了A2的相关参数。定义格式为
log4j.appender.appenderName.optionName1 = value1
……
log4j.appender.appenderName.optionNameN = valueN
如果除了布局模式外不需要定义别的参数,可跳过这一步(如例3中的A1)。
4) 定义appender的布局模式。定义一个appender的布局模式的格式为
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class。
布局模式其实也是步骤3)中的一个部分,只是布局模式参数是每一个appender必须定义的参数。Log4j提供的布局模式有HTMLLayout、PatternLayout和SimpleLayout。
5) 定义与所选的布局模式相关的设置信息,定义格式为
og4j.appender.appenderName.layout.optionName1 = value1
……
log4j.appender.appenderName.layout.optionNameN = valueN

12.4.2  在Eclipse中配置Log4J演示

    【New】->【Other】

                       

图 12.1

    选择Dynamic Web Project,点击【Next】

 

图 12.2

    输入文件名Log4jTest点击【Next】

 

图 12.3

    点击【Finish】

 

图 12.4

    点击【No】

图 12.5

    目录结构如下

 

图 12.6

    下面来配置项目。

    右击项目选择【Properties】后选择【Java Build Path】,选【Source】选项卡

图 12.7

    点击【Browse】,打开目录选中WEB-INF后,点击【Create New Folder】

 

图 12.8

    输入classes后点击【OK】后再点击【OK】

 

图 12.9

    再在左侧项目列中选择【Tomcat】,勾上【Is a Tomcat Project】,【Context name】中输入/logtest,通过这个名字来找到项目的目录,【Subdirectory to set as web application root(optional)】中输入/WebContent,后点击【OK】

 

图 12.10

注意: build文件夹我们不再需要,因为我们已经设定java文件编译到WEB-INF文件夹下而不是原来的build文件夹下。最后目录结构如下

 

图 12.11

    这时,右击项目,右键菜单中出现了【Tomcat project】,这个是配置完Tomcat才会出现的,我们选择这个菜单的子菜单【Update context definition】

 

图 12.12

    弹出对话框,点击【OK】即可,这时,我们的项目被配置到了Tomcat的server.xml中。

 

图 12.13

    我们要使用Log4j,就要将commons-logging-1.0.4,jar和log4j-1.2.15.jar(两个jar包的版本不一定非要是1.0.4和1.2.15,根据需要使用)放入WEB-INF/lib文件夹下,并导入项目中。

    右击项目选择【Properties】后选择【Java Build Path】,选【Libraries】选项卡,点击【Add JARs】按钮。

 

图 12.14

    弹出对话框中打开本项目的目录,一直打开到WEB-INF/lib,选择下面我们刚刚拷贝到里边的两个包,然后点击【OK】

 

图 12.15

    列表中已经有了那两个包,也就是说那两个包被导入到我们的项目中了。

注意其实我们只需要导入log4j-1.2.15.jar就可以了,导入    commons-logging的目的 是为“所有的Java日志实现”提供一个统一的接口,并简化了操作,同时避免项目与某个日志实现系统紧密耦合,很贴心的帮我们自动选择适当的日志实现系统,它甚至不需要配置。

图 12.16

    点击【OK】我们的配置就结束了,下面来开发代码

    首先,我们要使用Log4j,就需要有Log4j的配置文件

    我们在src根目录下创建,编译后它将被拷贝到WEB-INF/classes文件夹下,也就是classpath下。

    目录结构如下

 

    log4j.properties的内容如下

# Global   logging configuration

 

# 定义日志优先级为DEBUG,输出到控制台和文件

log4j.rootLogger=DEBUG,stdout,file

# 设置输出到控制台

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Threshold=DEBUG

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.stdout.Target=System.out

 

# 设置输出到Log文件

log4j.appender.file=org.apache.log4j.RollingFileAppender

log4j.appender.file.Threshold=DEBUG

log4j.appender.file.File=D:/CRM_DEV/workspace/Log4jTest/logs/logs.log

log4j.appender.file.MaxFileSize=1000KB

log4j.appender.file.layout=org.apache.log4j.PatternLayout

log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t]-[%c]-[%p] %m%n

    我们创建package“com.jy.sample.servlet”

    在其下建立Log4jServlet.java文件,其功能只有一个,输出一句话"您好!欢迎光临!并在其中将使用的方法等信息输出在文件和控制台上。

代码如下:

/*

 * Log4jServlet.java

 * 功能:Log4j的示例代码

 */

package com.jy.sample.servlet;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import   javax.servlet.http.HttpServletRequest;

import   javax.servlet.http.HttpServletResponse;

 

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

 

/**

 * Log4j的示例代码

 * @author JY

 */

public class   Log4jServlet extends HttpServlet {

 

    /** 序列化时类的唯一标示 */

    private static final long serialVersionUID = 6097636687417123L;

 

    /** 定义Log */

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

 

    /**

     * 处理Get请求.

     * @param req Request

     * @param resp Response

     * @throws ServletException Servlet异常

     * @throws IOException IO异常

     */

    @Override

    protected void doGet(HttpServletRequest req,

            HttpServletResponse resp)

                throws ServletException, IOException {

        // 在使用Log时,要先判断是否可以使用要执行的Log方法

        if (log.isInfoEnabled()) {

            log.info("doGet()方法开始执行。");

        }

        // 设定内容类型为HTML网页UTF-8编码

        resp.setContentType("text/html;charset=UTF-8");

        // 输出页面

        PrintWriter out = resp.getWriter();

        out.println("<html><head>");

        out.println("<title>Log4j示例</title>");

        out.println("</head><body>");

        out.println("您好!欢迎光临!");

        out.println("</body></html>");

        out.close();

        // 在使用Log时,要先判断是否可以使用要执行的Log方法

        if (log.isDebugEnabled()) {

            log.debug("页面会输出字符串:【您好!欢迎光临!】");

        }

        if (log.isInfoEnabled()) {

            log.info("doGet()方法执行完毕。");

        }

    }

}

                                   例 11.4

    在这个例子中,我们使用了两种优先级的输出,一个DEBUG级的一个事INFO级的,由于我们的配置文件中设置的是DEBUG级的,那么所有这些Log信息都会输出,如果我们将配置文件设置成INFO级别的话,DEBUG级别的Log信息就不会输出了。

    我们在WebContent文件夹下新建index.html文件,来调用上边写到得Servlet,代码如下

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;   charset=UTF-8">

<title>首页</title>

</head>

<body>

    <a href="log4jtest">Log4j示例</a>

</body>

</html>

   我们还需要修改WEB-INF文件夹下的web.xml,来配置我们的Servlet。文件内容如下

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

  <display-name>Log4jTest</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

  </welcome-file-list>

  <servlet>

      <servlet-name>Log4jServlet</servlet-name>

      <servlet-class>com.jy.sample.servlet.Log4jServlet</servlet-class>

  </servlet>

  <servlet-mapping>

      <servlet-name>Log4jServlet</servlet-name>

      <url-pattern>/log4jtest</url-pattern>

  </servlet-mapping>

</web-app>

例 12.5

    我们启动Tomcat,当控制台出现如下信息并没有任何异常时表示成功启动

    打开浏览器输入地址,我们的地址是http://localhost:8080/logtest,8080端口后边的内容就是我们建立项目是在Tomcat设置项中设置的内容

    点击链接来看看,如下图

    执行完毕。

    我们首先来看看控制台的信息

    再来看看WebContent/logs下的Log文件内容

    现在我们把配置文件的第一句中的DEBUG换成INFO,重新启动Tomcat,再执行页面看看。画面表示没有变化,控制台和Log文件的信息只剩下Info的内容了

12.5  总结

    • 通过使用Log4j中的指令和参数,我们可以控制日志信息输送的目标文件,以及打印格式等.
    • 在Eclipse中配置Log4J的步骤

猜你喜欢

转载自www.cnblogs.com/Aha-Best/p/10883266.html