log4j
文档: https://www.yiibai.com/log4j/
Log4j教程
log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布。
Log4j中有三个主要组成部分:
-
loggers: 负责捕获记录信息。
-
appenders : 负责发布日志信息,以不同的首选目的地。
-
layouts: 负责格式化不同风格的日志信息。
Appenders:
Apache的log4j提供Appender对象主要负责打印日志消息到不同的目的地,如控制台,文件,sockets,NT事件日志等等。
每个Appender对象具有与之相关联的不同的属性,并且这些属性表明对象的行为
属性 | 描述 |
---|---|
layout | Appender使用布局Layout 对象和与之相关的格式化的日志记录信息转换模式 |
target | 目标可以是一个控制台,一个文件,或根据附加器的另一个项目 |
level | 级别是必需的,以控制日志消息的过滤 |
threshold | Appender可以有与之独立的记录器级别相关联的级别阈值水平。Appender忽略具有级别低于阈级别的任何日志消息 |
filter | Filter 对象可以分析超出级别的匹配记录信息,并决定是否记录的请求应该由一个特定 Appender 或忽略处理 |
Logger类提供了多种方法来处理日志活动。 Logger类不允许实例化一个新的记录器实例,但它提供了两个静态方法获得一个 Logger 对象:
-
public static Logger getRootLogger();
-
public static Logger getLogger(String name);
Logging 方法:
我们得到了一个名为记录器的实例之后,可以使用记录的几种方法来记录消息。 Logger类有专门用于打印日志信息下面的方法如下。
SN | 方法及描述 |
---|---|
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类提供以下级别,但也可以通过Level类的子类自定义级别。
Level | 描述 |
---|---|
ALL | 各级包括自定义级别 |
DEBUG | 指定细粒度信息事件是最有用的应用程序调试 |
ERROR | 错误事件可能仍然允许应用程序继续运行 |
FATAL | 指定非常严重的错误事件,这可能导致应用程序中止 |
INFO | 指定能够突出在粗粒度级别的应用程序运行情况的信息的消息 |
OFF | 这是最高等级,为了关闭日志记录 |
TRACE | 指定细粒度比DEBUG更低的信息事件 |
WARN | 指定具有潜在危害的情况 |
日志级别是如何工作?
级别p的级别使用q,在记录日志请求时,如果p>=q启用。这条规则是log4j的核心。它假设级别是有序的。对于标准级别它们关系如下:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
布局类型:
在层次结构中的顶级类是抽象类是org.apache.log4j.Layout。这是 log4j 的 API 中的所有其他布局类的基类。
布局类定义为抽象在应用程序中,不要直接使用这个类; 相反,使用它的子类来工作,如下:
-
DateLayout
-
SimpleLayout
-
XMLLayout
布局方法:
这个类提供了一个框架实现在所有其它布局对象的所有常见的操作,并声明了两个抽象方法。
S.N. | 方法 & 描述 |
---|---|
1 | public abstract boolean ignoresThrowable() 这种方法表示日志信息是否处理传递给它的日志记录事件的一部分,任何 java.lang.Throwable 对象。如果布局对象处理 Throwable 对象,那么布局对象不忽视它,并返回false。 |
2 | public abstract String format(LoggingEvent event) 独特的布局子类将实施这一方法的布局特定的格式 |
除了这些抽象方法,布局类提供具体的实现下列方法:
S.N. | 方法 & 描述 |
---|---|
1 | public String getContentType() 返回使用的布局的对象的内容类型。基类将返回 text/plain 作为默认的内容类型 |
2 | public String getFooter() 指定日志消息的页脚信息 |
3 | public String getHeader() 指定日志消息的标头信息 |
如果想生成基于模式的特定格式的日志信息,那么可以使用 org.apache.log4j.PatternLayout 格式化日志信息。
PatternLayout类扩展抽象 org.apache.log4j.Layout 类并覆盖format()方法根据提供的模式构建日志信息。
PatternLayout也是一个简单的布局对象,它提供下列Bean属性,可以通过配置文件进行设置:
S.N. | 属性和说明 |
---|---|
1 | conversionPattern 设置转换模式。默认为 %r [%t] %p %c %x - %m%n |
模式转换字符:
下表说明了以上模式使用的字符和所有其他字符,可以在自定义模式中使用:
转换字符 | 表示的意思 |
---|---|
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 modifier | left justify | minimum width | maximum width | 注释 |
---|---|---|---|---|
%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
要写日志信息到一个文件中,必须使用org.apache.log4j.FileAppender。有以下FileAppender的配置参数:
FileAppender配置:
属性 | 描述 |
---|---|
immediateFlush | 标志的默认设置为true,这意味着输出流的文件被刷新,在每个追加操作 |
encoding | 它可以使用任何字符编码。默认情况下是特定于平台的编码方案 |
threshold | 这个 appender 阈值级别 |
Filename | 日志文件的名称 |
fileAppend | 默认设置为true,这意味着记录的信息被附加到同一文件的末尾 |
bufferedIO | 此标志表示是否需要写入缓存启用。默认设置为false |
bufferSize | 如果 bufferedI/O 启用,这表示缓冲区的大小,默认设置为8KB |
下面是一个示例配置文件 log4j.properties 的 FileAppender。
# 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 API提供 org.apache.log4j.jdbc.JDBCAppender 对象,它能够将日志信息在指定的数据库。
JDBCAppender 配置:
Property | 描述 |
---|---|
bufferSize | 设置缓冲区的大小。默认大小为1 |
driver | 设置驱动程序类为指定的字符串。如果没有指定驱动程序类,默认为sun.jdbc.odbc.JdbcOdbcDriver |
layout | 设置要使用的布局。默认布局是org.apache.log4j.PatternLayout |
password | Sets the database password. |
sql | 指定SQL语句在每次记录事件发生的时间执行。这可能是INSERT,UPDATE或DELETE |
URL | 设置JDBC URL |
user | 设置数据库用户名 |
日志表配置:
开始使用基于JDBC日志,要创建在哪里保存日志信息的表。下面是创建日志表的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 );
配置文件示例:
以下是将用于将消息记录到一个日志表中的示例配置文件 log4j.properties的JDBCAppender
# 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和在其中创建的日志表的数据库密码。SQL语句是使用日志表名和输入值到表,需要执行INSERT语句。
JDBCAppender不需要明确定义的布局。相反,使用PatternLayout 传递给它 SQL语句