InMemoryLoggerAppender.java
package sk.iway.iwcm.system.logging;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.core.AppenderBase;
import sk.iway.iwcm.Adminlog;
import sk.iway.iwcm.Constants;
/**
* Trieda sluzi na logovanie do pamate pomocou logback
*/
public class InMemoryLoggerAppender extends AppenderBase<ILoggingEvent> {
@Override
protected void append(ILoggingEvent loggingEvent) {
if ("com.zaxxer.hikari.pool.ProxyLeakTask".equals(loggingEvent.getLoggerName())) {
auditEvent(Adminlog.TYPE_SQLERROR, loggingEvent);
}
if (!Constants.getBoolean("loggingInMemoryEnabled")) {
return;
}
InMemoryLoggingDB.getInstance().add(new InMemoryLoggingEvent(loggingEvent));
}
/**
* Log event into database (Adminlog table)
* @param logType - type of event Adminlog.TYPE_*
* @param loggingEvent
*/
private void auditEvent(int logType, ILoggingEvent loggingEvent) {
try {
//get stacktrace from ILoggingEvent
StringBuilder stackTraceBuilder = new StringBuilder();
if (loggingEvent.getThrowableProxy() != null) {
stackTraceBuilder.append(loggingEvent.getThrowableProxy().getClassName())
.append(": ")
.append(loggingEvent.getThrowableProxy().getMessage())
.append("\n");
for (StackTraceElementProxy elementProxy : loggingEvent.getThrowableProxy().getStackTraceElementProxyArray()) {
stackTraceBuilder.append("\t")
.append(elementProxy.toString())
.append("\n");
}
}
Adminlog.add(logType, loggingEvent.getFormattedMessage()+"\n"+stackTraceBuilder.toString(), -1, -1);
} catch (Exception ex) {
//do not use logger because we can get into infinite loop
ex.printStackTrace(System.err);
}
}
}