Appender使用Layout将LogEvent格式化为满足你需要的任何自定义日志事件的格式。在Log4j 1.x和Logback Layouts中,会将事件转换为String。而在Log4j 2中,Layouts返回一个字节数组。这允许Layout的结果在更多类型的Appender中是很有用的。然而,这意味着您需要使用Charset配置大多数Layouts,以确保字节数组包含正确的值。
用于Layout的根类使用的Charset是org.apache.logging.log4j.core.layout.AbstractStringLayout
,默认值为UTF-8。每个layout扩展AbstractStringLayout
可以自己的默认值。
Log4j 2.4.1中将自定义字符编码器添加到ISO-8859-1和US-ASCII字符集中,Java 8中的一些性能改进内置到Log4j以供Java 7使用。对于仅记录的应用程序中,指定ISO-8859-1字符集将显着提高性能。
此布局创建逗号分隔值(CSV) 记录,并需要Apache Commons CSV 1.4。最新的jar包,可以使用maven在这里下载jar仓库。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.4</version>
</dependency>
使用CSV布局有两种方式:
使用CsvParameterLayout
记录事件参数以创建自定义数据库,通常是为了此目的而唯一配置的记录器和文件追踪器。
使用CsvLogEventLayout
来记录事件以创建数据库,作为使用完整DBMS或使用支持CSV格式的JDBC驱动程序的替代方法。CsvParameterLayout
将事件的参数转换成CSV记录,并忽略信息。记录CSV记录,可以使用通常的Logger方法info(),debug()等等:
logger.info("Ignored", value1, value2, value3);
生成的CSV记录如下:
value1, value2, value3
或者,你可以使用一个ObjectArrayMessage
,只携带参数:
logger.info(new ObjectArrayMessage(value1, value2, value3));
给个示例:
log4j2.xml的文件位置放在src
文件夹下,log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<File name="csvlog" fileName="target/test.csv" append="true">
<CsvParameterLayout format="Default" delimiter=","
quoteMode="ALL" nullString="测试" escape="\" quote="'" recordSeparator=";"
charset="utf-8" header="表头" footer="表尾"/>
</File>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="csvlog"/>
</Root>
</Loggers>
</Configuration>
Java代码:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Configurator;
public class MyApp {
private static Logger logger = null;
static{
String config=System.getProperty("user.dir");//获取程序的当前路径
ConfigurationSource source = null;
try {
source = new ConfigurationSource(new FileInputStream(config+"\\src\\log4j2.xml"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Configurator.initialize(null, source);
logger = LogManager.getLogger(MyApp.class.getName());
}
public static void main(String[] args) {
logger.info("Ignored", "123", "456", "789", null);
logger.info("Ignored2", "IT测试", "上线", "生产", null);
logger.debug("one={}, two={}, three={}", 1, 2, 3);
logger.info(new ObjectArrayMessage("\b", "80", "90"));
logger.info(new ObjectArrayMessage("\\b", "80", "90"));
}
}
测试结果:
'123','456','789',测试;'IT测试','上线','生产',测试;'1','2','3';'','80','90';'\b','80','90';表尾
转义字符设定和不设定,结果都是一样的,还没搞懂,希望自动的朋友可以给予帮助。表头也没出来,也不知道什么原因。
CsvParameterLayout 和 CsvLogEventLayout的配置参数: format -- CSVFormat.Predefined。
Parameter Name | Type | Description |
format | String | 预定义格式:Default, Excel, MySQL, RFC4180, TDF. |
delimiter | Character | 格式的分隔符。 |
escape | Character | 格式的转义字符 |
quote | Character | 格式的引用字符 |
quoteMode | String | 格式的输出引用策略,其中之一:ALL, MINIMAL, NON_NUMERIC, NONE。 |
nullString | String | 在写入记录时将null作为给定的nullString写入。 |
recordSeparator | String | 将格式的记录分隔符设置为指定的String。 |
charset | Charset | 输出指定字符集。如utf-8 |
header | 设置当流打开时包括的标题。 | 说明。 |
footer | 设置当流关闭时要包括的页脚。 | 说明。 |
HTMLLayout生成一个HTML页面,并将每个LogEvent添加到表中的一行。
HTML Layout Parameters:
Parameter Name | Type | Description |
charset | String | 将HTML字符串转换为字节数组时使用的字符集。该值必须是一个有效的字符集。如果未指定,则此布局使用UTF-8。 |
contentType | String | 要分配给Content-Type头的值。默认值为“text / html”。 |
locationInfo | boolean | 如果为true,文件名和行号将包含在HTML输出中。默认值为false。生成[位置信息](http://logging.apache.org/log4j/2.x/manual/layouts.html#LocationInformation) 是一项昂贵的操作,可能会影响性能。谨慎使用。 |
title | String | 将显示为HTML标题的字符串 |
如果其中一个布局配置了与位置相关的属性,例如HTMLLayout的locationInfo
属性。或者以下pattern
之一:%C or %class, %F or %file, %l or %location, %L or %line, %M or %method
,Log4j将获取堆栈的快照,并走栈堆栈以查找位置信息。
这是一个昂贵的操作,对于同步记录器要慢1.3-5左右,同步记录器在进行堆栈快照之前等待尽可能长的时间。如果不需要位置,则不会拍摄快照。 对于异步记录器,采集堆栈跟踪快照的性能影响更大:使用位置记录比没有位置慢30-100倍。因此,异步记录器和异步追踪器默认情况下不包含位置信息。
您可以通过指定includeLocation="true"
来覆盖记录器或异步appender配置中的默认行为 。
log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<File name="htmlLog" fileName="target/logHTML.html">
<HTMLLayout contentType="text/html" locationInfo="true" title="html测试"/>
</File>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="htmlLog"/>
</Root>
</Loggers>
</Configuration>
Java代码还是用上面的代码。
运行结果如下:
将一系列JSON事件作为串行化为字节的字符串。此布局需要Jackson jar文件(有关详细信息,请参阅pom.xml)。 所依赖的jar包:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.7</version>
</dependency>
在使用jackson-databind-2.8.7.jar
时会自动依赖jackson-core-2.8.7.jar
和jackson-annotations-2.8.0.jar
,但是你需要手动依赖jackson-annotations-2.8.7.jar
,同时去除2.8.0的依赖,不然会有冲突。
完成格式良好的JSON与片段JSON
如果配置complete =“true”,则appender会输出格式正确的JSON文档。默认情况下,使用complete =“false”,应将输出作为外部文件包含在单独的文件中,以形成一个格式正确的JSON文档。
JSONLayout Parameters:
Parameter Name | Type | Description |
charset | String | 转换为字节数组时使用的字符集。该值必须是一个有效的字符集。如果没有指定,将使用UTF-8。 |
compact | boolean | 如果为true,则appender不使用行尾和缩进。默认为false。 |
eventEol | boolean | 如果为true,则Appender在每个记录之后追加行尾。默认为false。与eventEol = true和compact = true一起使用以获得每行一条记录。 |
complete | boolean | 如果为true,则appender 包括JSON页眉和页脚,以及记录之间的逗号。默认false。 |
properties | boolean | 如果为true,则appender会包含在生成的JSON中线程上下文映射。默认为false。 |
propertiesAsList | boolean | 如果为true,则将线程上下文映射作为映射条目对象的列表,其中每个条目具有“key”属性(其值为关键字)和“value”属性(其值为值)。默认为false,在这种情况下,线程上下文映射包含为键值对的简单映射。 |
locationInfo | boolean | 如果为true,则appender会在生成的JSON中包含位置信息。默认为false。生成位置信息 是一项昂贵的操作,可能会影响性能。谨慎使用。 |
includeStacktrace | boolean | 如果为true,则包括任何记录的Throwable的完整堆栈 跟踪 (可选,默认为true)。 |
log4j2.xml文档:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<JsonLayout compact="true" eventEol="true" complete="true"/>
</Console>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Java代码:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.message.ObjectArrayMessage;
public class MyApp {
private static Logger logger = null;
static{
String config=System.getProperty("user.dir");//获取程序的当前路径
ConfigurationSource source = null;
try {
source = new ConfigurationSource(new FileInputStream(config+"\\src\\log4j2.xml"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Configurator.initialize(null, source);
logger = LogManager.getLogger(MyApp.class.getName());
}
public static void main(String[] args) {
logger.info("Ignored2", "IT测试", "上线", "生产", null);
logger.debug("one={}, two={}, three={}", 1, 2, 3);
logger.info(new ObjectArrayMessage("\b", "80", "90"));
logger.info(new ObjectArrayMessage("\\b", "80", "90"));
}
}
在complete="true"
时运行结果:
[
{"timeMillis":1497100758694,"thread":"main","level":"INFO","loggerName":"com.my.test.MyApp","message":"Ignored2","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","threadId":1,"threadPriority":5}
, {"timeMillis":1497100758768,"thread":"main","level":"DEBUG","loggerName":"com.my.test.MyApp","message":"one=1, two=2, three=3","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","threadId":1,"threadPriority":5}
, {"timeMillis":1497100758769,"thread":"main","level":"INFO","loggerName":"com.my.test.MyApp","message":"[\b, 80, 90]","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","threadId":1,"threadPriority":5}
, {"timeMillis":1497100758769,"thread":"main","level":"INFO","loggerName":"com.my.test.MyApp","message":"[\\b, 80, 90]","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","threadId":1,"threadPriority":5}
]
在complete="false"
时运行结果:
{"timeMillis":1497100821141,"thread":"main","level":"INFO","loggerName":"com.my.test.MyApp","message":"Ignored2","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","threadId":1,"threadPriority":5}
{"timeMillis":1497100821215,"thread":"main","level":"DEBUG","loggerName":"com.my.test.MyApp","message":"one=1, two=2, three=3","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","threadId":1,"threadPriority":5}
{"timeMillis":1497100821215,"thread":"main","level":"INFO","loggerName":"com.my.test.MyApp","message":"[\b, 80, 90]","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","threadId":1,"threadPriority":5}
{"timeMillis":1497100821215,"thread":"main","level":"INFO","loggerName":"com.my.test.MyApp","message":"[\\b, 80, 90]","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger","threadId":1,"threadPriority":5}
使用complete="true"
时会把生成的每一条记录放在``[和
]```之间,并且每条记录之间用逗号分隔。
更多信息就自己试验吧,多动手总会有收获。
灵活的布局可配置pattern字符串。此类的目标是格式化LogEvent并返回结果。结果的格式取决于转换pattern。
转换模式由文字文本和格式控制表达式组成,称为转换说明符。
注意,任何字面文字(包括特殊字符)都可能包含在转换pattern中。特殊字符包括\t, \n, \r, \f.。使用\将一个反斜杠插入输出。
每个转换说明符以百分号(%)开始,后面是可选的格式修饰符和转换字符。转换字符指定数据的类型,例如类别,优先级,日期,线程名称。格式修饰符控制诸如字段宽度,填充,左右对齐的内容(width, padding, left and right justification)。看下面的简单例子:
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%-5p [%t]: %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Java代码:
logger.info("Ignored2", "IT测试", "上线", "生产", null);
logger.debug("one={}, two={}, three={}", 1, 2, 3);
输出结果:
INFO [main]: Ignored2
DEBUG [main]: one=1, two=2, three=3
请注意,文本和转换说明符之间没有明确的分隔符。模式解析器知道在读取转换字符时到达转换说明符的末尾。在上面的示例中,转换说明符%-5p表示记录事件的优先级应该保持对齐为五个字符的宽度。
如果模式字符串不包含用于处理正在记录的Throwable的说明符,那么该模式的解析将会像"%xEx"说明符添加到字符串末尾一样。要抑制Throwable的格式化,只需在模式字符串中添加"%ex{0}"
作为说明符。
PatternLayout Parameters:
Parameter Name | Type | Description |
charset | String | 将syslog字符串转换为字节数组时使用的字符集。字符串必须是有效的字符集。如果未指定,则此布局使用平台默认字符集。 |
pattern | String | 下表中的一个或多个转换模式的复合模式字符串。不能使用PatternSelector指定。 |
patternSelector | PatternSelector | 分析LogEvent中的信息并确定应使用哪种模式来格式化事件的组件。pattern和patternSelector参数是互斥的。 |
replace | RegexReplacement | 允许替换生成的字符串的部分。如果已配置,则replace元素必须指定要匹配的正则表达式和替换。这执行类似于RegexReplacement转换器的功能,但适用于整个消息,而转换器仅适用于其模式生成的字符串。 |
alwaysWriteExceptions | boolean | 如果为true(默认情况下),即使模式不包含异常转换,也会始终写入异常。这意味着如果您不包括在模式中输出异常的方法,默认的异常格式化程序将被添加到模式的末尾。将此设置为 false将禁用此行为,并允许您从模式输出中排除异常。 |
header | String | 包含在每个日志文件顶部的可选标题字符串。 |
footer | String | 包含在每个日志文件底部的可选脚注字符串。 |
disableAnsi | boolean | 如果为true(默认为false),则不输出ANSI转义码。 |
noConsoleNoAnsi | boolean | 如果为true(默认值为false),并且System.console()为null,则不输出ANSI转义码。 |
RegexReplacement Parameters:
Parameter Name | Type | Description |
regex | String | 一个符合Java规范的正则表达式,以在结果字符串中进行匹配。见 [模式](http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html) 。 |
replacement | String | 用以替换任何匹配的子字符串的字符串。 |
Patterns:Log4j提供的转换,如下表:
Conversion Pattern | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||
c{precision} logger{precision} | 输出发布日志记录事件的记录器的名称。记录器转换说明符可以可选地跟随精度说明符,其由十进制整数或以十进制整数开头的模式组成。当精度说明符为整数值时,会减小记录器名称的大小。如果数字为正,布局将打印相应数量的最右边的记录器名称组件。如果为负,布局将删除相应数量的最左边的记录器名称组件。如果精度包含任何非整数字符,则布局将根据模式缩写名称。如果精度整数小于1,则布局仍将打印最右侧的令牌。默认情况下,布局打印完整的记录器名称。
|
||||||||||||||||||||||||||||||||||||||||||||||||||
C{precision} class{precision} | 输出发出日志记录请求的呼叫者的完全限定类名。这种转换说明可任选地接着精度说明,和记录器名称转换器相同的规则。生成调用者的类名(位置信息)是一项昂贵的操作,可能会影响性能。谨慎使用。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
d {pattern} date {pattern} | 输出日志事件的日期。日期转换说明符后面可以使用```{}```包含一组[SimpleDateFormat](http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html)的日期和时间模式字符串,可以使用多个{} 。
预设定的值:```DEFAULT, ABSOLUTE, COMPACT, DATE, ISO8601, 和 ISO8601_BASIC。
还可以用```{}```包含一组[java.util.TimeZone.getTimeZone](http://docs.oracle.com/javase/6/docs/api/java/util/TimeZone.html#getTimeZone(java.lang.String))的时区ID
|
||||||||||||||||||||||||||||||||||||||||||||||||||
enc{pattern}{[HTML|JSON]} encode{pattern}{[HTML|JSON]} | 编码和转义适合特定标记语言输出的特殊字符。默认情况下,指定编码HTML。第二个选项用于指定应使用哪种编码格式。该转换器对于编码用户提供的数据特别有用,但是使输出数据不能正确地或安全地写入。
使用HTML编码格式,将替换以下字符:
|
||||||||||||||||||||||||||||||||||||||||||||||||||
equals{pattern}{test}{substitution} equalsIgnoreCase{pattern}{test}{substitution} | 替换'test'(一个字符串)的出现,并在由模式评估得到的字符串中替换'substitute'。例如,"%equals{[%marker]}{[]}{}" 将不带标记的空字符串替换“[]”字符串。该模式可以是任意复杂的,特别是可以包含多个转换关键字。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
ex|exception|throwable {["none" |"full" |depth |"short" |"short.className" |"short.fileName" |"short.lineNumber" |"short.methodName" |"short.message" |"short.localizedMessage"]} {suffix(pattern)} | 输出绑定到LoggingEvent的Throwable跟踪,默认情况下将输出完整的跟踪,通常可以通过调用Throwable.printStackTrace()来查找。
|
||||||||||||||||||||||||||||||||||||||||||||||||||
F file | 输出发出日志记录请求的文件名。生成文件信息(位置信息)是一项昂贵的操作,可能会影响性能。谨慎使用。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
highlight{pattern}{style} | 根据当前事件的记录级别,将ANSI颜色添加到封闭模式的结果中。要想在eclipse的控制台输出颜色,需要安装AnsiConsole插件。Help>Eclipse Marketplace 输入console,查找选择【ANSI Escape Console】点击安装,安装完成后重启eclipse就OK了。
每个级别的默认颜色为:
可以使用默认颜色: %highlight{%d [%t] %-5level: %msg%n%throwable} 也可以使用{style}选项重写默认的颜色。例如: |
||||||||||||||||||||||||||||||||||||||||||||||||||
K{key} map{key} MAP{key} | 输出org.apache.logging.log4j.message.MapMessage中的条目(如果存在于事件中)。所述K转换字符之后可以对地图置于{}之间,例如:%K{clientNumber}其中clientNumber是关键。将输出与该键对应的Map中的值。如果没有指定附加子选项,则使用格式{{key1,val1},{key2,val2}}输出Map键值对集合的全部内容。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
l location | 输出生成日志事件的调用者的位置信息。生成位置信息 是一项昂贵的操作,可能会影响性能。谨慎使用。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
L line | 输出发出日志记录请求的行号。生成行号信息(位置信息)是一项昂贵的操作,可能会影响性能。谨慎使用。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
m{nolookups}{ansi} msg{nolookups}{ansi} message{nolookups}{ansi} | 输出与日志记录事件相关联的应用程序提供的消息。添加{ansi}以使用ANSI转义代码生成渲染(需要JAnsi) 嵌入式ANSI代码的默认语法是: @|code(,code)* text|@ 例如,要将消息“Hello”呈现为绿色: |
||||||||||||||||||||||||||||||||||||||||||||||||||
M method | 输出发出日志记录请求的方法名称。生成调用者的方法名称(位置信息)是一项昂贵的操作,可能会影响性能。谨慎使用。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
marker | 标记的全名,包括父标记,如果有的话。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
markerSimpleName | 标记的简单名称(不包括父标记),如果存在。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
maxLen maxLength | 输出评估模式的结果并截断结果。如果长度大于20,则输出将包含尾部省略号。如果提供的长度无效,则使用默认值100。%maxLen{%p: %c{1} - %m%notEmpty{ =>%ex{short}}}{160} 限制为160个字符,尾随省略号。%maxLen{%m}{20} :限制在20个字符,没有尾随省略号。
|
||||||||||||||||||||||||||||||||||||||||||||||||||
n | 输出平台相关的行分隔符字符或字符。此转换字符提供与使用诸如 "\n", 或者"\r\n". 之类的非便携式行分隔符字符串几乎相同的性能。因此,它是指定行分隔符的首选方式。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
N nano | 在创建日志事件时输出System.nanoTime() 的结果。 |
||||||||||||||||||||||||||||||||||||||||||||||||||
variablesNotEmpty{pattern} varsNotEmpty{pattern} notEmpty{pattern} | 当且仅当模式中的所有变量都不为空时,输出评估模式的结果。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
p|level{level=label, level=label, ...} p|level{length=n} p|level{lowerCase=true|false} | 输出日志记录事件的级别。以"level=value, level=value"的形式提供级别名称映射,其中level是“级别”的名称,值是应显示的值,而不是“级别”的名称。 例如: %level{WARN=Warning, DEBUG=Debug, ERROR=Error, TRACE=Trace, INFO=Info} 简洁的方式: %level{WARN=W, DEBUG=D, ERROR=E, TRACE=T, INFO=I} 更简洁的方式: %level{length=1} 如果指定的长度大于level的名称长度,则就使用正常的level名称。你也可以结合2个选择项使用: %level{ERROR=Error, length=2} 指定Error level名称,其他level的名称长度指定为2。 最后你可以输出小写的level名称(默认是大写的): %level{lowerCase=true}
|
||||||||||||||||||||||||||||||||||||||||||||||||||
r relative | 输出从JVM启动到创建日志记录事件之前经过的毫秒数。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
replace{pattern}{regex}{substitution} | 替换正则表达式是"regex",并且由"substitution"来替换掉。 例如: "%replace{%msg}{\s}{}" 会替换掉事件消息中的所有空格。pattern是可以任意复杂的,特别是可以包含多个转换关键字。 例如: "%replace{%logger %msg}{\.}{/}" 可以将日志记录和事件消息中所有的. 替换为/ 。 |
||||||||||||||||||||||||||||||||||||||||||||||||||
rEx{["none"|"short"|"full"|depth]}{[filters(packages)]}{suffix(pattern)} rException{["none"|"short"|"full"|depth]}{[filters(packages)]}{suffix(pattern)} rThrowable{["none"|"short"|"full"|depth]}{[filters(packages)]}{suffix(pattern)} | 与%throwable转换字相同,但是堆栈跟踪是从引发的第一个异常开始打印的,后面是每个后续的包装异常。可抛出的转换字后面可以是%rEx {short}形式的选项, 只能输出Throwable或%rEx {n}的第一行,其中打印栈跟踪的前n行。转换单词还可以后跟“filters(packages)”,其中packages是应从堆栈跟踪中抑制的包名称列表。指定%rEx {none} 或%rEx {0}将禁止打印异常。
与%可转换转换一样,使用rEx {suffix(pattern)将只有在有可打印的情况下,才会将输出的模式添加到输出。 |
||||||||||||||||||||||||||||||||||||||||||||||||||
sn sequenceNumber | 包括在每个事件中递增的序列号。计数器是一个静态变量,所以在共享同一个转换器Class对象的应用程序中只能是唯一的。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
style{pattern}{ANSI style} | 使用ANSI转义序列来设计封闭图案的结果。样式可以由下表中的逗号分隔的样式名称列表组成。
%style{%d{ISO8601}}{black} %style{[%t]}{blue} %style{%-5level:}{yellow} %style{%msg%n%throwable}{green} 可以联合style使用: %d %highlight{%p} %style{%logger}{bright,cyan} %C{1.} %msg%n 你也可以将一种颜色和 % 一起使用,例如:%black , %blue , %cyan %black{%d{ISO8601}} %blue{[%t]} %yellow{%-5level:} %green{%msg%n%throwable}
|
||||||||||||||||||||||||||||||||||||||||||||||||||
T tid threadId | 产生logging event的线程的ID | ||||||||||||||||||||||||||||||||||||||||||||||||||
t tn thread threadName | 产生logging event的线程的名称 | ||||||||||||||||||||||||||||||||||||||||||||||||||
tp threadPriority | 产生logging event的线程的优先级 | ||||||||||||||||||||||||||||||||||||||||||||||||||
x NDC | 与产生logging event的线程相关的线程上下文栈 | ||||||||||||||||||||||||||||||||||||||||||||||||||
X{key[,key2...]} mdc{key[,key2...]} MDC{key[,key2...]} | 输出与生成日志事件的线程相关联的线程上下文映射(也称为映射的诊断上下文或MDC)。X 转换字符之后可以在括号{}之间跟来自map的一个或多个key,如 %X{clientNumber} 其中 clientNumber是key。将输出对应于该key的MDC中的值。 如果提供了一个键列表,例如%X{name, number},则ThreadContext中存在的每个键将使用格式 {name=val1, number=val2}输出。key/value将按照它们在列表中显示的顺序打印。 如果没有指定子选项,则使用格式{key1=val1, key2=val2}输出MDC密钥值对集合的全部内容。键/值对将按排序顺序打印。 有关 更多详细信息,请参阅org.apache.logging.log4j.ThreadContext类。 |
||||||||||||||||||||||||||||||||||||||||||||||||||
u{"RANDOM" | "TIME"} uuid | 包括随机或基于时间的UUID。基于时间的UUID是可以每毫秒生成多达10,000个唯一ID的类型UUID,将使用每个主机的MAC地址,并尝试确保跨同一主机上的多个JVM和/或ClassLoaders的唯一性随机数在0和16,384之间将与UUID生成器类的每个实例相关联,并包含在生成的每个基于时间的UUID中。由于基于时间的UUID包含MAC地址和时间戳,所以应谨慎使用,因为它们可能会导致安全漏洞。 | ||||||||||||||||||||||||||||||||||||||||||||||||||
xEx|xException|xThrowable { ["none"|"short"|"full"|depth] [,filters(package,package,...)] } {ansi( Key=Value,Value,... Key=Value,Value,... ...) } {suffix(pattern)} | 与%可转换字相同,但也包括类包装信息。 在异常的每个堆栈元素的末尾,将添加一个包含类或类所在目录的jar文件的名称的字符串,并且将添加在该jar的清单中找到的“实现版本”。如果信息不确定,那么类包装数据前面会有一个波浪号,即'〜'字符。 可抛出的转换字后面可以是%xEx {short}形式的选项, 只能输出Throwable或%xEx {n}的第一行,其中打印栈跟踪的前n行。转换单词还可以后跟“filters(packages)”,其中packages是应该从堆栈跟踪中抑制的包名称的逗号分隔的列表。指定%xEx {none} 或%xEx {0}将禁止打印异常。
|
||||||||||||||||||||||||||||||||||||||||||||||||||
% | %%输出一个百分号。 |
默认情况下,相关信息按原样输出。然而,借助于格式修改器,可以改变最小字段宽度,最大字段宽度和对齐。可选格式修饰符位于百分号和转换字符之间。
第一个可选的格式修饰符是 左对齐标志 ,它只是负字符(-)。
格式修饰符 | 左对齐 | 最小宽度 | 最大宽度 | 概述 |
%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个字符,则从头开始截断。 |
%-20.-30c | true | 20 | 30 | 如果类别名称长度小于20个字符,右侧空格补齐。如果类别名称超过30个字符,则从尾部开始截断。 |
ANSI转义序列本身在许多平台上支持,但在Windows上不是默认的。要启用ANSI支持,只需将Jansi jar 添加到应用程序中,Log4j将在写入控制台时自动使用它。
依赖管理,它不依赖任何jar:
<dependency>
<groupId>org.fusesource.jansi</groupId>
<artifactId>jansi</artifactId>
<version>1.16</version>
</dependency>
示例:从堆栈跟踪中过滤掉不重要的package:
<properties>
<property name="filters">org.junit,org.apache.maven,sun.reflect,java.lang.reflect</property>
</properties>
...
<PatternLayout pattern="%m%xEx{filters(${filters})}%n"/>
打印到控制台的结果将显示为:
Exception java.lang.IllegalArgumentException: IllegalArgument
at org.apache.logging.log4j.core.pattern.ExtendedThrowableTest.testException(ExtendedThrowableTest.java:72) [test-classes/:?]
... suppressed 26 lines
at $Proxy0.invoke(Unknown Source)} [?:?]
... suppressed 3 lines
Caused by: java.lang.NullPointerException: null pointer
at org.apache.logging.log4j.core.pattern.ExtendedThrowableTest.testException(ExtendedThrowableTest.java:71) ~[test-classes/:?]
... 30 more
日志级别将根据事件的日志级别高亮显示。所有跟着该级别的内容打印出来都将是绿色。
<PatternLayout>
<pattern>%d %highlight{%p} %style{%C{1.} [%t] %m}{bold,green}%n</pattern>
</PatternLayout>
PatternLayout可以配置一个PatternSelector,以允许它根据日志事件的属性或其他因素选择要使用的模式。通常,PatternSelector将配置一个defaultPattern属性,当其他条件不匹配时使用该属性,以及一组用于标识可以选择的各种模式的PatternMatch元素。
MarkerPatternSelector选择器
MarkerPatternSelector根据日志事件中包含的标记来选择模式。如果日志事件中的标记等于或是PatternMatch键属性上指定的名称的祖先,则将使用该PatternMatch元素上指定的模式。
<PatternLayout>
<MarkerPatternSelector defaultPattern="[%-5level] %c{1.} %msg%n">
<PatternMatch key="FLOW" pattern="[%-5level] %c{1.} ====== %C{1.}.%M:%L %msg ======%n"/>
</MarkerPatternSelector>
</PatternLayout>
ScriptPatternSelector选择器
ScriptPatternSelector将在“配置”章节的“ 脚本”部分中执行脚本。该脚本通过配置的“属性”部分中配置的所有属性,“替代”vairables中的Confguration使用的StrSubstitutor以及“logEvent”变量中的日志事件,并且预期将返回PatternMatch的值应该使用的键,如果应该使用默认模式,则为null。
<PatternLayout>
<ScriptPatternSelector defaultPattern="[%-5level] %c{1.} %C{1.}.%M.%L %msg%n">
<Script name="BeanShellSelector" language="bsh"><![CDATA[
if (logEvent.getLoggerName().equals("NoLocation")) {
return "NoLocation";
} else if (logEvent.getMarker() != null && logEvent.getMarker().isInstanceOf("FLOW")) {
return "Flow";
} else {
return null;
}]]>
</Script>
<PatternMatch key="NoLocation" pattern="[%-5level] %c{1.} %msg%n"/>
<PatternMatch key="Flow" pattern="[%-5level] %c{1.} ====== %C{1.}.%M:%L %msg ======%n"/>
</ScriptPatternSelector>
</PatternLayout>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。