feat: 2.6.0
1. 修复工作流实时日志问题 !43 【轻量级 PR】:Logback、Log4j、Log4j2 打印异常堆栈信息 * fix: 2.6.0:
This commit is contained in:
parent
03306652b1
commit
7b38398a6e
@ -5,6 +5,7 @@ import com.aizuda.easy.retry.client.common.report.AsyncReportLog;
|
|||||||
import com.aizuda.easy.retry.client.common.util.ThreadLocalLogUtil;
|
import com.aizuda.easy.retry.client.common.util.ThreadLocalLogUtil;
|
||||||
import com.aizuda.easy.retry.common.core.constant.LogFieldConstant;
|
import com.aizuda.easy.retry.common.core.constant.LogFieldConstant;
|
||||||
import com.aizuda.easy.retry.common.core.context.SpringContext;
|
import com.aizuda.easy.retry.common.core.context.SpringContext;
|
||||||
|
import org.apache.log4j.MDC;
|
||||||
import org.apache.logging.log4j.core.Filter;
|
import org.apache.logging.log4j.core.Filter;
|
||||||
import org.apache.logging.log4j.core.Layout;
|
import org.apache.logging.log4j.core.Layout;
|
||||||
import org.apache.logging.log4j.core.LogEvent;
|
import org.apache.logging.log4j.core.LogEvent;
|
||||||
@ -15,7 +16,6 @@ import org.apache.logging.log4j.core.config.plugins.PluginElement;
|
|||||||
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
|
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
|
||||||
import org.apache.logging.log4j.core.util.Booleans;
|
import org.apache.logging.log4j.core.util.Booleans;
|
||||||
import org.apache.logging.log4j.core.util.Throwables;
|
import org.apache.logging.log4j.core.util.Throwables;
|
||||||
import org.slf4j.MDC;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
@ -11,7 +11,7 @@ import com.aizuda.easy.retry.client.common.report.AsyncReportLog;
|
|||||||
import com.aizuda.easy.retry.client.common.util.ThreadLocalLogUtil;
|
import com.aizuda.easy.retry.client.common.util.ThreadLocalLogUtil;
|
||||||
import com.aizuda.easy.retry.common.core.constant.LogFieldConstant;
|
import com.aizuda.easy.retry.common.core.constant.LogFieldConstant;
|
||||||
import com.aizuda.easy.retry.common.core.context.SpringContext;
|
import com.aizuda.easy.retry.common.core.context.SpringContext;
|
||||||
import org.apache.log4j.MDC;
|
import org.slf4j.MDC;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@ -31,9 +31,12 @@ public class EasyRetryLogbackAppender<E> extends UnsynchronizedAppenderBase<E> {
|
|||||||
protected void append(E eventObject) {
|
protected void append(E eventObject) {
|
||||||
|
|
||||||
// Not job context
|
// Not job context
|
||||||
if (!(eventObject instanceof LoggingEvent) || Objects.isNull(ThreadLocalLogUtil.getContext()) || Objects.isNull(MDC.get(LogFieldConstant.MDC_REMOTE))) {
|
if (!(eventObject instanceof LoggingEvent)
|
||||||
|
|| Objects.isNull(ThreadLocalLogUtil.getContext())
|
||||||
|
|| Objects.isNull(MDC.get(LogFieldConstant.MDC_REMOTE))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MDC.remove(LogFieldConstant.MDC_REMOTE);
|
MDC.remove(LogFieldConstant.MDC_REMOTE);
|
||||||
LogContentDTO logContentDTO = new LogContentDTO();
|
LogContentDTO logContentDTO = new LogContentDTO();
|
||||||
|
|
||||||
|
@ -181,4 +181,16 @@ public abstract class LogFactory {
|
|||||||
return (null != url) ? new JdkLogFactory() : new ConsoleLogFactory();
|
return (null != url) ? new JdkLogFactory() : new ConsoleLogFactory();
|
||||||
}
|
}
|
||||||
// ------------------------------------------------------------------------- Static end
|
// ------------------------------------------------------------------------- Static end
|
||||||
|
|
||||||
|
public static final Throwable extractThrowable(Object... arguments) {
|
||||||
|
if (arguments == null || arguments.length == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Object lastEntry = arguments[arguments.length - 1];
|
||||||
|
if (lastEntry instanceof Throwable) {
|
||||||
|
return (Throwable) lastEntry;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package com.aizuda.easy.retry.common.log.dialect.log4j;
|
package com.aizuda.easy.retry.common.log.dialect.log4j;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.aizuda.easy.retry.common.core.constant.LogFieldConstant;
|
||||||
import com.aizuda.easy.retry.common.log.AbstractLog;
|
import com.aizuda.easy.retry.common.log.AbstractLog;
|
||||||
|
import com.aizuda.easy.retry.common.log.LogFactory;
|
||||||
import org.apache.log4j.Level;
|
import org.apache.log4j.Level;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
import org.apache.log4j.MDC;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <a href="http://logging.apache.org/log4j/1.2/index.html">Apache Log4J</a> log.<br>
|
* <a href="http://logging.apache.org/log4j/1.2/index.html">Apache Log4J</a> log.<br>
|
||||||
@ -113,6 +116,12 @@ public class Log4jLog extends AbstractLog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (logger.isEnabledFor(log4jLevel)) {
|
if (logger.isEnabledFor(log4jLevel)) {
|
||||||
|
if (remote) {
|
||||||
|
MDC.put(LogFieldConstant.MDC_REMOTE, remote.toString());
|
||||||
|
}
|
||||||
|
if (t == null) {
|
||||||
|
t = LogFactory.extractThrowable(arguments);
|
||||||
|
}
|
||||||
logger.log(fqcn, log4jLevel, StrUtil.format(format, arguments), t);
|
logger.log(fqcn, log4jLevel, StrUtil.format(format, arguments), t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package com.aizuda.easy.retry.common.log.dialect.log4j2;
|
package com.aizuda.easy.retry.common.log.dialect.log4j2;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.aizuda.easy.retry.common.core.constant.LogFieldConstant;
|
||||||
import com.aizuda.easy.retry.common.log.AbstractLog;
|
import com.aizuda.easy.retry.common.log.AbstractLog;
|
||||||
|
import com.aizuda.easy.retry.common.log.LogFactory;
|
||||||
|
import org.apache.log4j.MDC;
|
||||||
import org.apache.logging.log4j.Level;
|
import org.apache.logging.log4j.Level;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
@ -113,7 +116,7 @@ public class Log4j2Log extends AbstractLog {
|
|||||||
default:
|
default:
|
||||||
throw new Error(StrUtil.format("Can not identify level: {}", level));
|
throw new Error(StrUtil.format("Can not identify level: {}", level));
|
||||||
}
|
}
|
||||||
logIfEnabled(fqcn, log4j2Level, t, format, arguments);
|
logIfEnabled(fqcn, log4j2Level, t, format, remote, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------- Private method
|
// ------------------------------------------------------------------------- Private method
|
||||||
@ -128,12 +131,20 @@ public class Log4j2Log extends AbstractLog {
|
|||||||
* @param msgTemplate 消息模板
|
* @param msgTemplate 消息模板
|
||||||
* @param arguments 参数
|
* @param arguments 参数
|
||||||
*/
|
*/
|
||||||
private void logIfEnabled(String fqcn, Level level, Throwable t, String msgTemplate, Object... arguments) {
|
private void logIfEnabled(String fqcn, Level level, Throwable t, String msgTemplate, Boolean remote, Object... arguments) {
|
||||||
if (this.logger.isEnabled(level)) {
|
if (this.logger.isEnabled(level)) {
|
||||||
|
|
||||||
|
if (remote) {
|
||||||
|
MDC.put(LogFieldConstant.MDC_REMOTE, remote.toString());
|
||||||
|
}
|
||||||
if (this.logger instanceof AbstractLogger) {
|
if (this.logger instanceof AbstractLogger) {
|
||||||
((AbstractLogger) this.logger).logIfEnabled(fqcn, level, null, StrUtil.format(msgTemplate, arguments), t);
|
((AbstractLogger) this.logger).logIfEnabled(fqcn, level, null, StrUtil.format(msgTemplate, arguments), t);
|
||||||
} else {
|
} else {
|
||||||
// FQCN无效
|
// FQCN无效
|
||||||
|
//this.logger.log(level, StrUtil.format(msgTemplate, arguments), t);
|
||||||
|
if (t == null) {
|
||||||
|
t = LogFactory.extractThrowable(arguments);
|
||||||
|
}
|
||||||
this.logger.log(level, StrUtil.format(msgTemplate, arguments), t);
|
this.logger.log(level, StrUtil.format(msgTemplate, arguments), t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,10 +56,15 @@ public class Slf4jLog extends AbstractLog {
|
|||||||
@Override
|
@Override
|
||||||
public void trace(String fqcn, Throwable t, String format, Boolean remote, Object... arguments) {
|
public void trace(String fqcn, Throwable t, String format, Boolean remote, Object... arguments) {
|
||||||
if (isTraceEnabled()) {
|
if (isTraceEnabled()) {
|
||||||
|
setContextMap(remote);
|
||||||
if (this.isLocationAwareLogger) {
|
if (this.isLocationAwareLogger) {
|
||||||
locationAwareLog((LocationAwareLogger) this.logger, fqcn, LocationAwareLogger.TRACE_INT, t, format, remote, arguments);
|
locationAwareLog((LocationAwareLogger) this.logger, fqcn, LocationAwareLogger.TRACE_INT, t, format, arguments);
|
||||||
} else {
|
} else {
|
||||||
logger.trace(StrUtil.format(format, arguments), t);
|
if (Objects.nonNull(t)) {
|
||||||
|
this.logger.trace(StrUtil.format(format, arguments), t);
|
||||||
|
} else {
|
||||||
|
this.logger.trace(format, arguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -73,10 +78,15 @@ public class Slf4jLog extends AbstractLog {
|
|||||||
@Override
|
@Override
|
||||||
public void debug(String fqcn, Throwable t, String format, Boolean remote, Object... arguments) {
|
public void debug(String fqcn, Throwable t, String format, Boolean remote, Object... arguments) {
|
||||||
if (isDebugEnabled()) {
|
if (isDebugEnabled()) {
|
||||||
|
setContextMap(remote);
|
||||||
if (this.isLocationAwareLogger) {
|
if (this.isLocationAwareLogger) {
|
||||||
locationAwareLog((LocationAwareLogger) this.logger, fqcn, LocationAwareLogger.DEBUG_INT, t, format, remote, arguments);
|
locationAwareLog((LocationAwareLogger) this.logger, fqcn, LocationAwareLogger.DEBUG_INT, t, format, arguments);
|
||||||
} else {
|
} else {
|
||||||
logger.debug(StrUtil.format(format, arguments), t);
|
if (Objects.nonNull(t)) {
|
||||||
|
this.logger.debug(StrUtil.format(format, arguments), t);
|
||||||
|
} else {
|
||||||
|
this.logger.debug(format, arguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,10 +100,15 @@ public class Slf4jLog extends AbstractLog {
|
|||||||
@Override
|
@Override
|
||||||
public void info(String fqcn, Throwable t, String format, Boolean remote, Object... arguments) {
|
public void info(String fqcn, Throwable t, String format, Boolean remote, Object... arguments) {
|
||||||
if (isInfoEnabled()) {
|
if (isInfoEnabled()) {
|
||||||
|
setContextMap(remote);
|
||||||
if (this.isLocationAwareLogger) {
|
if (this.isLocationAwareLogger) {
|
||||||
locationAwareLog((LocationAwareLogger) this.logger, fqcn, LocationAwareLogger.INFO_INT, t, format, remote, arguments);
|
locationAwareLog((LocationAwareLogger) this.logger, fqcn, LocationAwareLogger.INFO_INT, t, format, arguments);
|
||||||
} else {
|
} else {
|
||||||
logger.info(StrUtil.format(format, arguments), t);
|
if (Objects.nonNull(t)) {
|
||||||
|
this.logger.info(StrUtil.format(format, arguments), t);
|
||||||
|
} else {
|
||||||
|
this.logger.info(format, arguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -107,10 +122,15 @@ public class Slf4jLog extends AbstractLog {
|
|||||||
@Override
|
@Override
|
||||||
public void warn(String fqcn, Throwable t, String format, Boolean remote, Object... arguments) {
|
public void warn(String fqcn, Throwable t, String format, Boolean remote, Object... arguments) {
|
||||||
if (isWarnEnabled()) {
|
if (isWarnEnabled()) {
|
||||||
|
setContextMap(remote);
|
||||||
if (this.isLocationAwareLogger) {
|
if (this.isLocationAwareLogger) {
|
||||||
locationAwareLog((LocationAwareLogger) this.logger, fqcn, LocationAwareLogger.WARN_INT, t, format, remote, arguments);
|
locationAwareLog((LocationAwareLogger) this.logger, fqcn, LocationAwareLogger.WARN_INT, t, format, arguments);
|
||||||
} else {
|
} else {
|
||||||
logger.warn(StrUtil.format(format, arguments), t);
|
if (Objects.nonNull(t)) {
|
||||||
|
this.logger.warn(StrUtil.format(format, arguments), t);
|
||||||
|
} else {
|
||||||
|
this.logger.warn(format, arguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -124,15 +144,15 @@ public class Slf4jLog extends AbstractLog {
|
|||||||
@Override
|
@Override
|
||||||
public void error(String fqcn, Throwable t, String format, Boolean remote, Object... arguments) {
|
public void error(String fqcn, Throwable t, String format, Boolean remote, Object... arguments) {
|
||||||
if (isErrorEnabled()) {
|
if (isErrorEnabled()) {
|
||||||
|
setContextMap(remote);
|
||||||
if (this.isLocationAwareLogger) {
|
if (this.isLocationAwareLogger) {
|
||||||
locationAwareLog((LocationAwareLogger) this.logger, fqcn, LocationAwareLogger.ERROR_INT, t, format, remote, arguments);
|
locationAwareLog((LocationAwareLogger) this.logger, fqcn, LocationAwareLogger.ERROR_INT, t, format, arguments);
|
||||||
} else {
|
} else {
|
||||||
if (Objects.nonNull(t)) {
|
if (Objects.nonNull(t)) {
|
||||||
logger.error(format, t);
|
this.logger.error(StrUtil.format(format, arguments), t);
|
||||||
} else {
|
} else {
|
||||||
logger.error(format, arguments);
|
this.logger.error(format, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -176,14 +196,9 @@ public class Slf4jLog extends AbstractLog {
|
|||||||
* @param msgTemplate 消息模板
|
* @param msgTemplate 消息模板
|
||||||
* @param arguments 参数
|
* @param arguments 参数
|
||||||
*/
|
*/
|
||||||
private void locationAwareLog(LocationAwareLogger logger, String fqcn, int level_int, Throwable t, String msgTemplate, Boolean remote, Object[] arguments) {
|
private void locationAwareLog(LocationAwareLogger logger, String fqcn, int level_int, Throwable t, String msgTemplate, Object[] arguments) {
|
||||||
// ((LocationAwareLogger)this.logger).log(null, fqcn, level_int, msgTemplate, arguments, t);
|
// ((LocationAwareLogger)this.logger).log(null, fqcn, level_int, msgTemplate, arguments, t);
|
||||||
// 由于slf4j-log4j12中此方法的实现存在bug,故在此拼接参数
|
// 由于slf4j-log4j12中此方法的实现存在bug,故在此拼接参数
|
||||||
if (remote) {
|
|
||||||
Map<String, String> map = new LinkedHashMap<>();
|
|
||||||
map.put(LogFieldConstant.MDC_REMOTE, remote.toString());
|
|
||||||
MDC.getMDCAdapter().setContextMap(map);
|
|
||||||
}
|
|
||||||
logger.log(null, fqcn, level_int, msgTemplate, arguments, t);
|
logger.log(null, fqcn, level_int, msgTemplate, arguments, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,4 +211,17 @@ public class Slf4jLog extends AbstractLog {
|
|||||||
private static Logger getSlf4jLogger(Class<?> clazz) {
|
private static Logger getSlf4jLogger(Class<?> clazz) {
|
||||||
return (null == clazz) ? LoggerFactory.getLogger(StrUtil.EMPTY) : LoggerFactory.getLogger(clazz);
|
return (null == clazz) ? LoggerFactory.getLogger(StrUtil.EMPTY) : LoggerFactory.getLogger(clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置MDC上下文
|
||||||
|
*
|
||||||
|
* @param remote
|
||||||
|
*/
|
||||||
|
private void setContextMap(Boolean remote) {
|
||||||
|
if (remote) {
|
||||||
|
Map<String, String> map = new LinkedHashMap<>();
|
||||||
|
map.put(LogFieldConstant.MDC_REMOTE, remote.toString());
|
||||||
|
MDC.setContextMap(map);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,10 +22,7 @@ import com.google.common.collect.Lists;
|
|||||||
import org.slf4j.MDC;
|
import org.slf4j.MDC;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -52,7 +49,6 @@ public class EasyRetryServerLogbackAppender<E> extends UnsynchronizedAppenderBas
|
|||||||
LoggingEvent event = (LoggingEvent) eventObject;
|
LoggingEvent event = (LoggingEvent) eventObject;
|
||||||
|
|
||||||
LogContentDTO logContentDTO = new LogContentDTO();
|
LogContentDTO logContentDTO = new LogContentDTO();
|
||||||
logContentDTO.addTimeStamp(event.getTimeStamp());
|
|
||||||
logContentDTO.addLevelField(event.getLevel().levelStr);
|
logContentDTO.addLevelField(event.getLevel().levelStr);
|
||||||
logContentDTO.addThreadField(event.getThreadName());
|
logContentDTO.addThreadField(event.getThreadName());
|
||||||
logContentDTO.addLocationField(getLocationField(event));
|
logContentDTO.addLocationField(getLocationField(event));
|
||||||
@ -72,6 +68,7 @@ public class EasyRetryServerLogbackAppender<E> extends UnsynchronizedAppenderBas
|
|||||||
logMetaDTO = JsonUtil.parseObject(extractedData, LogMetaDTO.class);
|
logMetaDTO = JsonUtil.parseObject(extractedData, LogMetaDTO.class);
|
||||||
String message = event.getFormattedMessage().replaceFirst(patternString, StrUtil.EMPTY);
|
String message = event.getFormattedMessage().replaceFirst(patternString, StrUtil.EMPTY);
|
||||||
logContentDTO.addMessageField(message);
|
logContentDTO.addMessageField(message);
|
||||||
|
logContentDTO.addTimeStamp(Optional.ofNullable(logMetaDTO.getTimestamp()).orElse(event.getTimeStamp()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user