log4j自定义输出级别和输出信息

本文介绍如何在SSM框架下自定义log4j日志级别,包括在web.xml配置过滤器,实现Log4jFilter和CustomLogFilter,创建CustomLog类,以及在log4j.xml中配置输出,确保自定义级别CUSTOMLOG1能记录访问者的IP和属性attr。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相关文章链接:

SSM框架搭建Web项目

相关文章链接 第3节 日志配置

我们定义一个CUSTOMLOG1级别,自定义输出信息为访问者ip和属性attr。

1.在web.xml中添加一个过滤器

<!-- 日志过滤器 -->
  <filter>
    <filter-name>Log4jFilter</filter-name>
    <filter-class>cn.com.mydemo.interceptor.Log4jFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Log4jFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

2.过滤器Log4jFilter.java

package cn.com.mydemo.interceptor;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.log4j.MDC;

/**
 * @Description 日志过滤器
 * @author jjy
 * @create 2019-06-19
 */
public class Log4jFilter implements Filter{

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//获取访问者ip
		String ip = request.getRemoteAddr();
		//log4j通过访问MDC中存入的键值对获取自定义属性,写法为%X{ip}(ip为MDC放入的key)
		MDC.put("ip", ip);
		
		try {
			chain.doFilter(request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//清空MDC
		if(MDC.getContext() != null) {
			MDC.getContext().clear();
		}
	}
	
	@Override
	public void destroy() {
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}
}

3.自定义日志级别过滤器CustomLogFilter.java

package cn.com.mydemo.interceptor;

import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;

/**
 * @Decription 自定义日志级别过滤器
 * @author jjy
 * @create 2019-06-19
 */
public class CustomLogFilter extends Filter{

	boolean acceptOnMatch = false;
	private String levelMin;
	private String levelMax;
	
	public boolean isAcceptOnMatch() {
		return acceptOnMatch;
	}
	public void setAcceptOnMatch(boolean acceptOnMatch) {
		this.acceptOnMatch = acceptOnMatch;
	}
	public String getLevelMin() {
		return levelMin;
	}
	public void setLevelMin(String levelMin) {
		this.levelMin = levelMin;
	}
	public String getLevelMax() {
		return levelMax;
	}
	public void setLevelMax(String levelMax) {
		this.levelMax = levelMax;
	}
	@Override
	public int decide(LoggingEvent paramLoggingEvent) {
		int inputLevel = paramLoggingEvent.getLevel().toInt();
		if(inputLevel >= getLevel(levelMin) && inputLevel <= getLevel(levelMin)) {
			return 0;
		}
		
		return -1;
	}
	
	private int getLevel(String level) {
		level = level.toUpperCase();
		if(level.equals("CUSTOMLOG1")) {
			return LevelType.CUSTOMLOG1.getType();
		}
		if(level.equals("OFF")) {
			return LevelType.OFF.getType();
		}
		if(level.equals("FATAL")) {
			return LevelType.FATAL.getType();
		}
		if(level.equals("ERROR")) {
			return LevelType.ERROR.getType();
		}
		if(level.equals("INFO")) {
			return LevelType.INFO.getType();
		}
		if(level.equals("WARN")) {
			return LevelType.WARN.getType();
		}
		if(level.equals("DEBUG")) {
			return LevelType.DEBUG.getType();
		}
		if(level.equals("ALL")) {
			return LevelType.ALL.getType();
		}
		
		return LevelType.OFF.getType();
	}
	
	private static enum LevelType {
		OFF(2147483647),
		FATAL(50000),
		ERROR(40000),
		WARN(30000),
		INFO(20000),
		DEBUG(10000),
		ALL(-2147483648),
		
		CUSTOMLOG1(30050);
		
		int type;
		
		public int getType() {
			return type;
		}
		
		private LevelType(int type) {
			this.type = type;
		}
	}
}

4.自定义日志级别CustomLog.java

package cn.com.mydemo.interceptor;


import org.apache.log4j.Level;
import org.apache.log4j.net.SyslogAppender;

/**
 * @Decription 自定义日志级别
 * @author jjy
 * @create 2019-06-19
 */
package cn.com.infosec.ra.system.interceptor;


import org.apache.log4j.Level;
import org.apache.log4j.net.SyslogAppender;

public class CustomLog extends Level{
	
	private static final long serialVersionUID = 1L;

	private CustomLog(int level, String levelStr, int syslogEquivalent) {
		super(level, levelStr, syslogEquivalent);
	}
	
	//自定义级别名称,以及级别范围 
	public static final Level CUSTOMLOG1 = new CustomLog(30051, "CUSTOMLOG1", SyslogAppender.LOG_LOCAL0);
}

5.配置log4j.xml输出

我们将自定义级别单独输出一个文件,在log4j添加以下代码

<appender name="customlog1" class="org.apache.log4j.DailyRollingFileAppender">
    <!-- 文件文件全路径名 -->
    <param name="File" value="${catalina.base}/logs/mydemo/customlog1.log"/>
    <param name="Append" value="true"/>
    <!-- 设置日志备份频率,默认:为每天一个日志文件 -->
    <param name="DatePattern" value="yyyy-MM-dd"/>
    
    <layout class="org.apache.log4j.PatternLayout">
      <!-- <param name="ConversionPattern" value="[%p][%d{HH:mm:ss SSS}][%c]-[%m]%n"/> -->
      <param name="ConversionPattern" value="[%d{yyy-MM-dd HH:mm:ss,SSS}] [%c] [%M] [%L] [%X{attr}] - [%m] %n"/>
    </layout>
    <!-- 自定义日志级别过滤器 -->
    <filter class="cn.com.mydemo.interceptor.CustomLogFilter">
      <!-- 自定义日志输入级别范围 -->
      <param name="LevelMin" value="CUSTOMLOG1" />
      <param name="LevelMax" value="CUSTOMLOG1" />
    </filter>
  </appender>

在root节点中添加以下代码

<appender-ref ref="customlog1"/>

在这里插入图片描述

6.测试日志输出TestLogController.java

package cn.com.mydemo.controller;

import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.com.mydemo.interceptor.CustomLog;

@Controller
public class TestLogController {

	private static Logger logger = Logger.getLogger(TestLogController.class);
	
	@RequestMapping(value = "/testLog")
	public String testLog() {
		MDC.put("attr", "自定义属性");
		logger.log(CustomLog.CUSTOMLOG1, "自定义日志级别");
		
		return "login";
	}
}

7.测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值