首先收藏一下log4j2的官网:http://logging.apache.org/log4j/2.x/manual/plugins.html#TypeConverters
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
import org.apache.logging.log4j.core.pattern.PatternConverter;
* Created by hotusm 2017/2/16.
@Plugin(name =
, StringBuilder toAppendTo) {
toAppendTo.append(Math.random());
定义一个类继承
LogEventPatternConverter
1.定义的这个类必须提供一个
newInstance方法,参数是
final String[] options,返回值
为定义的类(对于是否是单例没有明确的要求)
2.提供一个私有的构造函数,调用父类的构造函数,函数需要提供两个参数 第一个参数是转换器的名称,第二个是css样式,
3.还有主要的工作
format,这里有两个参数,
LogEvent是系统已经存在的一些可选数据,
StringBuilder 表示的是最终的输出字符流。一般都是将自定义的
append进去
4.注解:Plugin 表示的是这是一个插件,name是名称,category为
PatternConverter.CATEGORY(目前插件只有这个选择)
ConverterKeys表示的就是自定义的参数,可以多个
定义好了之后,然后在log4j2的配置文件中设置
<configuration status="WARN" packages="com.hotusm.ticket.interceptor">
打印格式:
<Property name="patternStyle">lodId:%-10y %d{HH:mm:ss.SSS}
最后就ok了。下面是输出:
以上是log4j2的配置,使用log4j可以
继承patternLayout和patternParser,自定义一个patternConverter实现。如下:
public class ExtPatternLayout extends PatternLayout {
public ExtPatternLayout(String pattern) {
super(pattern);
System.out.println("pattern is null ???:" + pattern);
public ExtPatternLayout() {
super(DEFAULT_CONVERSION_PATTERN);
@Override
protected PatternParser createPatternParser(String pattern) {
System.out.println("pattern is null ???:" + pattern);
return new ExtPatternParser(pattern == null ? DEFAULT_CONVERSION_PATTERN: pattern);
pattern解析器:
public class ExtPatternParser extends PatternParser {
public static final ThreadLocal<Map<String, Object>> TH_LOCAL = new ThreadLocal<Map<String, Object>>(){
@Override
protected HashMap<String, Object> initialValue() {
return new HashMap<String, Object>();
public static void setCurrentValue(String key, Object value) {
Map<String, Object> map = TH_LOCAL.get();
map.put(key, value);
public ExtPatternParser(String pattern) {
super(pattern);
@Override
protected void finalizeConverter(char c) {
if (c == '#') {
String option = super.extractOption();
addConverter(new ExtPatternConverter(this.formattingInfo,option));
currentLiteral.setLength(0);
} else {
super.finalizeConverter(c);
pattern转换器:
public class ExtPatternConverter extends PatternConverter {
private String cfg;
@Autowired
public ExtPatternConverter(FormattingInfo fi, String cfg) {
super(fi);
this.cfg = cfg;
@Override
protected String convert(LoggingEvent event) {
System.out.println("start char convert");
Map<String, Object> valueMap = ExtPatternParser.TH_LOCAL.get();
if (valueMap != null) {
Object value = valueMap.get(cfg);
if (value != null) {
return String.valueOf(value);
return "notExist";
通过配置Layout打印格式化的日志,
Log4j2支持很多的Layouts:
CSV GELF HTML JSON Pattern Serialized Syslog XML YAML
本文仅介绍Pattern Layouts的详细使用。
本文基于Log4j2基本使用入门。
请先参考上面的基本使用入门。
2.Pattern Layouts
Pattern Layou...
最近用到一个项目,需要在一个类中,将日志区分打印到不同的日志文件中
比如同一个地方打印两条日志“receive message from port[123]”,"receive message from port[456]"
这两条日志的内容一样的,只不过里面的参数port不一样。
在这里,我们使用gradle工程来实现,总体目录如下
工程的gradle.build...
在log4j中可以指定特定的输出源append。在数据库记录日志时,可以将日志文件记录到多个数据库表中。
[code="java"]# This is the configuring for logging displayed in the Application Server
log4j.rootCategory=DEBUG,logfile,stdout
log4j.logger.S...
c category的名称,可使用{n}限制输出的精度。例如:logger名为"a.b.c",%c{2}将输出"b.c"。
C 产生log事件的java完全限定类名。可使用{n}限制输出的精度。例如:“org.apache.xyz.SomeClass”,%C{2}将输出“SomeClass”。
d 时间和日期的输出格式,例如:%d{yyyy MM dd HH:mm:ss,SS},可不带后...
首先声明本文并不教您怎么用log4j2,仅仅只对子节点进行说明。
要看懂本文需要对log4j2有一定的了解,至少能够知道、和的区别。
本文主要参考对象为log4j2官方手册:《Apache Log4j 2 v. 2.1 User's Guide》,但是鉴于官方手册的不少细节描述得并不是非常清楚,甚至还有错误,所以还希望大家自己多试验,毕竟如果官方文档有错误或写得不清楚,我也没办法。
在某种情况下,我们需要在不影响原有代码的基础上自定义log4j的输出格式。例如这样的需求,硬性规定了项目的日志格式为: 日期 日志等级 ClassName:line - [版本号] [请求ip地址] [项目应用名称] [服务接口模块] [模块方法] [业务参数1] [业务参数2] [业务参数3] 日志详细内容(必须为json格式)示例:2018-05-10 14:04:50,972 INFO V...
http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html 参数说明例子%c列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间log4j配置文件参数举例输出显示媒介假设当前logger名字空间是"a.b.c"%ca.b.c%c{2}b.c%20c(若...
1. 关于Log4j2(为什么要使用Log4j2)
Log4j和Log4j2是什么?
Log4j(Log for java)是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件等。同时,我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
Log4j2是Log4j的作者重新架构的一款日志组件,他抛弃了之前Log4j的
package cn.java.log4j2.demo.plugin.fooone;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.lo...
1、pom.xml文件中添加log4j2依赖,并排除掉spring默认的日志依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>
本节介绍Log4j的输出格式的详细说明1、PatternLayout参数charset ##指定字符集
pattern ##指定格式
alwaysWriteExceptions ##默认为true,输出异常
header ##可选项。包含在每个日志文件的顶部
footer ##可选项。包含在每个日志文件的尾部。2、pattern属性参数格式描述######### 常见参数 #########