log4j2配置详解、自定义规则

目录

1、配置详解

2、自定义规则-Appender插件

2.1、maven配置

2.2、plugin编写

2.3、log4j2-spring.xml

2.4、代码

3、自定义规则-PatternLayout 插件


1、配置详解

配置详解上:https://www.cnblogs.com/sa-dan/p/6837225.html

配置详解下:https://www.cnblogs.com/sa-dan/p/6837232.html

2、自定义规则-Appender插件

Pattern Layout详细:

2.1、maven配置

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>    

----------------------------------------------------------------

    <!-- 使用 log4j2 的适配器进行绑定 -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
      <version>2.9.1</version>
    </dependency>
    <!-- log4j2 日志门面 -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.11.1</version>
    </dependency>
    <!-- log4j2 日志实面 -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.11.1</version>
    </dependency>

2.2、plugin编写

@Plugin(name = "FileAppender", category = "Core", elementType = "appender", printObject = true)
public class FileAppender extends AbstractAppender {
  private String fileName;

  /* 构造函数 */
  public FileAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, String fileName) {
    super(name, filter, layout, ignoreExceptions);
    this.fileName = fileName;
  }

  @Override
  public void append(LogEvent event) {
    final byte[] bytes = getLayout().toByteArray(event);
    writerFile(bytes);

  }

  /*  接收配置文件中的参数 */
  @PluginFactory
  public static FileAppender createAppender(@PluginAttribute("name") String name,
      @PluginAttribute("fileName") String fileName,
      @PluginElement("Filter") final Filter filter,
      @PluginElement("Layout") Layout<? extends Serializable> layout,
      @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) {
    if (name == null) {
      LOGGER.error("no name defined in conf.");
      return null;
    }
    if (layout == null) {
      layout = PatternLayout.createDefaultLayout();
    }
    // 创建文件
    if (!createFile(fileName)) {
      return null;
    }
    return new FileAppender(name, filter, layout, ignoreExceptions, fileName);
  }

  private static boolean createFile(String fileName) {
    Path filePath = Paths.get(fileName);
    try {
      // 每次都重新写文件,不追加
      if (Files.exists(filePath)) {
        Files.delete(filePath);
      }
      Files.createFile(filePath);
    } catch (IOException e) {
      LOGGER.error("create file exception", e);
      return false;
    }
    return true;
  }

  private void writerFile(byte[] log) {
    try {
      Files.write(Paths.get(fileName), log, StandardOpenOption.APPEND);
    } catch (IOException e) {
      LOGGER.error("write file exception", e);
    }
  }
}

2.3、log4j2-spring.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration status="warn" monitorInterval="5">
  <properties>
    <property name="LOG_HOME">D:/logggs</property>
  </properties>

  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" />
    </Console>

    <File name="file" fileName="${LOG_HOME}/myfile.log">
      <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
    </File>

    <RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log">
      <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
    </RandomAccessFile>

    <!-- 这个就是自定义的Appender -->
    <FileAppender name="cusAppender" fileName="${LOG_HOME}/cusAppender.log">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%-5p] {%F:%L} - %m%n" />
    </FileAppender>
  </Appenders>

  <Loggers>
    <Root level="trace">
      <AppenderRef ref="Console" />
      <AppenderRef ref="accessFile" />
      <AppenderRef ref="cusAppender" />
    </Root>
  </Loggers>
</configuration>

2.4、代码

@RestController
@Slf4j
public class TestController {

 @RequestMapping("/test2")
  public String hello2() {
    // 日志消息输出
    log.error("asddddddddddddddddddddddddd");
    return "hello2";
  }

}

3、自定义规则-PatternLayout 插件

@Plugin(name = "Log4jMaskPatternLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public class Log4jMaskPatternLayout extends AbstractStringLayout {


	private PatternLayout patternLayout;

	protected Log4jMaskPatternLayout(Charset charset, String pattern) {
		super(charset);
		patternLayout = PatternLayout.newBuilder().withPattern(pattern).build();
	
	}

	/**
	 * 创建插件
	 */
	@PluginFactory
	public static Layout createLayout(@PluginAttribute(value = "pattern") final String pattern,
			@PluginAttribute(value = "charset") final Charset charset) {

		return new Log4jMaskPatternLayout(charset, pattern);
	}

	@Override
	public String toSerializable(LogEvent event) {
		String str = patternLayout.toSerializable(event);
		str = // ...脱敏
		return str;
	}

}

log4j2-spring.xml


    <RandomAccessFile name="accessFile"
			fileName="${LOG_HOME}/myAcclog.log">
			<Log4jMaskPatternLayout
				pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
		</RandomAccessFile>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值