目录

log4j - 快速指南

log4j - Overview

log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它是在Apache软件许可下发布的。

log4j已移植到C,C ++,C#,Perl,Python,Ruby和Eiffel语言。

log4j可在运行时通过外部配置文件进行高度配置。 它根据优先级级别查看日志记录过程,并提供将日志记录信息导向各种目标的机制,例如数据库,文件,控制台,UNIX Syslog等。

log4j有三个主要组件:

  • loggers :负责捕获日志记录信息。

  • appenders :负责将日志信息发布到各个首选目的地。

  • layouts :负责格式化不同样式的日志信息。

log4j的历史

  • 1996年初开始作为EU SEMPER(欧洲安全电子市场)项目的追踪API。

  • 经过无数的增强和几个化身之后,最初的API已经发展成为log4j,这是一个流行的Java日志包。

  • 该软件包根据Apache软件许可证进行分发,这是一个由开源计划认证的完整开源许可证。

  • 最新的log4j版本,包括其完整源代码,类文件和文档,可以在http://logging.apache.org/log4j/找到。

log4j功能

  • 它是线程安全的。

  • 它针对速度进行了优化。

  • 它基于命名的记录器层次结构。

  • 它支持每个记录器的多个输出appender。

  • 它支持国际化。

  • 它不限于预定义的一组设施。

  • 可以使用配置文件在运行时设置日志记录行为。

  • 它旨在从一开始就处理Java异常。

  • 它使用多个级别,即ALL,TRACE,DEBUG,INFO,WARN,ERROR和FATAL。

  • 通过扩展Layout类可以轻松更改日志输出的格式。

  • 可以通过Appender接口的实现来更改日志输出的目标以及写入策略。

  • 它是失败的。 但是,尽管它确实努力确保传递,但log4j并不保证每个日志语句都将传递到其目标。

记录的优缺点

日志记录是软件开发的重要组成部分。 精心编写的日志记录代码提供快速调试,易于维护以及应用程序运行时信息的结构化存储。

记录也有其缺点。 它可以减慢应用程序的速度。 如果过于冗长,则会导致滚动失明。 为了缓解这些问题,log4j设计为可靠,快速和可扩展。

由于日志记录很少是应用程序的主要关注点,因此log4j API易于理解和使用。

log4j - Installation

log4j API包是在Apache Software License下发布的,这是一个由开源计划认证的完整开源许可证。

最新的log4j版本,包括完整源代码,类文件和文档,可以在http://logging.apache.org/log4j/找到。

要在系统上安装log4j,请从指定的URL下载apache-log4j-xxxtar.gz,然后按照以下步骤操作。

Step 1

解压缩并解压缩/ usr/local /目录中的下载文件,如下所示:

$ gunzip apache-log4j-1.2.15.tar.gz
$ tar -xvf apache-log4j-1.2.15.tar
apache-log4j-1.2.15/tests/input/
apache-log4j-1.2.15/tests/input/xml/
apache-log4j-1.2.15/tests/src/
apache-log4j-1.2.15/tests/src/java/
apache-log4j-1.2.15/tests/src/java/org/
.......................................

在解开时,它会创建一个名为apache-log4j-xxx的目录层次结构,如下所示:

-rw-r--r--  1 root root   3565 2007-08-25 00:09 BUILD-INFO.txt
-rw-r--r--  1 root root   2607 2007-08-25 00:09 build.properties.sample
-rw-r--r--  1 root root  32619 2007-08-25 00:09 build.xml
drwxr-xr-x 14 root root   4096 2010-02-04 14:09 contribs
drwxr-xr-x  5 root root   4096 2010-02-04 14:09 examples
-rw-r--r--  1 root root   2752 2007-08-25 00:09 INSTALL
-rw-r--r--  1 root root   4787 2007-08-25 00:09 KEYS
-rw-r--r--  1 root root  11366 2007-08-25 00:09 LICENSE
-rw-r--r--  1 root root 391834 2007-08-25 00:29 log4j-1.2.15.jar
-rw-r--r--  1 root root    160 2007-08-25 00:09 NOTICE
-rwxr-xr-x  1 root root  10240 2007-08-25 00:27 NTEventLogAppender.dll
-rw-r--r--  1 root root  17780 2007-08-25 00:09 pom.xml
drwxr-xr-x  7 root root   4096 2007-08-25 00:13 site
drwxr-xr-x  8 root root   4096 2010-02-04 14:08 src
drwxr-xr-x  6 root root   4096 2010-02-04 14:09 tests

Step 2

此步骤是可选的,取决于您将从log4j框架中使用哪些功能。 如果您的计算机上已经安装了以下软件包,那么它很好,否则您需要安装它们才能使log4j正常工作。

Step 3

现在需要适当地设置CLASSPATHPATH变量。 这里我们将仅为log4j.xxxjar文件设置它。

$ pwd
/usr/local/apache-log4j-1.2.15
$ export CLASSPATH= \
      $CLASSPATH:/usr/local/apache-log4j-1.2.15/log4j-1.2.15.jar
$ export PATH=$PATH:/usr/local/apache-log4j-1.2.15/

log4j - Architecture

log4j API遵循分层体系结构,其中每个层提供不同的对象以执行不同的任务。 这种分层架构使设计灵活,并且将来可以轻松扩展。

log4j框架有两种类型的对象。

  • Core Objects:这些是框架的强制对象。 他们需要使用框架。

  • Support Objects:这些是框架的可选对象。 它们支持核心对象以执行其他但重要的任务。

核心对象

核心对象包括以下类型的对象:

记录器对象

顶层是Logger,它提供Logger对象。 Logger对象负责捕获日志记录信息,它们存储在命名空间层次结构中。

布局对象

布局图层提供用于格式化不同样式的日志记录信息的对象。 它在发布日志记录信息之前为appender对象提供支持。

布局对象在以人类可读和可重用的方式发布日志记录信息方面发挥着重要作用。

Appender对象

这是一个提供Appender对象的低级层。 Appender对象负责将日志记录信息发布到各种首选目标,例如数据库,文件,控制台,UNIX Syslog等。

以下虚拟图显示了log4J框架的组件:

log4j架构

支持对象

log4j框架中还有其他重要对象在日志记录框架中起着至关重要的作用:

水平对象

Level对象定义任何日志记录信息的粒度和优先级。 API中定义了七个级别的日志记录:OFF,DEBUG,INFO,ERROR,WARN,FATAL和ALL。

过滤对象

Filter对象用于分析日志记录信息,并进一步决定是否应记录该信息。

Appender对象可以有多个与之关联的Filter对象。 如果将日志记录信息传递给特定的Appender对象,则与该Appender关联的所有Filter对象都需要批准日志记录信息,然后才能将其发布到附加目标。

ObjectRenderer

ObjectRenderer对象专门提供传递给日志记录框架的不同对象的String表示。 Layout对象使用此对象来准备最终的日志记录信息。

LogManager (LogManager)

LogManager对象管理日志记录框架。 它负责从系统范围的配置文件或配置类中读取初始配置参数。

log4j - Configuration

前一章解释了log4j的核心组件。 本章介绍如何使用配置文件配置核心组件。 配置log4j涉及分配Level,定义Appender以及在配置文件中指定Layout对象。

log4j.properties文件是一个log4j配置文件,它将属性保存在键值对中。 默认情况下,LogManager在CLASSPATH查找名为log4j.properties的文件。

  • 根记录器的级别定义为DEBUG。 DEBUG将名为X的appender附加到它上面。

  • 将名为X的appender设置为有效的appender。

  • 设置appender X的布局。

log4j.properties Syntax:

以下是appender X的log4j.properties文件的语法:

# Define the root logger with appender X
log4j.rootLogger = DEBUG, X
# Set the appender named X to be a File appender
log4j.appender.X=org.apache.log4j.FileAppender
# Define the layout for X appender
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.conversionPattern=%m%n

log4j.properties Example

使用上面的语法,我们在log4j.properties文件中定义以下内容:

  • 根记录器的级别定义为DEBUG,DEBUG appender命名为FILE。

  • appender FILE定义为org.apache.log4j.FileAppender 。 它写入位于log目录中名为“log.out”的文件。

  • 定义的布局模式是%m%n ,这意味着打印的日志消息后面跟一个换行符。

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

值得注意的是,log4j支持UNIX样式的变量替换,例如$ {variableName}。

调试级别

我们在两个appender中都使用了DEBUG。 所有可能的选择是:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • ALL

这些级别将在log4j Logging Levels中解释。

Appenders

Apache log4j提供Appender对象,主要负责将日志消息打印到不同的目的地,如控制台,文件,套接字,NT事件日志等。

每个Appender对象都有与之关联的不同属性,这些属性指示该对象的行为。

属性 描述
layout Appender使用Layout对象和与它们关联的转换模式来格式化日志记录信息。
target 目标可以是控制台,文件或其他项目,具体取决于appender。
level 需要该级别来控制日志消息的过滤。
threshold Appender可以具有与其相关联的阈值水平,而与记录器水平无关。 Appender忽略任何级别低于阈值级别的日志消息。
filter Filter对象可以分析级别匹配之外的日志记录信息,并确定日志记录请求是由特定Appender处理还是忽略。

我们可以通过使用以下方法在配置文件中包含以下设置,将Appender对象添加到Logger:

log4j.logger.[logger-name]=level, appender1,appender..n

您可以使用XML格式编写相同的配置,如下所示:

<logger name="com.apress.logging.log4j" additivity="false">
   <appender-ref ref="appender1"/>
   <appender-ref ref="appender2"/>
</logger>

如果您愿意在程序中添加Appender对象,那么您可以使用以下方法:

public void addAppender(Appender appender);

addAppender()方法将一个Appender添加到Logger对象。 如示例配置所示,可以将许多Appender对象添加到逗号分隔列表中的记录器中,每个对象都将记录信息打印到不同的目标。

我们在上面的示例中只使用了一个appender FileAppender 。 所有可能的appender选项是:

  • AppenderSkeleton
  • AsyncAppender
  • ConsoleAppender
  • DailyRollingFileAppender
  • ExternallyRolledFileAppender
  • FileAppender
  • JDBCAppender
  • JMSAppender
  • LF5Appender
  • NTEventLogAppender
  • NullAppender
  • RollingFileAppender
  • SMTPAppender
  • SocketAppender
  • SocketHubAppender
  • SyslogAppender
  • TelnetAppender
  • WriterAppender

我们将在登录文件中介绍FileAppender,并在登录数据库中介绍JDBC Appender。

Layout

我们使用了PatternLayout和我们的appender。 所有可能的选择是:

  • DateLayout
  • HTMLLayout
  • PatternLayout
  • SimpleLayout
  • XMLLayout

使用HTMLLayout和XMLLayout,您还可以生成HTML和XML格式的日志。

布局格式

您将在以下章节中学习如何格式化日志消息: 日志格式

log4j - Sample Program

我们已经了解了如何创建配置文件。 本章介绍如何生成调试消息并将其记录在简单的文本文件中。

以下是为我们的示例创建的简单配置文件。 让我们再次修改它:

  • 根记录器的级别定义为DEBUG并将名为FILE的appender附加到它。

  • appender FILE定义为org.apache.log4j.FileAppender,并写入位于log目录中名为“log.out”的文件。

  • 定义的布局模式是%m%n,这意味着打印的日志消息后面跟一个换行符。

log4j.properties文件的内容如下:

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

在Java程序中使用log4j

以下Java类是一个非常简单的示例,它为Java应用程序初始化然后使用Log4J日志库。

import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class log4jExample{
   /* Get actual class name to be printed on */
   static Logger log = Logger.getLogger(log4jExample.class.getName());
   public static void main(String[] args)throws IOException,SQLException{
      log.debug("Hello this is a debug message");
      log.info("Hello this is an info message");
   }
}

编译并执行

以下是编译和运行上述程序的步骤。 在继续编译和执行之前,请确保已正确设置PATHCLASSPATH

所有库都应该在CLASSPATH可用,并且您的log4j.properties文件应该在PATH中可用。 请按照以下步骤操作:

  • 创建log4j.properties,如上所示。

  • 如上所示创建log4jExample.java并进行编译。

  • 执行log4jExample binary来运行程序。

您将在/usr/home/log4j/log.out文件中获得以下结果:

Hello this is a debug message
Hello this is an info message

log4j - Logging Methods

Logger类提供了各种方法来处理日志记录活动。 Logger类不允许我们实例化一个新的Logger实例,但它提供了两个静态方法来获取Logger对象:

  • public static Logger getRootLogger();
  • public static Logger getLogger(String name);

两个方法中的第一个返回应用程序实例的根记录器,但它没有名称。

通过传递记录器的名称,通过第二种方法获得任何其他命名的Logger对象实例。 记录器的名称可以是您可以传递的任何字符串,通常是我们在上一章中使用的类或包名称,如下所述:

static Logger log = Logger.getLogger(log4jExample.class.getName());

记录方法

一旦我们获得了一个命名记录器的实例,我们就可以使用记录器的几种方法来记录消息。 Logger类具有以下用于打印日志记录信息的方法。

Sr.No 方法和描述
1 public void debug(Object message)

它打印级别为Level.DEBUG的消息。

2 public void error(Object message)

它打印级别为Level.ERROR的消息。

3 public void fatal(Object message);

它打印级别为Level.FATAL的消息。

4 public void info(Object message);

它打印Level.INFO级别的消息。

5 public void warn(Object message);

它打印级别为Level.WARN的消息。

6 public void trace(Object message);

它打印级别为Level.TRACE的消息。

所有级别都在org.apache.log4j.Level类中定义,并且可以按如下方式调用上述任何方法:

import org.apache.log4j.Logger;
public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   public static void main(String[] args) {
      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

编译并运行LogClass程序时,它将生成以下结果:

Debug Message!
Info Message!
Warn Message!
Error Message!
Fatal Message!

当它们与级别结合使用时,所有调试消息都更有意义。 我们将在下一章中介绍级别,然后,您将很好地理解如何结合不同级别的调试使用这些方法。

log4j - Logging Levels

org.apache.log4j.Level类提供以下级别。 您还可以通过对Level类进行子类化来定义自定义级别。

水平 描述
ALL 所有级别包括自定义级别。
DEBUG 指定对调试应用程序最有用的细粒度信息事件。
INFO 指定信息性消息,以粗粒度级别突出显示应用程序的进度。
WARN 指定潜在有害的情况。
ERROR 指定可能仍允许应用程序继续运行的错误事件。
FATAL 指定非常严重的错误事件,可能会导致应用程序中止。
OFF 最高级别,旨在关闭日志记录。
TRACE 指定比DEBUG更精细的信息事件。

级别如何工作?

如果p“= q,则启用具有级别q的记录器中的级别p日志请求。 这条规则是log4j的核心。 它假定级别是有序的。 对于标准级别,我们有“DEBUG”INFO“WARN”ERROR“FATAL”OFF。

以下示例显示了我们如何过滤所有DEBUG和INFO消息。 该程序使用logger方法setLevel(Level.X)来设置所需的日志记录级别:

此示例将打印除Debug和Info之外的所有消息:

import org.apache.log4j.*;
public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   public static void main(String[] args) {
      log.setLevel(Level.WARN);
      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

编译并运行LogClass程序时,它将生成以下结果:

Warn Message!
Error Message!
Fatal Message!

使用配置文件设置级别

log4j为您提供基于配置文件的级别设置,使您可以在想要更改调试级别时更改源代码。

以下是一个示例配置文件,它将执行与上面示例中使用log.setLevel(Level.WARN)方法相同的任务。

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

现在让我们使用以下程序:

import org.apache.log4j.*;
public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   public static void main(String[] args) {
      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

现在编译并运行上面的程序,你会在/usr/home/log4j/log.out文件中得到以下结果:

Warn Message!
Error Message!
Fatal Message!

log4j - Log Formatting

Apache log4j提供了各种Layout对象,每个对象都可以根据各种布局格式化日志记录数据。 还可以创建一个Layout对象,以特定于应用程序的方式格式化日志记录数据。

所有Layout对象都从Appender对象接收LoggingEvent对象。 然后,Layout对象从LoggingEvent中检索消息参数,并应用适当的ObjectRenderer来获取消息的String表示形式。

布局类型

层次结构中的顶级类是抽象类org.apache.log4j.Layout。 这是log4j API中所有其他Layout类的基类。

Layout类在应用程序中定义为abstract,我们从不直接使用此类; 相反,我们使用它的子类,如下所示:

布局方法

此类提供跨所有其他Layout对象的所有常见操作的框架实现,并声明两个抽象方法。

Sr.No. 方法和描述
1 public abstract boolean ignoresThrowable()

它指示日志记录信息是否处理作为日志记录事件的一部分传递给它的任何java.lang.Throwable对象。 如果Layout对象处理Throwable对象,则Layout对象不会忽略它,并返回false。

2 public abstract String format(LoggingEvent event)

单个布局子类为布局特定格式实现此方法。

除了这些抽象方法之外,Layout类还为下面列出的方法提供了具体实现:

Sr.No. 方法和描述
1 public String getContentType()

它返回Layout对象使用的内容类型。 基类将text/plain作为默认内容类型返回。

2 public String getFooter()

它指定日志消息的页脚信息。

3 public String getHeader()

它指定日志消息的标头信息。

每个子类都可以通过覆盖这些方法的具体实现来返回特定于类的信息。

log4j - Logging in Files

要将日志记录信息写入文件,必须使用org.apache.log4j.FileAppender

FileAppender配置

FileAppender具有以下可配置参数:

属性 描述
immediateFlush 默认情况下,此标志设置为true,这意味着每个追加操作都会刷新文件的输出流。
encoding 可以使用任何字符编码。 默认情况下,它是特定于平台的编码方案。
threshold 此追加者的阈值级别。
Filename 日志文件的名称。
fileAppend 默认设置为true,这意味着日志信息将附加到同一文件的末尾。
bufferedIO 此标志指示是否需要启用缓冲写入。 默认情况下,它设置为false。
bufferSize 如果启用了缓冲I/O,则表示缓冲区大小。 默认情况下,它设置为8kb。

以下是FileAppender的示例配置文件log4j.properties

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
# Set the name of the file
log4j.appender.FILE.File=${log}/log.out
# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
# Set the append to false, overwrite
log4j.appender.FILE.Append=false
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

如果您希望XML配置文件等同于上面的log4j.properties文件,那么这里是内容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="FILE" class="org.apache.log4j.FileAppender">
   <param name="file" value="${log}/log.out"/>
   <param name="immediateFlush" value="true"/>
   <param name="threshold" value="debug"/>
   <param name="append" value="false"/>
   <layout class="org.apache.log4j.PatternLayout">
      <param name="conversionPattern" value="%m%n"/>
   </layout>
</appender>
<logger name="log4j.rootLogger" additivity="false">
   <level value="DEBUG"/>
   <appender-ref ref="FILE"/>
</logger>
</log4j:configuration>

您可以尝试使用上述配置的log4j - Sample Program

登录多个文件

出于某些原因,您可能希望将日志消息写入多个文件,例如,如果文件大小达到某个阈值。

要将日志记录信息写入多个文件,必须使用org.apache.log4j.RollingFileAppender类,该类扩展FileAppender类并继承其所有属性。

除了上面提到的FileAppender之外,我们还有以下可配置参数:

属性 描述
maxFileSize 这是文件将在其上滚动的文件的临界大小。 默认值为10 MB。
maxBackupIndex 此属性表示要创建的备份文件数。 默认值为1。

以下是RollingFileAppender的示例配置文件log4j.properties

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
# Set the name of the file
log4j.appender.FILE.File=${log}/log.out
# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
# Set the append to false, should not overwrite
log4j.appender.FILE.Append=true
# Set the maximum file size before rollover
log4j.appender.FILE.MaxFileSize=5KB
# Set the the backup index
log4j.appender.FILE.MaxBackupIndex=2
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

如果您希望拥有XML配置文件,则可以生成与初始部分中提到的相同的内容,并仅添加与RollingFileAppender相关的其他参数。

此示例配置演示了每个日志文件的最大允许大小为5 MB。 超过最大大小时,将创建一个新的日志文件。 由于maxBackupIndex定义为2,因此一旦第二个日志文件达到最大大小,第一个日志文件将被删除,此后,所有日志记录信息将回滚到第一个日志文件。

您可以尝试使用上述配置的log4j - Sample Program

每日日志文件生成

可能需要每天生成日志文件以保持日志信息的清晰记录。

要每天将日志记录信息写入文件,您必须使用org.apache.log4j.DailyRollingFileAppender类,该类扩展FileAppender类并继承其所有属性。

除了上面提到的FileAppender之外,只有一个重要的可配置参数:

属性 描述
DatePattern 这表示何时翻转文件以及要遵循的命名约定。 默认情况下,每天午夜都会进行翻转。

DatePattern使用以下模式之一控制翻转计划:

DatePattern 描述
'' YYYY-MM 在每个月末和下个月初滚动。
'' YYYY-MM-DD 每天午夜翻身。 这是默认值。
'' YYYY-MM-DD-A 在每天的中午和午夜翻身。
'' YYYY-MM-DD-HH 在每小时的顶部翻滚。
'' YYYY-MM-DD-HH-毫米 每分钟滚动一次。
'' YYYY-WW 根据当地情况,在每周的第一天翻转。

以下是一个示例配置文件log4j.properties用于生成在每天的中午和午夜滚动的日志文件。

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
# Set the name of the file
log4j.appender.FILE.File=${log}/log.out
# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
# Set the append to false, should not overwrite
log4j.appender.FILE.Append=true
# Set the DatePattern
log4j.appender.FILE.DatePattern='.' yyyy-MM-dd-a
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

如果您希望拥有XML配置文件,则可以生成与初始部分中提到的相同的内容,并仅添加与DailyRollingFileAppender相关的其他参数。

您可以尝试使用上述配置的log4j - Sample Program

log4j - Logging in Database

log4j API提供org.apache.log4j.jdbc.JDBCAppender对象,该对象可以将日志记录信息放在指定的数据库中。

JDBCAppender配置

属性 描述
bufferSize 设置缓冲区大小。 默认大小为1。
driver 将驱动程序类设置为指定的字符串。 如果未指定驱动程序类,则默认为sun.jdbc.odbc.JdbcOdbcDriver。
layout 设置要使用的布局。 默认布局是org.apache.log4j.PatternLayout。
password 设置数据库密码。
sql 指定每次发生日志记录事件时要执行的SQL语句。 这可以是INSERT,UPDATE或DELETE。
URL 设置JDBC URL。
user 设置数据库用户名。

日志表配置

在开始使用基于JDBC的日志记录之前,应创建一个表来维护所有日志信息。 以下是用于创建LOGS表的SQL语句:

CREATE TABLE LOGS
   (USER_ID VARCHAR(20) NOT NULL,
    DATED   DATE NOT NULL,
    LOGGER  VARCHAR(50) NOT NULL,
    LEVEL   VARCHAR(10) NOT NULL,
    MESSAGE VARCHAR(1000) NOT NULL
   );

示例配置文件

以下是JDBCAppender的示例配置文件log4j.properties ,它将用于将消息记录到LOGS表。

# Define the root logger with appender file
log4j.rootLogger = DEBUG, DB
# Define the DB appender
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
# Set JDBC URL
log4j.appender.DB.URL=jdbc:mysql://localhost/DBNAME
# Set Database Driver
log4j.appender.DB.driver=com.mysql.jdbc.Driver
# Set database user name and password
log4j.appender.DB.user=user_name
log4j.appender.DB.password=password
# Set the SQL statement to be executed.
log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')
# Define the layout for file appender
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

对于MySQL数据库,您必须使用实际的DBNAME,用户ID和密码,您已在其中创建了LOGS表。 SQL语句用于执行INSERT语句,其中包含表名LOGS和要输入表的值。

JDBCAppender不需要显式定义布局。 相反,传递给它的SQL语句使用PatternLayout。

如果您希望XML配置文件等同于上面的log4j.properties文件,那么这里是内容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender">
   <param name="url" value="jdbc:mysql://localhost/DBNAME"/>
   <param name="driver" value="com.mysql.jdbc.Driver"/>
   <param name="user" value="user_id"/>
   <param name="password" value="password"/>
   <param name="sql" value="INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')"/>
   <layout class="org.apache.log4j.PatternLayout">
   </layout>
</appender>
<logger name="log4j.rootLogger" additivity="false">
   <level value="DEBUG"/>
   <appender-ref ref="DB"/>
</logger>
</log4j:configuration>

示例程序

以下Java类是一个非常简单的示例,它初始化然后将Log4J日志库用于Java应用程序。

import org.apache.log4j.Logger;
import java.sql.*;
import java.io.*;
import java.util.*;
public class log4jExample{
   /* Get actual class name to be printed on */
   static Logger log = Logger.getLogger(log4jExample.class.getName());
   public static void main(String[] args)throws IOException,SQLException{
      log.debug("Debug");
      log.info("Info");
   }
}

编译并执行

以下是编译和运行上述程序的步骤。 在继续编译和执行之前,请确保已正确设置PATHCLASSPATH

所有库都应该在CLASSPATH可用,并且您的log4j.properties文件应该在PATH中可用。 按照给定的步骤:

  • 创建log4j.properties,如上所示。
  • 如上所示创建log4jExample.java并进行编译。
  • 执行log4jExample binary来运行程序。

现在检查DBNAME数据库中的LOGS表,你会发现以下条目:

mysql >  select * from LOGS;
+---------+------------+--------------+-------+---------+
| USER_ID | DATED      | LOGGER       | LEVEL | MESSAGE |
+---------+------------+--------------+-------+---------+
|         | 2010-05-13 | log4jExample | DEBUG | Debug   |
|         | 2010-05-13 | log4jExample | INFO  | Info    |
+---------+------------+--------------+-------+---------+
2 rows in set (0.00 sec)

Note:此处x用于输出与生成日志记录事件的线程关联的嵌套诊断上下文(NDC)。 我们使用NDC来区分处理多个客户端的服务器端组件中的客户端。 有关详细信息,请查看Log4J手册。

↑回到顶部↑
WIKI教程 @2018