1 概述
Log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它根据Apache软件许可分发。
Log4j已被移植到C,C ++,C#,Perl,Python,Ruby和Eiffel语言。
运行时通过外部配置文件可高度配置Log4j。 它根据优先级别查看日志记录过程,并提供将日志信息导向各种目标(如数据库,文件,控制台,UNIX系统日志等)的机制。
Log4j有三个主要组件:
- loggers:负责捕获记录信息。
- appenders:负责将日志信息发布到各种不同的目的地。
- layouts:负责格式化不同样式的日志信息。
1、log4j的历史
·于1996年初开始作为E.U.的跟踪API。 SEMPER(欧洲市场安全电子)项目。
·经过无数的增强和几个化身后,最初的API已经发展成为一种流行的Java日志包log4j。
·该软件包是根据Apache软件许可证分发的,这是一个功能齐全的开放平台,源代码许可证由开源倡议认证。
·最新的log4j版本,包括其完整源代码,类文件和文档可以在http://logging.apache.org/log4j/找到。
2、log4j的特性
- 它是线程安全的。
- 它针对速度进行了优化。
- 它基于指定的记录器层次结构。
- 它支持每个记录器多个输出appender。
- 它支持国际化。
- 它不限于预定义的一套设施。
- 日志记录行为可以使用配置文件在运行时设置。
- 它旨在从一开始就处理Java异常。
- 它使用多个级别,即ALL,TRACE,DEBUG,INFO,WARN,ERROR和FATAL。
- 通过扩展Layout类,可以轻松更改日志输出的格式。
- 日志输出的目标以及编写策略可以通过Appender接口的实现进行更改。
- 它是故障停止。 但是,虽然它确实努力确保交付,但log4j不保证每个日志语句都将交付到其目的地。
3、Logging的优点和缺点
记录是软件开发的重要组成部分。 精心编写的日志代码提供了快速调试,易于维护和应用程序运行时信息的结构化存储。
记录也有其缺点。 它会减慢应用程序的速度。 如果过于冗长,可能会导致滚动失明。 为了缓解这些担忧,log4j被设计为可靠,快速和可扩展。
由于日志记录很少是应用程序的主要焦点,因此log4j API努力易于理解和使用。
2 安装
Log4j API软件包在Apache软件许可证下发布,这是一项由开源计划认证的完整开源许可证。
最新的log4j版本,包括其全部源代码,类文件和文档可以在http://logging.apache.org/log4j/找到。
要在您的系统上安装log4j,请从指定的URL下载apache-log4j-x.x.x.tar.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-x.x.x的目录层次结构,如下所示:
-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中基于电子邮件的日志记录功能需要Java Mail API
(mail.jar)从https://glassfish.dev.java.net/javaee5/mail/安装到您的机器上。
·JavaBeans Activation Framework:Java邮件API也将要求
JavaBeans Activation Framework(activation.jar)从您的计算机上安装
http://java.sun.com/products/javabeans/jaf/index.jsp。
·Java消息服务:log4j的JMS兼容功能将要求这两者
JMS和Java命名和目录接口(JNDI)安装在您的机器上
来自http://java.sun.com/products/jms。
·XML解析器:您需要一个兼容JAXP的XML解析器来使用log4j。确保你
从http://xerces.apache.org/xercesj/install.html安装Xerces.jar。
第3步
现在您需要适当地设置CLASSPATH和PATH变量。这里我们将为log4j.x.x.jar文件设置它。
$ 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/ |
3 架构
Log4j API遵循分层体系结构,其中每个层提供不同的对象来执行不同的任务。 这种分层架构使得设计在将来更加灵活和易于扩展。
Log4j框架有两种可用的对象类型:
·核心对象:这些是框架的强制对象。 他们被要求使用框架。
·支持对象:这些是框架的可选对象。 他们支持核心对象来执行额外但重要的任务。
1、核心对象
核心对象包括以下类型的对象:
记录器对象
顶层是提供记录器对象的记录器。 Logger对象负责捕获日志信息,它们存储在命名空间层次结构中。
布局对象
布局图层提供了用于以不同样式格式化日志记录信息的对象。 它在发布日志信息之前为appender对象提供支持。
布局对象在以人类可读和可重用的方式发布日志信息方面发挥着重要作用。
Appender对象
这是一个提供Appender对象的底层图层。 Appender对象负责将日志信息发布到各种首选目标,如数据库,文件,控制台,UNIX系统日志等。
以下虚拟图显示了log4j框架的组件:
2、支持对象
log4j框架中还有其他重要的对象在日志框架中扮演重要角色:
级别对象
Level对象定义了任何日志信息的粒度和优先级。 在API中定义了七个级别的日志记录:OFF,DEBUG,INFO,ERROR,WARN,FATAL和ALL。
3、过滤对象
Filter对象用于分析日志信息并进一步决定是否记录该信息。
Appender对象可以有多个与它们关联的Filter对象。 如果记录
信息被传递给一个特定的Appender对象,所有与该Appender相关联的Filter对象都需要批准日志信息,然后才能将其发布到附加目标。
4、ObjectRenderer
ObjectRenderer对象专门提供传递给日志框架的不同对象的字符串表示。 Layout对象使用该对象来准备最终的日志记录信息。
5、日志管理
LogManager对象管理日志框架。 它负责从系统范围的配置文件或配置类中读取初始配置参数。
4 配置
上一章解释了log4j的核心组件。 本章介绍如何使用配置文件配置核心组件。 配置log4j涉及分配Level,定义Appender以及在配置文件中指定Layout对象。
log4j.properties文件是一个log4j配置文件,用于保存键值对中的属性。
默认情况下,LogManager将在CLASSPATH中查找名为log4j.properties的文件。
·根记录器的级别定义为DEBUG。 DEBUG将名为X的appender附加到它上面。
·将名为X的appender设置为有效的appender。
·设置appender X的布局。
1、log4j.properties的语法
以下是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 |
2、log4j.properties的示例
使用上面的语法,我们在log4j.properties文件中定义了以下内容:
·根记录器的级别定义为DEBUG。 DEBUG将appender命名为FILE。
·appender 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}。
3、调试级别
我们已经和两个appender一起使用了DEBUG。 所有可能的选项是:
·TRACE
·DEBUG
·INFO
·WARN
·ERROR
·FATAL
·ALL
这些级别将在Log4j日志级别中解释。
4、附加目的地
Apache log4j提供了Appender对象,它主要负责将日志消息打印到不同的目标,如控制台,文件,套接字,NT事件日志等。
每个Appender对象具有与其关联的不同属性,并且这些属性指示该对象的行为。
属性 | 描述 |
layout | Appender使用Layout对象和与它们关联的转换模式来格式化日志记录信息 |
target | 目标可能是控制台,文件或其他项目,具体取决于appender。 |
level | 需要该级别来控制日志消息的过滤。 |
threshold | Appender可以独立于记录器级别设置与其相关的阈值级别。 Appender会忽略任何级别低于阈值级别的日志消息。 |
filter | Filter对象可以分析级别匹配之外的日志信息,并决定日志请求是由特定的Appender处理还是被忽略。 |
通过使用以下方法在配置文件中包含以下设置,我们可以将Appender对象添加到记录器:
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格式
布局格式
您将在日志格式章节中学习如何格式化日志消息。
5 示例程序
我们已经看到如何创建一个配置文件。 本章介绍如何生成调试消息并将其记录在简单的文本文件中。
以下是为我们的示例创建的简单配置文件。 让我们再次修改它:
·根记录器的级别定义为DEBUG,并将appender命名为FILE。
·appender 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 |
1、在Java项目中使用log4j
以下Java类是一个非常简单的示例,它初始化并将Log4J日志记录库用于Java应用程序。
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"); } } |
2、编译和执行
以下是编译和运行上述程序的步骤。 在继续编译和执行之前,确保已经正确设置了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 |
6 Logging
记录器类提供了各种方法来处理记录活动。 Logger类不允许我们实例化一个新的Logger实例,但它提供了两个获取Logger对象的静态方法:
·public static Logger getRootLogger();
·public static Logger getLogger(String name);
这两个方法中的第一个返回应用程序实例的根记录器,并且没有名称。
任何其他指定的Logger对象实例都是通过传递记录器的名称通过第二种方法获取的。 记录器的名称可以是任何可以传递的字符串,通常是上一章中我们已经使用过的类或包名,下面提到它:
static Logger log = Logger.getLogger(log4jExample.class.getName()); |
1、Logging的方法
一旦我们获得了一个命名记录器的实例,我们就可以使用记录器的几种方法来记录消息。 Logger类具有以下用于打印日志记录信息的方法。
序号 | 方法和描述 |
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! |
所有调试消息在与级别结合使用时更有意义。 我们将在下一章讲述关卡的层次,然后您将很好地理解如何结合不同级别的调试使用这些方法。
2、Logging的级别
org.apache.log4j.Level级别。 您还可以通过对Level级别进行子分类来定义自定义级别。
Level | 描述 |
ALL | 所有级别包括自定义级别。 |
DEBUG | 指定对调试应用程序最有用的细粒度信息事件。 |
ERROR | 指定可能仍然允许应用程序继续运行的错误事件。 |
FATAL | 指定非常严重的错误事件,可能导致应用程序中止。 |
INFO | 指定以粗粒度级别突出显示应用程序进度的信息性消息。 |
OFF | 尽可能高的等级,旨在关闭日志记录。 |
TRACE | 指定比DEBUG更细的信息事件。 |
WARN | 指定可能有害的情况。 |
Levels工作的原理
如果p> = q,则启用记录器中级别为p的日志请求。 这条规则是log4j的核心。 它假定层次是有序的。 对于标准级别,我们有ALL <DEBUG <INFO <WARN <ERROR <FATAL <OFF。
以下示例显示了我们如何过滤所有的DEBUG和INFO消息。 此程序使用记录器方法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! |
使用配置文件设置Level
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! |
3、日志格式
Apache log4j提供了各种布局对象,每个布局对象可以根据各种布局格式化日志记录数据。 还可以创建一个Layout对象,以特定于应用程序的方式格式化日志记录数据。
所有布局对象都从Appender对象接收LoggingEvent对象。 然后,Layout对象从LoggingEvent中检索消息参数,并应用适当的ObjectRenderer来获取消息的字符串表示形式。
布局类型(The Layout Types)
层次结构中的顶级类是抽象类org.apache.log4j.Layout。 这是log4j API中所有其他布局类的基类。
布局类在应用程序中定义为抽象,我们从不直接使用此类; 相反,我们使用它的子类,如下所示:
DateLayout
SimpleLayout
XMLLayout
布局方法(The Layout Methods)
该类提供所有其他布局对象的所有常用操作的框架实现,并声明两个抽象方法。
序号 | 方法和描述 |
1 | public abstract boolean ignoresThrowable() 它指示日志记录信息是否处理作为日志记录事件的一部分传递给它的任何java.lang.Throwable对象。 如果Layout对象处理Throwable对象,则Layout对象不会忽略它,并返回false。 |
2 | public abstract String format(LoggingEvent event) 个别布局子类实现此方法以进行布局特定的格式化。 |
除了这些抽象方法外,Layout类为下面列出的方法提供了具体的实现:
序号 | 方法及描述 |
1 | public String getContentType() 它返回布局对象使用的内容类型。 基类将text / plain作为默认内容类型返回。 |
2 | public String getFooter() 它指定日志消息的页脚信息。 |
3 | public String getHeader() 它指定日志消息的标题信息。 |
每个子类都可以通过覆盖这些方法的具体实现来返回特定于类的信息。
4、文件中的Logging
要将日志信息写入文件,您必须使用org.apache.log4j.FileAppender。
配置FileAppender
FileAppender具有以下可配置参数:
属性 | 描述 |
immediateFlush | 该标志默认设置为true,这意味着每次追加操作都会刷新文件的输出流。 |
encoding | 可以使用任何字符编码。 默认情况下,它是平台特定的编码方案。 |
threshold | 此appender的阈值级别。 |
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 |
如果您希望具有与上述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 - 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,所以一旦第二个日志文件达到最大大小,第一个日志文件将被清除,之后所有日志信息将被回滚到第一个日志文件。
生成每日日志文件
可能需要每天生成日志文件以保持记录信息的清晰记录。
要将日志记录信息每天写入文件,必须使用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-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相关的其他参数。
5、数据库的Logging
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,用户标识和密码,并在其中创建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"); } } |
编译执行
以下是编译和运行上述程序的步骤。 在继续编译和执行之前,确保已经正确设置了PATH和CLASSPATH。
所有库都应该在CLASSPATH中可用,并且您的log4j.properties文件应该在PATH中可用。 按照给定的步骤 -
Create log4j.properties as shown above.
Create log4jExample.java as shown above and compile it.
Execute log4jExample binary to run the program.
现在检查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手册了解更多信息。
6、布局类型介绍
HTMLLayout
如果您想要以HTML格式的文件生成日志记录信息,则可以使用org.apache.log4j.HTMLLayout格式化日志记录信息。
HTMLLayout类扩展了抽象org.apache.log4j.Layout类,并从基类中覆盖format()方法以提供HTML样式的格式。
它提供了要显示的以下信息:
生成特定记录事件之前从应用程序启动开始所经过的时间。
调用日志记录请求的线程的名称。
与此日志记录请求关联的级别。
记录器的名称和记录消息。
程序文件的可选位置信息以及从中调用此日志记录的行号。
HTMLLayout是一个非常简单的布局对象,它提供了以下方法:
序号 | 描述 |
1 | setContentType(String) 设置文本/ HTML HTML内容的内容类型。 默认是text / html。 |
2 | setLocationInfo(String) 设置记录事件的位置信息。 默认为false。 |
3 | setTitle(String) 设置HTML文件的标题。 缺省值是log4j日志消息。 |
HTMLLayout示例
以下是HTMLLayout的一个简单配置文件:
# 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}/htmlLayout.html # Define the layout for file appender log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout log4j.appender.FILE.layout.Title=HTML Layout Example log4j.appender.FILE.layout.LocationInfo=true |
现在考虑下面的Java例子,它将生成日志信息:
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 an debug message"); log.info("Hello this is an info message"); }} |
编译并运行上述程序。 它会在/ usr / home / log4j目录下创建一个htmlLayout.html文件,该文件将具有以下日志信息:
Log session start time Mon Mar 22 13:30:24 AST 2010
Time | Thread | Level | Category | File:Line | Message |
0 | main | DEBUG | log4jExample | log4jExample.java:15 | Hello this is an debug message |
6 | main | INFO | log4jExample | log4jExample.java:16 | Hello this is an info message |
您将使用Web浏览器打开htmlLayout.html文件。 同样重要的是要注意</ html>和</ body>标签的页脚完全缺失。
拥有HTML格式的日志文件的一大优势是它可以作为远程查看的网页发布。
PatternLayout
如果您想根据模式以特定格式生成日志记录信息,那么可以使用org.apache.log4j.PatternLayout格式化日志记录信息。
PatternLayout类扩展了抽象org.apache.log4j.Layout类,并根据提供的模式覆盖format()方法来构造日志记录信息。
PatternLayout也是一个简单的Layout对象,它提供了以下Bean属性,它可以使用配置文件来设置:
序号 | 属性及描述 |
1 | conversionPattern 设置转换模式。 默认值为%r [%t]%p%c%x - %m%n |
Pattern Conversion Characters
下表解释了上述模式中使用的字符以及您可以在自定义模式中使用的所有其他字符:
转换字符 | 含义 |
c | 用于输出记录事件的类别。 例如,对于类别名称“a.b.c”,模式%c {2}将输出“b.c”。 |
C | 用于输出发出日志记录请求的调用者的全限定类名。 例如,对于类名“org.apache.xyz.SomeClass”,模式%C {1}将输出“SomeClass”。 |
d | 用于输出日志记录事件的日期。 例如,%d {HH:mm:ss,SSS}或%d {dd MMM yyyy HH:mm:ss,SSS}。 |
F | 用于输出发出日志记录请求的文件名。 |
l | 用于输出生成记录事件的调用者的位置信息。 |
L | 用于输出发出日志记录请求的行号。 |
m | 用于输出与记录事件关联的应用程序提供的消息。 |
M | 用于输出发出日志记录请求的方法名称。 |
n | 输出平台相关的行分隔符字符。 |
p | 用于输出记录事件的优先级。 |
r | 用于输出构建布局所用的毫秒数,直到创建记录事件。 |
t | 用于输出生成记录事件的线程的名称。 |
x | 用于输出与生成记录事件的线程关联的NDC(嵌套诊断上下文)。 |
X | X转换字符后面跟着MDC的键。 例如,X {clientIP}将打印存储在MDC中的信息,并将其发送给关键的clientIP。 |
% | 字面上的百分号。 %%将打印一个%符号。 |
格式修饰符(Format Modifiers)
默认情况下,相关信息按原样显示为输出。 但是,借助格式修改器,可以更改最小字段宽度,最大字段宽度和对齐方式。
以下表格涵盖了各种修改器场景:
格式修饰符 | 左对齐 | 最小宽度 | 最大宽度 | 注释 |
%20c | false | 20 | none | 如果类别名称长度小于20个字符,则留有空格。 |
%-20c | true | 20 | none | 如果分类名称长度小于20个字符,请使用空格。 |
%.30c | NA | none | 30 | 如果类别名称长于30个字符,则从头开始截断。 |
%20.30c | false | 20 | 30 | 如果类别名称少于20个字符,请用空格填充空格。 但是,如果类别名称长于30个字符,则从头开始截断。 |
%-20.30c | true | 20 | 30 | 如果类别名称少于20个字符,则用空格填充空格。 但是,如果类别名称超过30个字符,则从头开始截断。 |
PatternLayout示例
以下是PatternLayout的一个简单配置文件:
# 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=%d{yyyy-MM-dd}-%t-%x-%-5p-%-10c:%m%n |
现在考虑下面的Java例子,它将生成日志信息:
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 an debug message"); log.info("Hello this is an info message"); } } |
编译并运行上述程序。 它会在/ usr / home / log4j目录下创建一个log.out文件,该文件将具有以下日志信息:
2010-03-23-main--DEBUG-log4jExample:Hello this is an debug message 2010-03-23-main--INFO -log4jExample:Hello this is an info message |