log4j - 快速指南
log4j - 概述
log4j 是一个用 Java 编写的可靠、快速且灵活的日志框架 (API),根据 Apache 软件许可证分发。
log4j 已移植到 C、C++、C#、Perl、Python、Ruby 和 Eiffel 语言。
log4j 在运行时可以通过外部配置文件进行高度配置。它根据优先级查看日志记录过程,并提供将日志记录信息定向到各种目的地的机制,例如数据库、文件、控制台、UNIX Syslog 等。
log4j 具有三个主要组件:
loggers:负责捕获日志信息。
appenders:负责将日志信息发布到各种首选目的地。
布局:负责以不同的样式格式化日志信息。
log4j 的历史
于 1996 年初开始,作为 EU SEMPER(欧洲安全电子市场)项目的跟踪 API。
经过无数次的增强和几次化身,最初的 API 已经发展成为 log4j,一个流行的 Java 日志包。
该软件包根据 Apache 软件许可证分发,这是经过开源倡议认证的成熟开源许可证。
最新的 log4j 版本,包括其完整源代码、类文件和文档,可以在http://logging.apache.org/log4j/找到。
log4j 特点
它是线程安全的。
它针对速度进行了优化。
它基于命名的记录器层次结构。
它支持每个记录器多个输出附加器。
它支持国际化。
它不限于一组预定义的设施。
可以使用配置文件在运行时设置日志记录Behave。
它从一开始就被设计为处理 Java 异常。
它使用多个级别,即 ALL、TRACE、DEBUG、INFO、WARN、ERROR 和 FATAL。
通过扩展Layout类可以轻松更改日志输出的格式。
日志输出的目标以及写入策略可以通过Appender接口的实现来改变。
这是故障停止。然而,尽管 log4j 确实努力确保交付,但它并不保证每个日志语句都将交付到其目的地。
日志记录的优点和缺点
日志记录是软件开发的重要组成部分。编写良好的日志记录代码可以提供快速调试、轻松维护以及应用程序运行时信息的结构化存储。
日志记录也有其缺点。它会减慢应用程序的速度。如果太冗长,可能会导致滚动失明。为了缓解这些问题,log4j 被设计为可靠、快速且可扩展。
由于日志记录很少成为应用程序的主要焦点,因此 log4j API 力求易于理解和使用。
log4j - 安装
log4j API 包根据 Apache 软件许可证分发,这是经过开源倡议认证的成熟开源许可证。
最新的 log4j 版本,包括完整源代码、类文件和文档,可以在http://logging.apache.org/log4j/找到。
要在系统上安装 log4j,请从指定的 URL 下载 apache-log4j-xxxtar.gz 并按照以下步骤操作。
步骤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
第2步
此步骤是可选的,取决于您要使用 log4j 框架的哪些功能。如果您的计算机上已经安装了以下软件包,那么就可以了,否则您需要安装它们才能使 log4j 工作。
JavaMail API: log4j 中基于电子邮件的日志记录功能需要从glassfish.dev在您的计算机上安装 Java Mail API (mail.jar) 。
JavaBeans 激活框架: Java Mail API 还要求从http://java.sun.com/products/javabeans/jaf/index.jsp在您的计算机上安装 JavaBeans 激活框架 (activation.jar) 。
Java 消息服务: log4j 的 JMS 兼容功能需要从http://java.sun.com/products/jms在您的计算机上安装 JMS 和 Java 命名和目录接口 JNDI 。
XML 解析器:您需要一个与 JAXP 兼容的 XML 解析器才能使用 log4j。确保您的计算机上已从http://xerces.apache.org/xerces-j/install.html安装了 Xerces.jar 。
步骤3
现在您需要适当地设置CLASSPATH和PATH变量。这里我们将仅针对 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 - 架构
log4j API 遵循分层架构,其中每一层提供不同的对象来执行不同的任务。这种分层架构使得设计灵活且易于将来扩展。
log4j 框架有两种类型的对象。
核心对象:这些是框架的强制对象。他们需要使用该框架。
支持对象:这些是框架的可选对象。它们支持核心对象执行额外但重要的任务。
核心对象
核心对象包括以下类型的对象:
记录器对象
最顶层是Logger,它提供Logger对象。Logger 对象负责捕获日志记录信息,并将它们存储在命名空间层次结构中。
布局对象
布局层提供了用于以不同样式格式化日志信息的对象。它在发布日志信息之前为附加程序对象提供支持。
布局对象在以人类可读和可重用的方式发布日志信息方面发挥着重要作用。
附加对象
这是一个提供 Appender 对象的较低层。Appender 对象负责将日志信息发布到各种首选目的地,例如数据库、文件、控制台、UNIX Syslog 等。
以下虚拟图显示了 log4J 框架的组件:
支持对象
log4j 框架中还有其他重要对象在日志记录框架中发挥着至关重要的作用:
关卡对象
Level 对象定义任何日志记录信息的粒度和优先级。API 中定义了七个日志记录级别:OFF、DEBUG、INFO、ERROR、WARN、FATAL 和 ALL。
过滤对象
Filter 对象用于分析日志记录信息并进一步决定是否应记录该信息。
一个 Appender 对象可以有多个与其关联的 Filter 对象。如果日志记录信息传递到特定的 Appender 对象,则与该 Appender 关联的所有 Filter 对象都需要批准日志记录信息,然后才能将其发布到附加目标。
对象渲染器
ObjectRenderer 对象专门提供传递给日志框架的不同对象的字符串表示形式。布局对象使用此对象来准备最终的日志记录信息。
日志管理器
LogManager 对象管理日志框架。它负责从系统范围的配置文件或配置类中读取初始配置参数。
log4j - 配置
上一章讲解了log4j的核心组件。本章介绍如何使用配置文件配置核心组件。配置 log4j 涉及分配 Level、定义 Appender 以及在配置文件中指定 Layout 对象。
log4j.properties文件是一个 log4j 配置文件,它将属性保存在键值对中。默认情况下,LogManager在CLASSPATH中查找名为log4j.properties的文件。
根记录器的级别定义为 DEBUG。DEBUG 将名为 X 的附加程序附加到它。
将名为 X 的附加程序设置为有效的附加程序。
设置附加器 X 的布局。
log4j.properties 语法:
以下是附加程序 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 示例
使用上面的语法,我们在log4j.properties文件中定义以下内容:
根记录器的级别定义为DEBUG,DEBUG附加程序命名为FILE。
附加程序 FILE 定义为org.apache.log4j.FileAppender。它写入位于日志目录中名为“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}。
调试级别
我们已将 DEBUG 与两个附加程序一起使用。所有可能的选项是:
- 痕迹
- 调试
- 信息
- 警告
- 错误
- 致命的
- 全部
这些级别将在log4j 日志级别中进行解释。
附加器
Apache log4j 提供 Appender 对象,主要负责将日志消息打印到不同的目的地,例如控制台、文件、套接字、NT 事件日志等。
每个 Appender 对象都有不同的与其关联的属性,这些属性指示该对象的Behave。
财产 | 描述 |
---|---|
布局 | Appender 使用 Layout 对象和与其关联的转换模式来格式化日志记录信息。 |
目标 | 目标可能是控制台、文件或其他项目,具体取决于附加程序。 |
等级 | 需要该级别来控制日志消息的过滤。 |
临界点 | Appender 可以具有与其关联的阈值级别,而与记录器级别无关。Appender 会忽略级别低于阈值级别的任何日志消息。 |
筛选 | 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 对象添加到逗号分隔列表中的记录器中,每个对象将日志记录信息打印到不同的目标。
在上面的示例中,我们仅使用了一个附加程序FileAppender 。所有可能的附加器选项是:
- 附加骨架
- 异步Appender
- 控制台附加程序
- DailyRollingFileAppender
- 外部RolledFileAppender
- 文件附加器
- JDBCAppender
- JMSAppender
- LF5附加器
- NTEventLogAppender
- 空追加器
- 滚动文件附加器
- SMTP附加程序
- 套接字附加器
- SocketHubAppender
- 系统日志附加程序
- TelnetAppender
- 作家追加者
我们将在“文件日志记录”中介绍 FileAppender,而“数据库日志记录”中将介绍 JDBC Appender 。
布局
我们已经将 PatternLayout 与我们的附加程序一起使用。所有可能的选项是:
- 日期布局
- HTML布局
- 图案布局
- 简单布局
- XML布局
使用 HTMLLayout 和 XMLLayout,您可以生成 HTML 和 XML 格式的日志。
布局格式
您将在日志格式化一章中学习如何格式化日志消息。
log4j - 示例程序
我们已经了解了如何创建配置文件。本章介绍如何生成调试消息并将其记录在简单的文本文件中。
以下是为我们的示例创建的简单配置文件。让我们再次修改一下:
根记录器的级别定义为 DEBUG 并将名为 FILE 的附加程序附加到它。
追加器 FILE 定义为 org.apache.log4j.FileAppender 并写入位于日志目录中名为“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"); } }
编译并执行
以下是编译和运行上述程序的步骤。在继续编译和执行之前,请确保已正确设置PATH和CLASSPATH 。
所有库都应在CLASSPATH中可用,并且log4j.properties文件应在 PATH 中可用。请按照以下步骤操作:
如上所示创建 log4j.properties。
如上所示创建 log4jExample.java 并编译它。
执行 log4jExample 二进制文件来运行该程序。
您将在 /usr/home/log4j/log.out 文件中得到以下结果:
Hello this is a debug message Hello this is an info message
log4j - 日志记录方法
Logger 类提供了多种方法来处理日志记录活动。Logger 类不允许我们实例化新的 Logger 实例,但它提供了两个静态方法来获取 Logger 对象:
- 公共静态记录器 getRootLogger();
- 公共静态 Logger getLogger(字符串名称);
这两个方法中的第一个返回应用程序实例的根记录器,并且它没有名称。
任何其他命名的 Logger 对象实例都是通过第二个方法通过传递记录器的名称来获取的。记录器的名称可以是您可以传递的任何字符串,通常是我们在上一章中使用的类或包名称,如下所述:
static Logger log = Logger.getLogger(log4jExample.class.getName());
记录方法
一旦我们获得了命名记录器的实例,我们就可以使用记录器的多种方法来记录消息。Logger 类具有以下用于打印日志信息的方法。
先生编号 | 方法和说明 |
---|---|
1 | 公共无效调试(对象消息)
它打印级别为 Level.DEBUG 的消息。 |
2 | 公共无效错误(对象消息)
它打印级别为 Level.ERROR 的消息。 |
3 | 公共无效致命(对象消息);
它打印级别为 Level.FATAL 的消息。 |
4 | 公共无效信息(对象消息);
它打印级别为 Level.INFO 的消息。 |
5 | 公共无效警告(对象消息);
它打印级别为 Level.WARN 的消息。 |
6 |
公共无效跟踪(对象消息);
它打印级别为 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 - 日志记录级别
org.apache.log4j.Level 类提供以下级别。您还可以通过对 Level 类进行子类化来定义自定义级别。
等级 | 描述 |
---|---|
全部 | 所有级别,包括自定义级别。 |
调试 | 指定对调试应用程序最有用的细粒度信息事件。 |
信息 | 指定在粗粒度级别突出显示应用程序进度的信息性消息。 |
警告 | 指定潜在有害的情况。 |
错误 | 指定可能仍允许应用程序继续运行的错误事件。 |
致命的 | 指定非常严重的错误事件,可能会导致应用程序中止。 |
离开 | 可能的最高等级,旨在关闭日志记录。 |
痕迹 | 指定比 DEBUG 更细粒度的信息事件。 |
级别如何运作?
如果 p >= q,则启用级别为q的记录器中级别为p的日志请求。该规则是 log4j 的核心。它假设级别是有序的。对于标准级别,我们有 ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
以下示例显示了如何过滤所有 DEBUG 和 INFO 消息。该程序使用记录器方法 setLevel(Level.X) 来设置所需的日志记录级别:
此示例将打印除调试和信息之外的所有消息:
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 - 日志格式
Apache log4j 提供了各种 Layout 对象,每个对象都可以根据各种布局格式化日志数据。还可以创建一个 Layout 对象,以特定于应用程序的方式格式化日志数据。
所有 Layout 对象都从 Appender 对象接收 LoggingEvent 对象。然后,布局对象从 LoggingEvent 中检索消息参数,并应用适当的 ObjectRenderer 来获取消息的字符串表示形式。
布局类型
层次结构中的顶级类是抽象类 org.apache.log4j.Layout。这是 log4j API 中所有其他布局类的基类。
Layout 类在应用程序中被定义为抽象类,我们从不直接使用此类;相反,我们使用它的子类,如下所示:
布局方法
此类提供所有其他 Layout 对象的所有常见操作的骨架实现,并声明两个抽象方法。
先生。 | 方法与说明 |
---|---|
1 | 公共抽象布尔忽略Throwable()
它指示日志记录信息是否处理作为日志记录事件的一部分传递给它的任何 java.lang.Throwable 对象。如果 Layout 对象处理 Throwable 对象,则 Layout 对象不会忽略它,并返回 false。 |
2 |
公共抽象字符串格式(LoggingEvent 事件)
各个布局子类实现此方法以进行特定于布局的格式化。 |
除了这些抽象方法之外,Layout 类还提供了下列方法的具体实现:
先生。 | 方法与说明 |
---|---|
1 |
公共字符串 getContentType()
它返回布局对象使用的内容类型。基类返回 text/plain 作为默认内容类型。 |
2 |
公共字符串 getFooter()
它指定日志消息的页脚信息。 |
3 |
公共字符串 getHeader()
它指定日志消息的头信息。 |
每个子类都可以通过重写这些方法的具体实现来返回特定于类的信息。
log4j - 登录文件
要将日志信息写入文件,您必须使用org.apache.log4j.FileAppender。
文件附加器配置
FileAppender 有以下可配置参数:
财产 | 描述 |
---|---|
立即刷新 | 该标志默认设置为 true,这意味着文件的输出流将随着每个追加操作而刷新。 |
编码 | 可以使用任何字符编码。默认情况下,它是特定于平台的编码方案。 |
临界点 | 此附加程序的阈值级别。 |
文件名 | 日志文件的名称。 |
文件追加 | 默认情况下设置为 true,这意味着日志记录信息将附加到同一文件的末尾。 |
缓冲IO | 该标志指示我们是否需要启用缓冲写入。默认情况下,它设置为 false。 |
缓冲区大小 | 如果启用缓冲 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
如果您希望有一个与上述log4j.properties文件等效的 XML 配置文件,那么内容如下:
<?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 - 示例程序。
登录多个文件
出于某些原因,您可能希望将日志消息写入多个文件,例如,如果文件大小达到特定阈值。
要将日志信息写入多个文件,您必须使用org.apache.log4j.RollingFileAppender类,该类扩展FileAppender类并继承其所有属性。
除了上面提到的 FileAppender 参数之外,我们还有以下可配置参数:
财产 | 描述 |
---|---|
最大文件大小 | 这是文件的临界大小,超过该大小将滚动文件。默认值为 10 MB。 |
最大备份索引 | 该属性表示要创建的备份文件的数量。默认值为 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=5MB # 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 - 示例程序。
每日日志文件生成
可能需要每天生成日志文件,以保持日志信息的清晰记录。
要每天将日志信息写入文件,您必须使用org.apache.log4j.DailyRollingFileAppender类,该类扩展FileAppender类并继承其所有属性。
FileAppender 除了上面提到的参数之外,只有一个重要的可配置参数:
财产 | 描述 |
---|---|
日期模式 | 这指示何时滚动文件以及要遵循的命名约定。默认情况下,滚动在每天午夜执行。 |
DatePattern 使用以下模式之一控制滚动计划:
日期模式 | 描述 |
---|---|
'.' yyyy-MM | 每个月底和下个月初进行滚动。 |
'.' 年-月-日 | 每天午夜翻身。这是默认值。 |
'.' yyyy-MM-dd-a | 每天中午和午夜翻滚。 |
'.' yyyy-MM-dd-HH | 每小时整点翻滚一次。 |
'.' yyyy-MM-dd-HH-mm | 每分钟翻一次。 |
'.' 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 - 示例程序。
log4j - 登录数据库
log4j API 提供了org.apache.log4j.jdbc.JDBCAppender对象,该对象可以将日志信息放入指定的数据库中。
JDBCAppender 配置
财产 | 描述 |
---|---|
缓冲区大小 | 设置缓冲区大小。默认大小为 1。 |
司机 | 将驱动程序类设置为指定的字符串。如果未指定驱动程序类,则默认为 sun.jdbc.odbc.JdbcOdbcDriver。 |
布局 | 设置要使用的布局。默认布局是 org.apache.log4j.PatternLayout。 |
密码 | 设置数据库密码。 |
sql | 指定每次日志记录事件发生时要执行的 SQL 语句。这可以是插入、更新或删除。 |
网址 | 设置 JDBC URL。 |
用户 | 设置数据库用户名。 |
日志表配置
在开始使用基于 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 数据库,您必须使用在其中创建 LOGS 表的实际 DBNAME、用户 ID 和密码。SQL 语句是使用表名 LOGS 和要输入到表中的值来执行 INSERT 语句。
JDBCAppender 不需要显式定义布局。相反,传递给它的 SQL 语句使用 PatternLayout。
如果您希望有一个与上述log4j.properties文件等效的 XML 配置文件,那么内容如下:
<?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 类是一个非常简单的示例,它初始化并使用 Java 应用程序的 Log4J 日志记录库。
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"); } }
编译并执行
以下是编译和运行上述程序的步骤。在继续编译和执行之前,请确保已正确设置PATH和CLASSPATH 。
所有库都应在CLASSPATH中可用,并且log4j.properties文件应在 PATH 中可用。请按照给定的步骤操作:
- 如上所示创建 log4j.properties。
- 如上所示创建 log4jExample.java 并编译它。
- 执行 log4jExample 二进制文件来运行该程序。
现在检查 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)
注意:此处 x 用于输出与生成日志记录事件的线程关联的嵌套诊断上下文 (NDC)。我们使用 NDC 来区分处理多个客户端的服务器端组件中的客户端。有关详细信息,请参阅 Log4J 手册。