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 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 { } }