Log4j PatternLayout
Log4j-PatternLayout
Log4j 提供 org.apache.log4j.PattrernLayout 类以基于模式以特定格式生成日志信息。
PatternLayout 扩展了抽象的 org.apache.log4j.Layout 类并覆盖了 format() 方法以根据提供的模式构造日志信息。
PatternLayout 也是一个简单的布局提供Bean属性的对象,即conversionPattern,可以使用配置文件设置:
conversionPattern: 该属性用于设置转换模式.默认为 %r [%t] %p %c %x-%m%n
模式转换字符
我们看下表描述使用的字符在转换模式和我们可以在自定义模式中使用的所有其他字符中:
转换字符 |
含义 |
c |
用于输出日志事件的类别。例如: 对于类别名称 x.y.z,模式 %c{2} 将输出 y.z. |
C |
用于输出发出日志请求的调用者的全限定类名。例如,对于类名"org.apache.abc.MyClass",模式 %C{1} 将输出"MyClass"。 |
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} 根据密钥 clientIP 打印存储在 MDC 中的信息。 |
% |
文字百分号。 %% 将打印一个 % 符号。 |
格式修饰符
默认情况下,相关信息显示为正常输出。但是,log4j 提供了格式修饰符;借助此功能,可以更改最大字段宽度、最小字段宽度和对齐方式。
让我们看看一些修饰符:
格式修饰符 |
左对齐 |
最小宽度 |
最大宽度 |
评论 |
%20c |
false |
20 |
无 |
如果类别名称少于 20 个字符,则左填充空格。 |
%-20c |
true |
20 |
无 |
如果类别名称少于 20 个字符,则在右侧填充空格。 |
%.30c |
NA |
无 |
30 |
如果类别名称超过 30 个字符,则从头截断。 |
%20.30c |
false |
20 |
30 |
如果类别名称少于 20 个字符,则左填充空格。但是,如果类别名称超过 30 个字符,则从头开始截断。 |
%-20.30c |
true |
20 |
30 |
如果类别名称少于 20 个字符,则右填充空格。但是,如果类别名称超过 30 个字符,则从头开始截断。 |
PatternLayout Example
我们来看一个Patternlayout的简单例子。
以下是PatternLayout的一个简单配置文件:
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=%d{yyyy-MM-dd}-%t-%x-%-5p-%-10c:%m%n
Log4jExample.java:
import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class Log4jExample {
/* Get actual name of the class 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");
}
}
当你编译并运行上面的程序时,你会在c:/usr/home/log4j目录下得到一个log.out文件,里面有如下日志信息:
输出:
2019-09-16-main--DEBUG-Log4jExample:Hello this is an debug message
2019-09-16-main--INFO-Log4jExample:Hello this is an info message