From 9de93119e2e616e419c540a17de00e6f1719c2b2 Mon Sep 17 00:00:00 2001 From: Zhenxu Ke Date: Sun, 21 Feb 2021 12:53:44 +0800 Subject: [PATCH] Enhance gRPC log appender to allow layout pattern (#6403) --- .github/actions/e2e-test/action.yml | 19 ++++++++- .github/actions/plugins-test/action.yml | 11 +++++ .github/workflows/e2e.istio.yaml | 36 +++++++++++++++- CHANGES.md | 1 + .../log4j/v1/x/log/GRPCLogClientAppender.java | 11 ++++- .../log4j/v2/x/log/GRPCLogClientAppender.java | 41 +++++++++++++++---- .../v1/x/log/GRPCLogClientAppender.java | 17 ++++++-- .../v1/x/log/GRPCLogAppenderInterceptor.java | 19 +++++---- .../v2/x/log/GRPCLogAppenderInterceptor.java | 15 ++++--- .../v1/x/log/GRPCLogAppenderActivation.java | 2 +- .../v1/x/log/GRPCLogAppenderInterceptor.java | 26 ++++-------- test/e2e/e2e-service-provider/pom.xml | 1 - .../src/main/resources/log4j.properties | 4 +- .../src/main/resources/log4j2.xml | 6 ++- .../src/main/resources/logback.xml | 10 ++++- test/e2e/pom.xml | 8 ++++ 16 files changed, 175 insertions(+), 52 deletions(-) diff --git a/.github/actions/e2e-test/action.yml b/.github/actions/e2e-test/action.yml index 92b752be905f..67f3dbb9b1f0 100644 --- a/.github/actions/e2e-test/action.yml +++ b/.github/actions/e2e-test/action.yml @@ -25,6 +25,17 @@ inputs: runs: using: "composite" steps: + - name: Check Unintended Changes + shell: bash + run: | + echo "::group::Check sw.version" + sudo apt install -y -q xmlstarlet + SW_VERSION=$(xmlstarlet sel -N pom=http://maven.apache.org/POM/4.0.0 -t -v "/pom:project/pom:properties/pom:sw.version" test/e2e/pom.xml) + if [[ "$(echo $(echo $SW_VERSION))" != "" ]]; then + echo "Please don't submit the change of sw.version in test/e2e/pom.xml" + exit 1 + fi + echo "::endgroup::" - name: Check License shell: bash run: | @@ -53,8 +64,14 @@ runs: - name: Run E2E Test shell: bash run: | + echo "::group::Install SNAPSHOT apm-application-toolkit" + ./mvnw -DskipTests -N install + ./mvnw -f apm-application-toolkit -DskipTests -am install + echo "::endgroup::" + echo "::group::Run E2E Test ${{ inputs.test_class }}" - ./mvnw --batch-mode -f test/e2e/pom.xml -am -DfailIfNoTests=false verify -Dit.test=${{ inputs.test_class }} + SW_VERSION=$(./mvnw -q -DforceStdout -N org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version) + ./mvnw --batch-mode -f test/e2e/pom.xml -am -DfailIfNoTests=false -Dsw.version=${SW_VERSION} verify -Dit.test=${{ inputs.test_class }} echo "::endgroup::" - name: Report Coverage shell: bash diff --git a/.github/actions/plugins-test/action.yml b/.github/actions/plugins-test/action.yml index 1869e52480fa..3832cd976db6 100644 --- a/.github/actions/plugins-test/action.yml +++ b/.github/actions/plugins-test/action.yml @@ -29,6 +29,17 @@ inputs: runs: using: "composite" steps: + - name: Check Unintended Changes + shell: bash + run: | + echo "::group::Check sw.version" + sudo apt install -y -q xmlstarlet + SW_VERSION=$(xmlstarlet sel -N pom=http://maven.apache.org/POM/4.0.0 -t -v "/pom:project/pom:properties/pom:sw.version" test/e2e/pom.xml) + if [[ "$(echo $(echo $SW_VERSION))" != "" ]]; then + echo "Please don't submit the change of sw.version in test/e2e/pom.xml" + exit 1 + fi + echo "::endgroup::" - name: Check License shell: bash run: | diff --git a/.github/workflows/e2e.istio.yaml b/.github/workflows/e2e.istio.yaml index a054dbbe440f..c465c8e32db1 100644 --- a/.github/workflows/e2e.istio.yaml +++ b/.github/workflows/e2e.istio.yaml @@ -48,6 +48,17 @@ jobs: with: submodules: true + - name: Check Unintended Changes + run: | + echo "::group::Check sw.version" + sudo apt install -y -q xmlstarlet + SW_VERSION=$(xmlstarlet sel -N pom=http://maven.apache.org/POM/4.0.0 -t -v "/pom:project/pom:properties/pom:sw.version" test/e2e/pom.xml) + if [[ "$(echo $(echo $SW_VERSION))" != "" ]]; then + echo "::error Please don't submit the change of sw.version in test/e2e/pom.xml" + exit 1 + fi + echo "::endgroup::" + - name: Set Skip Env Var uses: ./.github/actions/skip @@ -132,7 +143,12 @@ jobs: export WEBAPP_HOST=127.0.0.1 export WEBAPP_PORT=8080 - ./mvnw --batch-mode -f test/e2e/pom.xml -am -DfailIfNoTests=false verify -Dit.test=org.apache.skywalking.e2e.mesh.ALSE2E + export SW_VERSION=$(./mvnw -q -DforceStdout -N org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version) + + ./mvnw -DskipTests -N install + ./mvnw -f apm-application-toolkit -DskipTests -am install + + ./mvnw --batch-mode -f test/e2e/pom.xml -am -DfailIfNoTests=false -Dsw.version=${SW_VERSION} verify -Dit.test=org.apache.skywalking.e2e.mesh.ALSE2E - name: Logs if: ${{ failure() }} @@ -162,6 +178,17 @@ jobs: with: submodules: true + - name: Check Unintended Changes + run: | + echo "::group::Check sw.version" + sudo apt install -y -q xmlstarlet + SW_VERSION=$(xmlstarlet sel -N pom=http://maven.apache.org/POM/4.0.0 -t -v "/pom:project/pom:properties/pom:sw.version" test/e2e/pom.xml) + if [[ "$(echo $(echo $SW_VERSION))" != "" ]]; then + echo "Please don't submit the change of sw.version in test/e2e/pom.xml" + exit 1 + fi + echo "::endgroup::" + - name: Set Skip Env Var uses: ./.github/actions/skip @@ -246,7 +273,12 @@ jobs: export WEBAPP_HOST=127.0.0.1 export WEBAPP_PORT=8080 - ./mvnw --batch-mode -f test/e2e/pom.xml -am -DfailIfNoTests=false verify -Dit.test=org.apache.skywalking.e2e.mesh.MetricsServiceE2E + export SW_VERSION=$(./mvnw -q -DforceStdout -N org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version) + + ./mvnw -DskipTests -N install + ./mvnw -f apm-application-toolkit -DskipTests -am install + + ./mvnw --batch-mode -f test/e2e/pom.xml -am -DfailIfNoTests=false -Dsw.version=${SW_VERSION} verify -Dit.test=org.apache.skywalking.e2e.mesh.MetricsServiceE2E - name: Logs if: ${{ failure() }} diff --git a/CHANGES.md b/CHANGES.md index d417d38a0a5c..61ee5298ccad 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -13,6 +13,7 @@ Release Notes. * Add net.bytebuddy.agent.builder.AgentBuilder.RedefinitionStrategy.Listener to show detail message when redefine errors occur. * Fix ClassCastException of log4j gRPC reporter. * Fix NPE when Kafka reporter activated. +* 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 4c95b4d7d78c..8c99df446cea 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 void close() { @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 9a0957641931..ebe543e08c8b 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.PluginFactory; @Plugin(name = "GRPCLogClientAppender", category = "Core", elementType = "appender") -public class GRPCLogClientAppender extends AbstractAppender { +public class GRPCLogClientAppender extends AbstractOutputStreamAppender { + 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 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 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 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 b12689f20946..9b5ffdd1ebfd 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 extends AppenderBase { +public class GRPCLogClientAppender extends OutputStreamAppender { + 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 98c555ce0c5f..21508ae252f6 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 @@ 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.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 void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr } LoggingEvent event = (LoggingEvent) allArguments[0]; if (Objects.nonNull(event)) { - client.produce(transform(event)); + client.produce(transform((AppenderSkeleton) objInst, event)); } } @@ -71,10 +71,12 @@ public void handleMethodException(EnhancedInstance objInst, Method method, Objec /** * 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 @@ private LogData transform(LoggingEvent event) { .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 @@ private LogData transform(LoggingEvent event) { .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 f9df92c5ac9e..9b7bbdfe644e 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 @@ 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 void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr } LogEvent event = (LogEvent) allArguments[0]; if (Objects.nonNull(event)) { - client.produce(transform(event)); + client.produce(transform((AbstractAppender) objInst, event)); } } @@ -73,10 +73,12 @@ public void handleMethodException(EnhancedInstance objInst, Method method, Objec /** * 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 @@ private LogData transform(LogEvent event) { .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 @@ private LogData transform(LogEvent event) { .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 8b4fbec1cb37..5b82674e3086 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 9823b41753da..1a6b0053e749 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.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 void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr } ILoggingEvent event = (ILoggingEvent) allArguments[0]; if (Objects.nonNull(event)) { - client.produce(transform(event)); + client.produce(transform((OutputStreamAppender) objInst, event)); } } @@ -76,10 +76,11 @@ public void handleMethodException(EnhancedInstance objInst, Method method, Objec /** * 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 appender, ILoggingEvent event) { LogTags.Builder logTags = LogTags.newBuilder() .addData(KeyStringValuePair.newBuilder() .setKey("level").setValue(event.getLevel().toString()).build()) @@ -110,7 +111,7 @@ private LogData transform(ILoggingEvent event) { .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 @@ private LogData transform(ILoggingEvent event) { .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 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(); } diff --git a/test/e2e/e2e-service-provider/pom.xml b/test/e2e/e2e-service-provider/pom.xml index 593a85eb097f..8862f0f7eb48 100644 --- a/test/e2e/e2e-service-provider/pom.xml +++ b/test/e2e/e2e-service-provider/pom.xml @@ -34,7 +34,6 @@ e2e-service-provider - 8.4.0 1.2.17 2.7 1.2.3 diff --git a/test/e2e/e2e-service-provider/src/main/resources/log4j.properties b/test/e2e/e2e-service-provider/src/main/resources/log4j.properties index 914600b61917..d2fc80fd0e9c 100644 --- a/test/e2e/e2e-service-provider/src/main/resources/log4j.properties +++ b/test/e2e/e2e-service-provider/src/main/resources/log4j.properties @@ -13,4 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. log4j.rootLogger=info,CustomAppender -log4j.appender.CustomAppender=org.apache.skywalking.apm.toolkit.log.log4j.v1.x.log.GRPCLogClientAppender \ No newline at end of file +log4j.appender.CustomAppender=org.apache.skywalking.apm.toolkit.log.log4j.v1.x.log.GRPCLogClientAppender +log4j.appender.CustomAppender.layout=org.apache.log4j.PatternLayout +log4j.appender.CustomAppender.layout.ConversionPattern=[%t] %-5p %c %x - %m%n diff --git a/test/e2e/e2e-service-provider/src/main/resources/log4j2.xml b/test/e2e/e2e-service-provider/src/main/resources/log4j2.xml index 135b422a24a9..dc622bc07564 100644 --- a/test/e2e/e2e-service-provider/src/main/resources/log4j2.xml +++ b/test/e2e/e2e-service-provider/src/main/resources/log4j2.xml @@ -20,7 +20,9 @@ - + + + @@ -31,4 +33,4 @@ - \ No newline at end of file + diff --git a/test/e2e/e2e-service-provider/src/main/resources/logback.xml b/test/e2e/e2e-service-provider/src/main/resources/logback.xml index f47372cb2ec1..16c9064a5506 100644 --- a/test/e2e/e2e-service-provider/src/main/resources/logback.xml +++ b/test/e2e/e2e-service-provider/src/main/resources/logback.xml @@ -25,10 +25,16 @@ - + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n + + + - \ No newline at end of file + diff --git a/test/e2e/pom.xml b/test/e2e/pom.xml index 2e3ee235ddb1..557cddfbedde 100644 --- a/test/e2e/pom.xml +++ b/test/e2e/pom.xml @@ -44,6 +44,14 @@ + + + + 1.8 ${java.version} ${java.version}