101 lines
3.3 KiB
Java
101 lines
3.3 KiB
Java
package ru.kirillius.XCP.Logging;
|
|
|
|
import ru.kirillius.XCP.Commons.Context;
|
|
import ru.kirillius.java.utils.events.EventHandler;
|
|
|
|
import java.io.IOException;
|
|
import java.io.PrintWriter;
|
|
import java.io.StringWriter;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Date;
|
|
import java.util.Locale;
|
|
import java.util.logging.Handler;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.LogRecord;
|
|
|
|
public class LogHandlerImpl extends Handler {
|
|
private final EventHandler<LogMessage> eventHandler;
|
|
|
|
|
|
public LogHandlerImpl(LoggingSystem loggingSystem, Context context) {
|
|
eventHandler = loggingSystem.getEventHandler();
|
|
|
|
this.context = context;
|
|
}
|
|
|
|
private final Context context;
|
|
|
|
private final static SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.US);
|
|
|
|
private String format(LogRecord logRecord) {
|
|
var date = new Date(logRecord.getMillis());
|
|
var builder = new StringBuilder();
|
|
builder.append("[");
|
|
builder.append(dateFormat.format(date));
|
|
builder.append("][");
|
|
builder.append(convertLevel(logRecord.getLevel()));
|
|
builder.append("] ");
|
|
builder.append(logRecord.getMessage().trim());
|
|
var thrown = logRecord.getThrown();
|
|
if (thrown != null) {
|
|
builder.append("\n\tThrown ").append(thrown.getClass().getSimpleName()).append(": ").append(thrown.getMessage());
|
|
if (context.isDebuggingEnabled()) {
|
|
builder.append("\nStack trace:\n");
|
|
|
|
try (var writer = new StringWriter()) {
|
|
try (var printWriter = new PrintWriter(writer)) {
|
|
thrown.printStackTrace(printWriter);
|
|
builder.append(writer);
|
|
}
|
|
} catch (IOException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
} else {
|
|
var cause = thrown.getCause();
|
|
while (cause != null) {
|
|
builder.append("\n\t\tCaused by ").append(cause.getClass().getSimpleName()).append(": ").append(cause.getMessage());
|
|
cause = cause.getCause();
|
|
}
|
|
builder.append("\n\t(Stack trace is hidden due to --debug flag)");
|
|
}
|
|
}
|
|
return builder.toString();
|
|
}
|
|
|
|
@Override
|
|
public synchronized void publish(LogRecord logRecord) {
|
|
//TODO сделать асинхронным чтобы не лочить треды
|
|
print(logRecord);
|
|
var message = LogMessage.builder().message(logRecord.getMessage()).level(convertLevel(logRecord.getLevel())).date(logRecord.getInstant()).build();
|
|
try {
|
|
eventHandler.invoke(message);
|
|
} catch (Exception e) {
|
|
print(new LogRecord(Level.SEVERE, "Unhandled error in logger event listener: " + e.getClass().getSimpleName() + ": " + e.getMessage()));
|
|
}
|
|
}
|
|
|
|
private void print(LogRecord logRecord) {
|
|
System.out.println(format(logRecord));
|
|
}
|
|
|
|
public LogLevel convertLevel(Level level) {
|
|
if (level == Level.SEVERE) {
|
|
return LogLevel.ERROR;
|
|
}
|
|
if (level == Level.WARNING) {
|
|
return LogLevel.WARNING;
|
|
}
|
|
return LogLevel.INFO;
|
|
}
|
|
|
|
@Override
|
|
public void flush() {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void close() throws SecurityException {
|
|
|
|
}
|
|
}
|