代码之家  ›  专栏  ›  技术社区  ›  Jean-Philippe Caruana

是否可以在log4j中为stacktrace的每一行加前缀?

  •  6
  • Jean-Philippe Caruana  · 技术社区  · 15 年前

    当你写作的时候

    logger.error("message", exception);
    

    log4j生成消息和完整的堆栈跟踪:

    Aug  9 06:26:13 10.175.60.14 myPrefix: [error] [TP-Processor114] [my.class.Name] message : exception
    at fatherOfException
    at fatherof_fatherOfException
    at fatherof_fatherof_fatherOfException
    ...
    

    我的转换模式是

    log4j.appender.syslog.layout.ConversionPattern=myPrefix: [%p] [%t] [%c] [%x] - %m%n
    

    每行

        Aug  9 06:26:13 10.175.60.14 myPrefix: [error] [TP-Processor114] [my.class.Name] message : exception
    myPrefix    at fatherOfException
    myPrefix    at fatherof_fatherOfException
    myPrefix    at fatherof_fatherof_fatherOfException
        ...
    

    3 回复  |  直到 15 年前
        1
  •  2
  •   Isaac    11 年前

    ThrowableRenderer

    import org.apache.log4j.DefaultThrowableRenderer;
    import org.apache.log4j.spi.ThrowableRenderer;
    
    public class LogThrowableRenderer implements ThrowableRenderer {
    
        DefaultThrowableRenderer def = new DefaultThrowableRenderer();
    
        @Override
        public String[] doRender(Throwable t) {
            String[] temp = def.doRender(t);
            for (int i = 0; i < temp.length; i++) {
                temp[i] = "myPrefix "+temp[i];
            }
            return temp;
        }
    
    }
    

    添加到您的 log4j.properties :

    log4j.throwableRenderer=whatever.package.LogThrowableRenderer
    

    DefaultThrowableRenderer 在添加前缀之前以熟悉的方式呈现stacktrace,因此它将包括 Throwable 类、消息和原因。

        2
  •  7
  •   Isaac    11 年前

    参考亚历克斯的答案,因为它是一个干净的。

    org.apache.log4j.spi.ThrowableRenderer :

    http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/spi/ThrowableRenderer.html

    然后,编辑log4j配置:

    log4j.一次性渲染器=

    这个 ThrowableRenderer 返回 String s。这是您的密码:

    String prefix = "myPrefix"; // Or some constant
    
    List<String> l = new LinkedList<String>();
    l.add(String.format("%s %s: %s", prefix, t.getClass().getName(), t.getMessage()));
    
    for (StackTraceElement ste: t.getStackTrace()){
        l.add(String.format("%s %s", prefix, ste.toString()));
    }
    
    return (String[]) l.toArray();
    

    Throwable PrintWriter 那是在包装一些东西 Writer 写入内存,然后在由 line.separator

    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    
    List<String> l = new LinkedList<String>();
    for (String s: sw.toString().split(System.lineSeparator())) {
        l.add(String.format("%s %s", prefix, s));
    }
    
    return (String[]) l.toArray();
    
        3
  •  0
  •   Mike    15 年前

    编写一个包装函数来完成它。

    private void writeToLogs(String message, Exception excp) {
        logger.error("myPrefix\t" + message, excp);
    }