使用场景:为了跟踪老项目中多过程的大量数据流转请况,自定义生成需要的JSON格式日志,并通过kafka–ES(go实现类ELK方式,本文未展示)实现数据流转情况跟踪分析。
(本文展示的是处理过后的基本实现代码;水平有限,供交流分享,如有错误,还请指教,谢谢~~)
将此功能封装到了common公共模块,供其他功能模块调用
<dependency>
<groupId>project</groupId>
<artifactId>project-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
代码思路:
1=>自定义CustomLogFilter过滤器
2=>自定义CustomLevel日志级别
3=>自定义CustomLogAppender附加规则
4=>自定义RollingCalendar日志时间格式
5=>自定义CustomLog日志类实现类
6=>项目依赖端log输出
1.自定义CustomLogFilter过滤器
package com.common.filter;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;
/**
* <pre>
* 对象功能:自定义数据日志过滤器
* </pre>
*/
public class CustomLogFilter extends Filter {
boolean acceptOnMatch = false;
private String levelMin;
private String levelMax;
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;
}
public boolean isAcceptOnMatch() {
return acceptOnMatch;
}
public void setAcceptOnMatch(boolean acceptOnMatch) {
this.acceptOnMatch = acceptOnMatch;
}
@Override
public int decide(LoggingEvent lgEvent) {
int inputLevel = lgEvent.getLevel().toInt();
if (inputLevel >= getLevel(levelMin) && inputLevel <= getLevel(levelMax)) {
return 0;
}
return -1;
}
private int getLevel(String level) {
level = level.toUpperCase();
if (level.equals("DATADETAIL")) {
return LevelType.DATADETAIL.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),
CUSTOM(25000);
int type;
public int getType() {
return type;
}
private LevelType(int type) {
this.type = type;
}
}
}
2.自定义CustomLevel日志级别
package com.common.log;
import org.apache.log4j.Level;
import org.apache.log4j.net.SyslogAppender;
/**
* <pre>
* 对象功能:定义日志级别
* </pre>
*/
public interface CustomLevel{
/**
* 自定义级别名称,以及级别范围
*/
public static final Level CUSTOM= new CustomLog.CustomLogLevel(25000,"CUSTOM", SyslogAppender.LOG_LOCAL0);
}
3.自定义CustomLogAppender附加器
package com.common.log;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Priority;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import org.apache.log4j.Layout;
import org.apache.log4j.helpers.CountingQuietWriter;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.helpers.OptionConverter;
import org.apache.log4j.spi.LoggingEvent;
/**
* <pre>
* 对象功能:自定义Appender,复写DailyRollingFileAppender
* </pre>
*/
public class CustomLogAppender