Skip to content

Commit

Permalink
0004484: Log exception stack traces after log file rotates
Browse files Browse the repository at this point in the history
  • Loading branch information
erilong committed Jul 23, 2020
1 parent 0b6073c commit 1568da5
Showing 1 changed file with 19 additions and 24 deletions.
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -71,6 +68,8 @@ public class SymRollingFileAppender extends AbstractOutputStreamAppender<Rolling
private int historySize = 2048;

private Map<String, String> loggedEventKeys;

private long lastFileTime;

private SymRollingFileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
final RollingFileManager manager, final String fileName, final String filePattern,
Expand Down Expand Up @@ -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);
}

Expand All @@ -134,18 +137,21 @@ 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);
return null;
}
}

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();
}
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -297,7 +309,7 @@ public SymRollingFileAppender build() {
}

final Layout<? extends Serializable> 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());

Expand Down Expand Up @@ -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<? extends Serializable> 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();
}
}

}

0 comments on commit 1568da5

Please sign in to comment.