x-control-panel/logging/src/main/java/ru/kirillius/XCP/Logging/LogHandlerImpl.java

91 lines
3.0 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;
private final boolean debugging;
public LogHandlerImpl(LoggingSystem loggingSystem, Context context) {
eventHandler = loggingSystem.getEventHandler();
debugging = context.getLaunchArgs().contains("--debug");
}
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("\nError thrown ").append(thrown.getClass().getSimpleName()).append(":").append(thrown.getMessage());
if (debugging) {
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);
}
}
}
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 {
}
}