java - logstash-logback-encoder 在多行中显示堆栈跟踪

标签 java json logstash logstash-logback-encoder

logstash-logback-encoder 在一个字符串中显示堆栈跟踪的输出,例如

"stack_trace": "java.lang.RuntimeException: null\n\tat com.ideasforsharing.demo.controllers.SleuthController.helloSleuth(SleuthController.java:24)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n"

这很难读。我如何格式化堆栈跟踪的显示以在多行中显示它,也许使用 json 数组?

"stack_trace" : [
    "java.lang.RuntimeException: null",
      "com.ideasforsharing.demo.controllers.SleuthController.helloSleuth(SleuthController.java:24)",
        "at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
        "at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)"
]

最佳答案

我做过某事

<provider class="com.ac.log.CustomStackTraceJsonProvider">
    <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
        <maxDepthPerThrowable>full</maxDepthPerThrowable>
        <maxLength>full</maxLength>
        <shortenedClassNameLength>20</shortenedClassNameLength>
        <exclusions>${STE_EXCLUSIONS}</exclusions>
        <rootCauseFirst>true</rootCauseFirst>
    </throwableConverter>
</provider>

类看起来像

import java.io.IOException;

import java.util.LinkedHashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonGenerator;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import net.logstash.logback.composite.JsonWritingUtils;
import net.logstash.logback.composite.loggingevent.StackTraceJsonProvider;

public class CustomStackTraceJsonProvider extends StackTraceJsonProvider {

  public CustomStackTraceJsonProvider() {
    super();
  }

  @Override
  public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException {
    IThrowableProxy throwableProxy = event.getThrowableProxy();
    if (throwableProxy != null) {
      String msg = getThrowableConverter().convert(event);
      String[] lines = msg.split("\\n\\t");
      Map<String, String> lineMap = new LinkedHashMap<>();
      for(int i = 0; i < lines.length; i++){
        lineMap.put(String.valueOf(i+1), lines[i]);
      }
      JsonWritingUtils.writeMapStringFields(generator, getFieldName(), lineMap);
    }
  }
}

输出格式为

{
  l_t : "2018-04-14T20:00:25.066-07:00",
  l_l : "ERROR",
  l_m : "Error while validating field existence",
  service : "com.ac.api.client.product.ProductService",
  method : "fetchProduct",
  value : "p-j0ednf7f6wd8l6rss",
  l_th : "http-nio-8080-exec-5",
  stack_hash : "26c1547b",
  l_c : "com.ac.core.validation.ExistsByStringFieldValidator:isValid:34",
  stack_trace : {
    1 : "c.i.c.a.c.e.RemoteServiceException: error code: 1002, user msg: remote.service.objectNotFound, parameters: [(identifier: p-j0ednf7f6wd8l6rss)]",
    2 : "at c.i.c.a.c.p.ProductServiceImpl.toProduct(ProductServiceImpl.java:69)",
    3 : "at c.i.c.a.c.p.ProductServiceImpl.fetchProductInternal(ProductServiceImpl.java:44)",
    4 : "at c.i.c.a.c.p.ProductServiceImpl.fetchProduct(ProductServiceImpl.java:33)",
    5 : "at c.i.c.a.c.p.ProductServiceImpl$$FastClassBySpringCGLIB$$5ee58445.invoke(<generated>)",
    6 : "at o.s.c.p.MethodProxy.invoke(MethodProxy.java:204)",
    7 : "at o.s.a.f.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)",
    8 : "at o.s.a.f.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)",
    9 : "at o.s.c.j.i.JCacheInterceptor$1.invoke(JCacheInterceptor.java:52)",
    10 : "at o.s.c.j.i.JCacheAspectSupport.invokeOperation(JCacheAspectSupport.java:153)",
    11 : "at o.s.c.j.i.JCacheAspectSupport$CacheOperationInvokerAdapter.invoke(JCacheAspectSupport.java:167)",
    12 : "at o.s.c.j.i.CacheResultInterceptor.invoke(CacheResultInterceptor.java:62)",
    13 : "at o.s.c.j.i.JCacheAspectSupport.execute(JCacheAspectSupport.java:123)",
    14 : "at o.s.c.j.i.JCacheAspectSupport.execute(JCacheAspectSupport.java:102)",
    15 : "at o.s.c.j.i.JCacheInterceptor.invoke(JCacheInterceptor.java:61)",
    16 : "at o.s.a.f.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)",
    17 : "at o.s.a.f.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)",
    18 : "at c.i.c.a.c.p.ProductServiceImpl$$EnhancerBySpringCGLIB$$f315262.fetchProduct(<generated>)",
    19 : "... 124 common frames omitted\nWrapped by: j.l.r.InvocationTargetException: null",
    20 : "at s.r.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java)",
    21 : "at s.r.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
    22 : "at s.r.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
    23 : "at j.l.reflect.Method.invoke(Method.java:498)",
    24 : "at c.i.c.c.v.ExistsByStringFieldValidator.isValid(ExistsByStringFieldValidator.java:29)",
    25 : "at c.i.c.c.v.ExistsByStringFieldValidator.isValid(ExistsByStringFieldValidator.java:12)",
    26 : "at o.h.v.i.e.c.ConstraintTree.validateSingleConstraint(ConstraintTree.java:448)",
    27 : "at o.h.v.i.e.c.ConstraintTree.validateConstraints(ConstraintTree.java:127)",
    28 : "at o.h.v.i.e.c.ConstraintTree.validateComposingConstraints(ConstraintTree.java:398)",
    29 : "at o.h.v.i.e.c.ConstraintTree.validateConstraints(ConstraintTree.java:98)",
    30 : "at o.h.v.i.e.c.ConstraintTree.validateConstraints(ConstraintTree.java:87)",
    31 : "at o.h.v.i.m.c.MetaConstraint.validateConstraint(MetaConstraint.java:73)",
    32 : "at o.h.v.i.e.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:621)",
    33 : "at o.h.v.i.e.ValidatorImpl.validateConstraint(ValidatorImpl.java:584)",
    34 : "at o.h.v.i.e.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:528)",
    35 : "at o.h.v.i.e.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:496)",
    36 : "at o.h.v.i.e.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:461)",
    37 : "at o.h.v.i.e.ValidatorImpl.validateInContext(ValidatorImpl.java:411)",
    38 : "at o.h.v.i.e.ValidatorImpl.validateCascadedConstraint(ValidatorImpl.java:762)",
    39 : "at o.h.v.i.e.ValidatorImpl.validateCascadedConstraints(ValidatorImpl.java:685)",
    40 : "at o.h.v.i.e.ValidatorImpl.validateParametersInContext(ValidatorImpl.java:1126)",
    41 : "at o.h.v.i.e.ValidatorImpl.validateParameters(ValidatorImpl.java:302)",
    42 : "at o.h.v.i.e.ValidatorImpl.validateParameters(ValidatorImpl.java:256)",
    43 : "at s.r.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java)",
    44 : "at s.r.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
    45 : "... 99 frames truncated\n"
  }
}

关于java - logstash-logback-encoder 在多行中显示堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47733059/

相关文章:

java - 在方法中使用 ActionListeners 创建 GUI

javascript - 获取所有阵列的独特元素 - Handlebars

elasticsearch - 将坐标存储为geo_point的问题

json - Logstash:处理大消息

elasticsearch - 删除数组字段(如果为空)

java - 在Java中将.gz文件分割成指定的文件大小

java - 通过Reflection Api访问重载方法

java - 如何在 Mapreduce 中生成 UUID?

javascript - AJAX get 请求将每个字母放入数组中

c# - 读取 json 文件并使用 JSON.NET 更改它