3 Star 6 Fork 2

Jyokiyi / log4j2

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
log4j2-Layouts.md 41.37 KB
一键复制 编辑 原始数据 按行查看 历史
Jyokiyi 提交于 2017-06-19 23:26 . Signed-off-by:filter追加

Log4j2--Layouts

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 Layouts(CSV布局)

此布局创建逗号分隔值(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布局有两种方式:

  1. 使用CsvParameterLayout记录事件参数以创建自定义数据库,通常是为了此目的而唯一配置的记录器和文件追踪器。

  2. 使用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

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代码还是用上面的代码。

运行结果如下: HTMLLayout

JSONLayout

将一系列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.jarjackson-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"时会把生成的每一条记录放在``[]```之间,并且每条记录之间用逗号分隔。

更多信息就自己试验吧,多动手总会有收获。

PatternLayout

灵活的布局可配置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,则布局仍将打印最右侧的令牌。默认情况下,布局打印完整的记录器名称。
Conversion Pattern Logger Name 输出结果
%c{1} org.apache.commons.Foo Foo
%c{2} org.apache.commons.Foo commons.Foo
%c{10} org.apache.commons.Foo org.apache.commons.Foo
%c{-1} org.apache.commons.Foo apache.commons.Foo
%c{-2} org.apache.commons.Foo commons.Foo
%c{-10} org.apache.commons.Foo org.apache.commons.Foo
%c{1.} org.apache.commons.Foo o.a.c.Foo
%c{1.1.~.~} org.apache.commons.test.Foo o.a.~.~.Foo
%c{.} org.apache.commons.test.Foo ....Foo
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
Pattern 输出格式
%d{DEFAULT} 2012-11-02 14:34:02,781
%d{ISO8601} 2012-11-02T14:34:02,781
%d{ISO8601_BASIC} 20121102T143402,781
%d{ABSOLUTE} 14:34:02,781
%d{DATE} 02 Nov 2012 14:34:02,781
%d{COMPACT} 20121102143402781
%d{HH:mm:ss,SSS} 14:34:02,781
%d{dd MMM yyyy HH:mm:ss,SSS} 02 Nov 2012 14:34:02,781
%d{HH:mm:ss}{GMT+0} 18:34:02
%d{UNIX} 1351866842
%d{UNIX_MILLIS} 1351866842781
%d{UNIX}以秒为单位输出UNIX时间。%d{UNIX_MILLIS}以毫秒为单位输出UNIX时间。
enc{pattern}{[HTML|JSON]} encode{pattern}{[HTML|JSON]} 编码和转义适合特定标记语言输出的特殊字符。默认情况下,指定编码HTML。第二个选项用于指定应使用哪种编码格式。该转换器对于编码用户提供的数据特别有用,但是使输出数据不能正确地或安全地写入。

使用HTML编码格式,将替换以下字符:

Character Replacement
'\r', '\n' 分别转换为转义字符串"\\r"和"\\n"
&, , ", ', / 替换为相应的HTML实体
使用JSON编码格式,遵循RFC 4627第2.5节规定的转义规则 :
Character Replacement
U+0000 - U+001F \u0000 - \u001F
任何其他控制字符 编码到其\uABCD等效的转义代码点
" \"
\ \\
例如,可以使用模式{"message": "%enc{%m}{JSON}"}将包含日志消息的有效JSON文档作为字符串值输出。
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()来查找。
  1. %throwable{short}输出了Throwable的第一行。
  2. %throwable{short.className}输出发生异常的类的名称。
  3. %throwable{short.methodName}输出发生异常的方法名称。
  4. %throwable{short.fileName}输出发生异常的类的名称。
  5. %throwable{short.lineNumber}输出发生异常的行号。
  6. %throwable{short.message}输出消息。
  7. %throwable{short.localizedMessage}输出本地化的消息。
  8. %throwable{n} 输出堆栈跟踪的前n行。
  9. 指定 %throwable{none} 或 %throwable{0} 可以抑制异常的输出。
  10. 指定%throwable {suffix(pattern)}只有在有可打印的情况下才将输出的模式添加到输出。此选项与上述转换正交。
F file 输出发出日志记录请求的文件名。生成文件信息(位置信息)是一项昂贵的操作,可能会影响性能。谨慎使用。
highlight{pattern}{style} 根据当前事件的记录级别,将ANSI颜色添加到封闭模式的结果中。要想在eclipse的控制台输出颜色,需要安装AnsiConsole插件。Help>Eclipse Marketplace 输入console,查找选择【ANSI Escape Console】点击安装,安装完成后重启eclipse就OK了。
每个级别的默认颜色为:
Level ANSI color
FATAL Bright red
ERROR Bright red
WARN Yellow
INFO Green
DEBUG Cyan
TRACE Black (looks dark grey)
颜色名称是在org.apache.logging.log4j.core.pattern.AnsiEscape类中定义的ANSI名称 。
可以使用默认颜色: %highlight{%d [%t] %-5level: %msg%n%throwable}

也可以使用{style}选项重写默认的颜色。例如:
%highlight{%d [%t] %-5level: %msg%n%throwable}{FATAL=white, ERROR=red, WARN=blue, INFO=black, DEBUG=green, TRACE=blue}

我自己的测试用例:
%highlight{%d [%t] %-5level: %msg%n%throwable}{FATAL=white, ERROR=red, WARN=Yellow, INFO=black, DEBUG=green, TRACE=Magenta}

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”呈现为绿色:@|green Hello|@

以粗体和红色显示消息“Hello”:@|bold,red Warning!|@

可以在配置中使用语法定义自定义样式名称:
%message{ansi}{StyleName=value(,value)( StyleName=value(,value))*}%n
例如:%message{ansi}{WarningStyle=red,bold KeyStyle=white ValueStyle=blue}%n

你可以这样使用它: logger.info("@|KeyStyle {}|@ = @|ValueStyle {}|@", entry.getKey(), entry.getValue());

使用{nolookups}来记录消息,如"${date:YYYY-MM-dd}"而不使用任何查找。通常用实际中使用logger.info("Try ${date:YYYY-MM-dd}")替换${date:YYYY-MM-dd},使用nolookups 可以禁用此功能,并将消息字符串保持原样。

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 Name Description
Normal 正常显示
Bright 黑体
Dim 灰色字体
Underline 字体下带有下划线
Blink 闪烁的字符
Reverse 反向显示
Hidden 隐藏
Black或者FG_Black 将前景色设为黑色
Red或者FG_Red 将前景色设为红色
Green或者FG_Green 将前景色设为绿色
Yellow或者FG_Yellow 将前景色设为黄色
Blue或者FG_Blue 将前景色设为蓝色
Magenta或者FG_Magenta 将前景色设为品红色
Cyan or FG_Cyan 将前景色设为蓝绿色
White or FG_White 将前景色设为白色
Default or FG_Default 将前景色设为默认(默认是白色)
BG_Black 将前景色设为黑色
BG_Red 将前景色设为红色
BG_Green 将前景色设为绿色
BG_Yellow 将前景色设为黄色
BG_Blue 将前景色设为蓝色
BG_Magenta 将前景色设为品红色
BG_Cyan 将前景色设为蓝绿色
BG_White 将前景色设为白色
例如:
%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}将禁止打印异常。

  1. Prefix
  2. Name
  3. NameMessageSeparator
  4. Message
  5. At
  6. CauseLabel
  7. Text
  8. More
  9. Suppressed
  10. StackTraceElement.ClassName
  11. StackTraceElement.ClassMethodSeparator
  12. StackTraceElement.MethodName
  13. StackTraceElement.NativeMethod
  14. StackTraceElement.FileName
  15. StackTraceElement.LineNumber
  16. StackTraceElement.Container
  17. StackTraceElement.ContainerSeparator
  18. StackTraceElement.UnknownSource
  19. ExtraClassInfo.Inexact
  20. ExtraClassInfo.Container
  21. ExtraClassInfo.ContainerSeparator
  22. ExtraClassInfo.Location
  23. ExtraClassInfo.Version
    这些值是来自JAnsi的org.fusesource.jansi.AnsiRenderer.Code的名称, 如blue,bg_red等(Log4j忽略大小写)。 可以将StyleMapName 的特殊键设置为以下预定义的映射之一: Spock,Kirk。 与%throwable一样,%xEx {suffix(pattern))转换只有在有可打印的情况下,才会将输出的模式添加到输出 。
% %%输出一个百分号。

默认情况下,相关信息按原样输出。然而,借助于格式修改器,可以改变最小字段宽度,最大字段宽度和对齐。可选格式修饰符位于百分号和转换字符之间。

第一个可选的格式修饰符是 左对齐标志 ,它只是负字符(-)。

格式修饰符 左对齐 最小宽度 最大宽度 概述
%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个字符,则从尾部开始截断。

Windows上的ANSI样式

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

ANSI样式

日志级别将根据事件的日志级别高亮显示。所有跟着该级别的内容打印出来都将是绿色。

<PatternLayout>
	<pattern>%d %highlight{%p} %style{%C{1.} [%t] %m}{bold,green}%n</pattern>
</PatternLayout>

Pattern 选择器

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>
Java
1
https://gitee.com/Jyokiyi/log4j2.git
git@gitee.com:Jyokiyi/log4j2.git
Jyokiyi
log4j2
log4j2
master

搜索帮助