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:23 UTC

[skywalking] branch enhance/log created (now b905c26)

This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a change to branch enhance/log
in repository https://gitbox.apache.org/repos/asf/skywalking.git.


      at b905c26  Enhance gRPC log appender to allow layout pattern

This branch includes the following new commits:

     new b905c26  Enhance gRPC log appender to allow layout pattern

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[skywalking] 01/01: Enhance gRPC log appender to allow layout pattern

Posted by ke...@apache.org.
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();
         }