You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2021/02/20 05:13:24 UTC
[skywalking] 01/01: Enhance gRPC log appender to allow layout
pattern
This is an automated email from the ASF dual-hosted git repository.
kezhenxu94 pushed a commit to branch enhance/log
in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit b905c26077b8db4acc15c7b997bbe9cc190aa2a0
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Sat Feb 20 13:13:02 2021 +0800
Enhance gRPC log appender to allow layout pattern
---
CHANGES.md | 1 +
.../log/log4j/v1/x/log/GRPCLogClientAppender.java | 11 +++++-
.../log/log4j/v2/x/log/GRPCLogClientAppender.java | 41 +++++++++++++++++-----
.../logback/v1/x/log/GRPCLogClientAppender.java | 17 ++++++---
.../log4j/v1/x/log/GRPCLogAppenderInterceptor.java | 19 ++++++----
.../log4j/v2/x/log/GRPCLogAppenderInterceptor.java | 15 +++++---
.../v1/x/log/GRPCLogAppenderActivation.java | 2 +-
.../v1/x/log/GRPCLogAppenderInterceptor.java | 26 +++++---------
8 files changed, 89 insertions(+), 43 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index ce8c9fa..b499bd8 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -11,6 +11,7 @@ Release Notes.
* Remove invalid mysql configuration in agent.config.
* Add net.bytebuddy.agent.builder.AgentBuilder.RedefinitionStrategy.Listener to show detail message when redefine errors occur.
* Fix ClassCastException of log4j gRPC reporter.
+* Enhance gRPC log appender to allow layout pattern.
#### OAP-Backend
* Allow user-defined `JAVA_OPTS` in the startup script.
diff --git a/apm-application-toolkit/apm-toolkit-log4j-1.x/src/main/java/org/apache/skywalking/apm/toolkit/log/log4j/v1/x/log/GRPCLogClientAppender.java b/apm-application-toolkit/apm-toolkit-log4j-1.x/src/main/java/org/apache/skywalking/apm/toolkit/log/log4j/v1/x/log/GRPCLogClientAppender.java
index 4c95b4d..8c99df4 100644
--- a/apm-application-toolkit/apm-toolkit-log4j-1.x/src/main/java/org/apache/skywalking/apm/toolkit/log/log4j/v1/x/log/GRPCLogClientAppender.java
+++ b/apm-application-toolkit/apm-toolkit-log4j-1.x/src/main/java/org/apache/skywalking/apm/toolkit/log/log4j/v1/x/log/GRPCLogClientAppender.java
@@ -19,9 +19,18 @@
package org.apache.skywalking.apm.toolkit.log.log4j.v1.x.log;
import org.apache.log4j.AppenderSkeleton;
+import org.apache.log4j.Layout;
import org.apache.log4j.spi.LoggingEvent;
public class GRPCLogClientAppender extends AppenderSkeleton {
+
+ public GRPCLogClientAppender() {
+ }
+
+ public GRPCLogClientAppender(Layout layout) {
+ this.setLayout(layout);
+ }
+
@Override
protected void append(LoggingEvent loggingEvent) {
@@ -34,6 +43,6 @@ public class GRPCLogClientAppender extends AppenderSkeleton {
@Override
public boolean requiresLayout() {
- return false;
+ return true;
}
}
diff --git a/apm-application-toolkit/apm-toolkit-log4j-2.x/src/main/java/org/apache/skywalking/apm/toolkit/log/log4j/v2/x/log/GRPCLogClientAppender.java b/apm-application-toolkit/apm-toolkit-log4j-2.x/src/main/java/org/apache/skywalking/apm/toolkit/log/log4j/v2/x/log/GRPCLogClientAppender.java
index 9a09576..ebe543e 100644
--- a/apm-application-toolkit/apm-toolkit-log4j-2.x/src/main/java/org/apache/skywalking/apm/toolkit/log/log4j/v2/x/log/GRPCLogClientAppender.java
+++ b/apm-application-toolkit/apm-toolkit-log4j-2.x/src/main/java/org/apache/skywalking/apm/toolkit/log/log4j/v2/x/log/GRPCLogClientAppender.java
@@ -18,9 +18,14 @@
package org.apache.skywalking.apm.toolkit.log.log4j.v2.x.log;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Serializable;
import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender;
+import org.apache.logging.log4j.core.appender.OutputStreamManager;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
@@ -29,25 +34,45 @@ import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@Plugin(name = "GRPCLogClientAppender", category = "Core", elementType = "appender")
-public class GRPCLogClientAppender extends AbstractAppender {
+public class GRPCLogClientAppender extends AbstractOutputStreamAppender<OutputStreamManager> {
+ private static final OutputStream DISCARDED_STREAM = new OutputStream() {
+ @Override
+ public void write(final int b) throws IOException {
+ // discarded
+ }
+ };
- private GRPCLogClientAppender(final String name, final Filter filter, final boolean ignoreExceptions) {
- super(name, filter, null, ignoreExceptions);
+ protected GRPCLogClientAppender(final String name,
+ final Layout<? extends Serializable> layout,
+ final Filter filter,
+ final boolean ignoreExceptions) {
+ super(
+ name,
+ layout,
+ filter,
+ ignoreExceptions,
+ true,
+ getManager0(layout)
+ );
}
@Override
- public void append(LogEvent logEvent) {
-
+ public void append(final LogEvent event) {
}
@PluginFactory
public static GRPCLogClientAppender createAppender(@PluginAttribute("name") final String name,
+ @PluginElement("Layout") final Layout<? extends Serializable> layout,
@PluginElement("Filter") final Filter filter,
@PluginConfiguration final Configuration config,
@PluginAttribute("ignoreExceptions") final String ignore) {
-
String appenderName = name == null ? "gRPCLogClientAppender" : name;
final boolean ignoreExceptions = "true".equalsIgnoreCase(ignore) || !"false".equalsIgnoreCase(ignore);
- return new GRPCLogClientAppender(appenderName, filter, ignoreExceptions);
+ return new GRPCLogClientAppender(appenderName, layout, filter, ignoreExceptions);
+ }
+
+ private static OutputStreamManager getManager0(final Layout<? extends Serializable> layout) {
+ return OutputStreamManager.getManager("Discard", new Object(), (s, o) -> new OutputStreamManager(DISCARDED_STREAM, "Discard", layout, false) {
+ });
}
}
diff --git a/apm-application-toolkit/apm-toolkit-logback-1.x/src/main/java/org/apache/skywalking/apm/toolkit/log/logback/v1/x/log/GRPCLogClientAppender.java b/apm-application-toolkit/apm-toolkit-logback-1.x/src/main/java/org/apache/skywalking/apm/toolkit/log/logback/v1/x/log/GRPCLogClientAppender.java
index b12689f..9b5ffdd 100644
--- a/apm-application-toolkit/apm-toolkit-logback-1.x/src/main/java/org/apache/skywalking/apm/toolkit/log/logback/v1/x/log/GRPCLogClientAppender.java
+++ b/apm-application-toolkit/apm-toolkit-logback-1.x/src/main/java/org/apache/skywalking/apm/toolkit/log/logback/v1/x/log/GRPCLogClientAppender.java
@@ -18,12 +18,21 @@
package org.apache.skywalking.apm.toolkit.log.logback.v1.x.log;
-import ch.qos.logback.core.AppenderBase;
+import ch.qos.logback.core.OutputStreamAppender;
+import java.io.IOException;
+import java.io.OutputStream;
-public class GRPCLogClientAppender<E> extends AppenderBase<E> {
+public class GRPCLogClientAppender<E> extends OutputStreamAppender<E> {
+ public GRPCLogClientAppender() {
+ setOutputStream(new OutputStream() {
+ @Override
+ public void write(final int b) throws IOException {
+ // discarded
+ }
+ });
+ }
@Override
- protected void append(E eventObject) {
+ protected void subAppend(final E event) {
}
-
}
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/log4j/v1/x/log/GRPCLogAppenderInterceptor.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/log4j/v1/x/log/GRPCLogAppenderInterceptor.java
index 98c555c..21508ae 100644
--- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/log4j/v1/x/log/GRPCLogAppenderInterceptor.java
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/log4j/v1/x/log/GRPCLogAppenderInterceptor.java
@@ -20,7 +20,8 @@ package org.apache.skywalking.apm.toolkit.activation.log.log4j.v1.x.log;
import java.lang.reflect.Method;
import java.util.Objects;
-
+import org.apache.log4j.AppenderSkeleton;
+import org.apache.log4j.spi.LoggingEvent;
import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.context.ContextManager;
@@ -35,7 +36,6 @@ import org.apache.skywalking.apm.network.logging.v3.LogDataBody;
import org.apache.skywalking.apm.network.logging.v3.LogTags;
import org.apache.skywalking.apm.network.logging.v3.TextLog;
import org.apache.skywalking.apm.network.logging.v3.TraceContext;
-import org.apache.log4j.spi.LoggingEvent;
public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundInterceptor {
@@ -52,7 +52,7 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
}
LoggingEvent event = (LoggingEvent) allArguments[0];
if (Objects.nonNull(event)) {
- client.produce(transform(event));
+ client.produce(transform((AppenderSkeleton) objInst, event));
}
}
@@ -71,10 +71,12 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
/**
* transforms {@link LoggingEvent} to {@link LogData}
*
+ *
+ * @param appender the real {@link AppenderSkeleton appender}
* @param event {@link LoggingEvent}
* @return {@link LogData} with filtered trace context in order to reduce the cost on the network
*/
- private LogData transform(LoggingEvent event) {
+ private LogData transform(final AppenderSkeleton appender, LoggingEvent event) {
LogData.Builder builder = LogData.newBuilder()
.setTimestamp(event.getTimeStamp())
.setService(Config.Agent.SERVICE_NAME)
@@ -93,7 +95,7 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
.setKey("thread").setValue(event.getThreadName()).build())
.build())
.setBody(LogDataBody.newBuilder().setType(LogDataBody.ContentCase.TEXT.name())
- .setText(TextLog.newBuilder().setText(transformLogText(event)).build()).build());
+ .setText(TextLog.newBuilder().setText(transformLogText(appender, event)).build()).build());
return -1 == ContextManager.getSpanId() ? builder.build()
: builder.setTraceContext(TraceContext.newBuilder()
.setTraceId(ContextManager.getGlobalTraceId())
@@ -102,8 +104,11 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
.build()).build();
}
- private String transformLogText(final LoggingEvent event) {
- final String throwableString = Objects.isNull(event.getThrowableInformation()) ? "" :
+ private String transformLogText(final AppenderSkeleton appender, final LoggingEvent event) {
+ if (appender.getLayout() != null) {
+ return appender.getLayout().format(event);
+ }
+ final String throwableString = Objects.isNull(event.getThrowableInformation()) ? "" :
ThrowableTransformer.INSTANCE.convert2String(event.getThrowableInformation().getThrowable(), 2048);
return event.getMessage() + "\n" + throwableString;
}
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/log4j/v2/x/log/GRPCLogAppenderInterceptor.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/log4j/v2/x/log/GRPCLogAppenderInterceptor.java
index f9df92c..9b7bbdf 100644
--- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/log4j/v2/x/log/GRPCLogAppenderInterceptor.java
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/log4j/v2/x/log/GRPCLogAppenderInterceptor.java
@@ -21,8 +21,8 @@ package org.apache.skywalking.apm.toolkit.activation.log.log4j.v2.x.log;
import java.lang.reflect.Method;
import java.util.Objects;
import java.util.Optional;
-
import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.context.ContextManager;
@@ -54,7 +54,7 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
}
LogEvent event = (LogEvent) allArguments[0];
if (Objects.nonNull(event)) {
- client.produce(transform(event));
+ client.produce(transform((AbstractAppender) objInst, event));
}
}
@@ -73,10 +73,12 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
/**
* transforms {@link LogEvent} to {@link LogData}
*
+ *
+ * @param appender the real {@link AbstractAppender appender}
* @param event {@link LogEvent}
* @return {@link LogData} with filtered trace context in order to reduce the cost on the network
*/
- private LogData transform(LogEvent event) {
+ private LogData transform(final AbstractAppender appender, LogEvent event) {
LogTags.Builder logTags = LogTags.newBuilder()
.addData(KeyStringValuePair.newBuilder()
.setKey("level").setValue(event.getLevel().toString()).build())
@@ -105,7 +107,7 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
.setServiceInstance(Config.Agent.INSTANCE_NAME)
.setTags(logTags.build())
.setBody(LogDataBody.newBuilder().setType(LogDataBody.ContentCase.TEXT.name())
- .setText(TextLog.newBuilder().setText(transformLogText(event)).build()).build());
+ .setText(TextLog.newBuilder().setText(transformLogText(appender, event)).build()).build());
return -1 == ContextManager.getSpanId() ? builder.build()
: builder.setTraceContext(TraceContext.newBuilder()
.setTraceId(ContextManager.getGlobalTraceId())
@@ -114,8 +116,11 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
.build()).build();
}
- private String transformLogText(final LogEvent event) {
+ private String transformLogText(final AbstractAppender appender, final LogEvent event) {
if (ToolkitConfig.Plugin.Toolkit.Log.TRANSMIT_FORMATTED) {
+ if (appender.getLayout() != null) {
+ return new String(appender.getLayout().toByteArray(event));
+ }
return event.getMessage().getFormattedMessage() + "\n" + ThrowableTransformer.INSTANCE.convert2String(event.getThrown(), 2048);
} else {
return event.getMessage().getFormat();
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/logback/v1/x/log/GRPCLogAppenderActivation.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/logback/v1/x/log/GRPCLogAppenderActivation.java
index 8b4fbec..5b82674 100644
--- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/logback/v1/x/log/GRPCLogAppenderActivation.java
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/logback/v1/x/log/GRPCLogAppenderActivation.java
@@ -39,7 +39,7 @@ public class GRPCLogAppenderActivation extends ClassInstanceMethodsEnhancePlugin
"org.apache.skywalking.apm.toolkit.activation.log.logback.v1.x.log.GRPCLogAppenderInterceptor";
public static final String ENHANCE_CLASS =
"org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender";
- public static final String ENHANCE_METHOD = "append";
+ public static final String ENHANCE_METHOD = "subAppend";
@Override
protected ClassMatch enhanceClass() {
diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/logback/v1/x/log/GRPCLogAppenderInterceptor.java b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/logback/v1/x/log/GRPCLogAppenderInterceptor.java
index 9823b41..1a6b005 100644
--- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/logback/v1/x/log/GRPCLogAppenderInterceptor.java
+++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/src/main/java/org/apache/skywalking/apm/toolkit/activation/log/logback/v1/x/log/GRPCLogAppenderInterceptor.java
@@ -18,12 +18,13 @@
package org.apache.skywalking.apm.toolkit.activation.log.logback.v1.x.log;
+import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxy;
+import ch.qos.logback.core.OutputStreamAppender;
import java.lang.reflect.Method;
import java.util.Objects;
import java.util.Optional;
-
import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.context.ContextManager;
@@ -38,14 +39,13 @@ import org.apache.skywalking.apm.network.logging.v3.LogDataBody;
import org.apache.skywalking.apm.network.logging.v3.LogTags;
import org.apache.skywalking.apm.network.logging.v3.TextLog;
import org.apache.skywalking.apm.network.logging.v3.TraceContext;
-
-import ch.qos.logback.classic.spi.ILoggingEvent;
import org.apache.skywalking.apm.toolkit.logging.common.log.ToolkitConfig;
public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundInterceptor {
private LogReportServiceClient client;
+ @SuppressWarnings("unchecked")
@Override
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
MethodInterceptResult result) throws Throwable {
@@ -57,7 +57,7 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
}
ILoggingEvent event = (ILoggingEvent) allArguments[0];
if (Objects.nonNull(event)) {
- client.produce(transform(event));
+ client.produce(transform((OutputStreamAppender<ILoggingEvent>) objInst, event));
}
}
@@ -76,10 +76,11 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
/**
* transforms {@link ILoggingEvent} to {@link LogData}
*
+ * @param appender the real {@link OutputStreamAppender appender}
* @param event {@link ILoggingEvent}
* @return {@link LogData} with filtered trace context in order to reduce the cost on the network
*/
- private LogData transform(ILoggingEvent event) {
+ private LogData transform(final OutputStreamAppender<ILoggingEvent> appender, ILoggingEvent event) {
LogTags.Builder logTags = LogTags.newBuilder()
.addData(KeyStringValuePair.newBuilder()
.setKey("level").setValue(event.getLevel().toString()).build())
@@ -110,7 +111,7 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
.setServiceInstance(Config.Agent.INSTANCE_NAME)
.setTags(logTags.build())
.setBody(LogDataBody.newBuilder().setType(LogDataBody.ContentCase.TEXT.name())
- .setText(TextLog.newBuilder().setText(transformLogText(event)).build()).build());
+ .setText(TextLog.newBuilder().setText(transformLogText(appender, event)).build()).build());
return -1 == ContextManager.getSpanId() ? builder.build()
: builder.setTraceContext(TraceContext.newBuilder()
.setTraceId(ContextManager.getGlobalTraceId())
@@ -119,18 +120,9 @@ public class GRPCLogAppenderInterceptor implements InstanceMethodsAroundIntercep
.build()).build();
}
- private String transformLogText(final ILoggingEvent event) {
- final IThrowableProxy throwableProxy = event.getThrowableProxy();
- if (!(throwableProxy instanceof ThrowableProxy)) {
- if (ToolkitConfig.Plugin.Toolkit.Log.TRANSMIT_FORMATTED) {
- return event.getFormattedMessage();
- } else {
- return event.getMessage();
- }
- }
+ private String transformLogText(final OutputStreamAppender<ILoggingEvent> appender, final ILoggingEvent event) {
if (ToolkitConfig.Plugin.Toolkit.Log.TRANSMIT_FORMATTED) {
- final Throwable throwable = ((ThrowableProxy) throwableProxy).getThrowable();
- return event.getFormattedMessage() + "\n" + ThrowableTransformer.INSTANCE.convert2String(throwable, 2048);
+ return new String(appender.getEncoder().encode(event));
} else {
return event.getMessage();
}