From 1568da58fe878915ad5ecbdbad245c03cf194e8b Mon Sep 17 00:00:00 2001 From: Eric Long Date: Thu, 23 Jul 2020 08:41:44 -0400 Subject: [PATCH] 0004484: Log exception stack traces after log file rotates --- .../jumpmind/util/SymRollingFileAppender.java | 43 ++++++++----------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/symmetric-util/src/main/java/org/jumpmind/util/SymRollingFileAppender.java b/symmetric-util/src/main/java/org/jumpmind/util/SymRollingFileAppender.java index 351148ffa9..621fc11e52 100644 --- a/symmetric-util/src/main/java/org/jumpmind/util/SymRollingFileAppender.java +++ b/symmetric-util/src/main/java/org/jumpmind/util/SymRollingFileAppender.java @@ -20,10 +20,8 @@ */ package org.jumpmind.util; -import java.io.OutputStream; import java.io.Serializable; import java.io.UnsupportedEncodingException; -import java.nio.ByteBuffer; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -38,7 +36,6 @@ 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.LoggerContext; import org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender; import org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy; import org.apache.logging.log4j.core.appender.rolling.DirectFileRolloverStrategy; @@ -71,6 +68,8 @@ public class SymRollingFileAppender extends AbstractOutputStreamAppender loggedEventKeys; + + private long lastFileTime; private SymRollingFileAppender(final String name, final Layout layout, final Filter filter, final RollingFileManager manager, final String fileName, final String filePattern, @@ -111,6 +110,10 @@ public synchronized void append(LogEvent event) { } getManager().checkRollover(event); + if (getManager().getFileTime() != lastFileTime) { + loggedEventKeys.clear(); + lastFileTime = getManager().getFileTime(); + } super.append(event); } @@ -134,7 +137,7 @@ protected String toKey(LogEvent event) { buff.append("-jvm-optimized"); } buff.append(":"); - buff.append(getThrowableHash(event.getThrown().getStackTrace())); + buff.append(getThrowableHash(event.getThrown().getStackTrace(), event.getThrown().getMessage())); return buff.toString(); } catch (Exception ex) { StatusLogger.getLogger().error("Failed to hash stack trace.", ex); @@ -142,10 +145,13 @@ protected String toKey(LogEvent event) { } } - protected long getThrowableHash(StackTraceElement[] elements) throws UnsupportedEncodingException { + protected long getThrowableHash(StackTraceElement[] elements, String message) throws UnsupportedEncodingException { CRC32 crc = new CRC32(); + if (message != null) { + crc.update(message.getBytes("UTF8")); + } for (StackTraceElement element : elements) { - crc.update((element.getClassName() + element.getMethodName()).getBytes("UTF8")); + crc.update((element.getClassName() + element.getMethodName() + element.getLineNumber()).getBytes("UTF8")); } return crc.getValue(); } @@ -179,6 +185,12 @@ protected String getMessageWithKey(LogEvent event, String key, String prefix) { return buff.toString(); } + @Override + public void start() { + super.start(); + lastFileTime = getManager().getFileTime(); + } + @Override public boolean stop(final long timeout, final TimeUnit timeUnit) { setStopping(); @@ -297,7 +309,7 @@ public SymRollingFileAppender build() { } final Layout layout = getOrCreateLayout(); - final RollingFileManager manager = SymRollingFileManager.getFileManager(fileName, filePattern, append, + final RollingFileManager manager = RollingFileManager.getFileManager(fileName, filePattern, append, isBufferedIo, policy, strategy, advertiseUri, layout, bufferSize, isImmediateFlush(), createOnDemand, filePermissions, fileOwner, fileGroup, getConfiguration()); @@ -420,22 +432,5 @@ public B withFileGroup(final String fileGroup) { return asBuilder(); } } - - class SymRollingFileManager extends RollingFileManager { - - protected SymRollingFileManager(LoggerContext loggerContext, String fileName, String pattern, OutputStream os, - boolean append, boolean createOnDemand, long size, long initialTime, TriggeringPolicy triggeringPolicy, - RolloverStrategy rolloverStrategy, String advertiseURI, Layout layout, - String filePermissions, String fileOwner, String fileGroup, boolean writeHeader, ByteBuffer buffer) { - super(loggerContext, fileName, pattern, os, append, createOnDemand, size, initialTime, triggeringPolicy, - rolloverStrategy, advertiseURI, layout, filePermissions, fileOwner, fileGroup, writeHeader, buffer); - } - - @Override - public synchronized void rollover() { - loggedEventKeys.clear(); - super.rollover(); - } - } }