Add logging of group synchronization and executing console commands, improve how log writing is scheduled

This commit is contained in:
Vankka 2023-11-09 23:52:29 +02:00
parent 739148ffd0
commit 91fa61542d
No known key found for this signature in database
GPG Key ID: 6E50CB7A29B96AD0
7 changed files with 86 additions and 20 deletions

View File

@ -89,7 +89,7 @@ public class ExecuteCommand implements Consumer<DiscordChatInputInteractionEvent
boolean ephemeral = config.ephemeral;
event.asJDA().reply("Executing command `" + command + "`")
.setEphemeral(ephemeral)
.queue(ih -> new ExecutionContext(discordSRV, ih, config.outputMode, ephemeral).run(command));
.queue(ih -> new ExecutionContext(discordSRV, ih, config.outputMode, ephemeral).run(event.getUser(), command));
}
@Override
@ -194,10 +194,10 @@ public class ExecuteCommand implements Consumer<DiscordChatInputInteractionEvent
this.ephemeral = ephemeral;
}
public void run(String command) {
public void run(DiscordUser user, String command) {
discordSRV.console().commandExecutorProvider()
.getConsoleExecutor(this::consumeComponent)
.runCommand(command);
.runCommandWithLogging(discordSRV, user, command);
}
private void consumeComponent(Component component) {

View File

@ -18,7 +18,17 @@
package com.discordsrv.common.command.game.executor;
import com.discordsrv.api.discord.entity.DiscordUser;
import com.discordsrv.common.DiscordSRV;
public interface CommandExecutor {
default void runCommandWithLogging(DiscordSRV discordSRV, DiscordUser user, String command) {
discordSRV.logger().writeLogForCurrentDay(
"commandexecution",
"@" + user.getAsTag() + " [ID " + Long.toUnsignedString(user.getId()) + "] executed \"" + command + "\""
);
runCommand(command);
}
void runCommand(String command);
}

View File

@ -158,7 +158,7 @@ public class SingleConsoleHandler {
mostRecentMessageId = null;
// Run the command
discordSRV.console().runCommand(command);
discordSRV.console().runCommandWithLogging(discordSRV, user, command);
}
public void queue(LogEntry entry) {

View File

@ -180,7 +180,14 @@ public class GroupSyncModule extends AbstractModule<DiscordSRV> {
for (Map.Entry<GroupSyncConfig.PairConfig, CompletableFuture<GroupSyncResult>> entry : pairs.entrySet()) {
summary.add(entry.getKey(), entry.getValue().join());
}
logger().debug(summary.toString());
String finalSummary = summary.toString();
logger().debug(finalSummary);
if (summary.anySuccess()) {
// If anything was changed as a result of synchronization, log to file
discordSRV.logger().writeLogForCurrentDay("groupsync", finalSummary);
}
});
}

View File

@ -44,6 +44,15 @@ public class SynchronizationSummary {
pairs.computeIfAbsent(result, key -> new LinkedHashSet<>()).add(config);
}
public boolean anySuccess() {
for (GroupSyncResult result : pairs.keySet()) {
if (result.isSuccess()) {
return true;
}
}
return false;
}
@Override
public String toString() {
int count = pairs.size();

View File

@ -21,10 +21,10 @@ package com.discordsrv.common.groupsync.enums;
public enum GroupSyncResult {
// Something happened
ADD_GROUP("Success (group add)"),
REMOVE_GROUP("Success (group remove)"),
ADD_ROLE("Success (role add)"),
REMOVE_ROLE("Success (role remove)"),
ADD_GROUP("Success (group add)", true),
REMOVE_GROUP("Success (group remove)", true),
ADD_ROLE("Success (role add)", true),
REMOVE_ROLE("Success (role remove)", true),
// Nothing done
ALREADY_IN_SYNC("Already in sync"),
@ -44,9 +44,19 @@ public enum GroupSyncResult {
;
final String prettyResult;
final boolean success;
GroupSyncResult(String prettyResult) {
this(prettyResult, false);
}
GroupSyncResult(String prettyResult, boolean success) {
this.prettyResult = prettyResult;
this.success = success;
}
public boolean isSuccess() {
return success;
}
@Override

View File

@ -42,22 +42,31 @@ import java.util.Collections;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class DiscordSRVLogger implements Logger {
private static final DateFormat DATE_TIME_FORMATTER = new SimpleDateFormat("EEE HH:mm:ss z");
private static final String LOG_LINE_FORMAT = "[%s] [%s] %s";
private static final DateFormat ROTATED_DATE_TIME_FORMATTER = new SimpleDateFormat("EEE HH:mm:ss z");
private static final DateFormat DAY_DATE_TIME_FORMATTER = new SimpleDateFormat("HH:mm:ss z");
private static final DateFormat DAY = new SimpleDateFormat("yyyy-MM-dd");
private static final String ROTATED_LOG_LINE_FORMAT = "[%s] [%s] %s";
private static final String DAY_LOG_LINE_FORMAT = "[%s] %s";
private static final String LOG_FILE_NAME_FORMAT = "%s-%s.log";
private static final List<String> DISABLE_DEBUG_BY_DEFAULT = Collections.singletonList("Hikari");
private final Queue<LogEntry> linesToAdd = new ConcurrentLinkedQueue<>();
private final DiscordSRV discordSRV;
// Files
private final Path logsDirectory;
private final List<Path> debugLogs;
// File writing
private final Queue<LogEntry> linesToWrite = new ConcurrentLinkedQueue<>();
private final Object lineProcessingLock = new Object();
private Future<?> lineProcessingFuture;
public DiscordSRVLogger(DiscordSRV discordSRV) {
this.discordSRV = discordSRV;
this.logsDirectory = discordSRV.dataDirectory().resolve("logs");
@ -70,13 +79,17 @@ public class DiscordSRVLogger implements Logger {
}
this.debugLogs = rotateLog("debug", 3);
discordSRV.scheduler().runAtFixedRate(this::processLines, 0, 2, TimeUnit.SECONDS);
}
public List<Path> getDebugLogs() {
return debugLogs;
}
public void writeLogForCurrentDay(String label, String message) {
Path log = logsDirectory.resolve(label + "_" + DAY.format(System.currentTimeMillis()) + ".log");
scheduleWrite(new LogEntry(log, null, System.currentTimeMillis(), null, message, null));
}
@SuppressWarnings("SameParameterValue")
private List<Path> rotateLog(String label, int amount) {
try {
@ -128,6 +141,7 @@ public class DiscordSRVLogger implements Logger {
}
private void doLog(String loggerName, LogLevel logLevel, String message, Throwable throwable) {
long time = System.currentTimeMillis();
MainConfig config = discordSRV.config();
DebugConfig debugConfig = config != null ? config.debug : null;
@ -158,13 +172,22 @@ public class DiscordSRVLogger implements Logger {
if (debugLog == null) {
return;
}
long time = System.currentTimeMillis();
linesToAdd.add(new LogEntry(debugLog, loggerName, time, logLevel, message, throwable));
scheduleWrite(new LogEntry(debugLog, loggerName, time, logLevel, message, throwable));
}
private void scheduleWrite(LogEntry entry) {
linesToWrite.add(entry);
synchronized (lineProcessingLock) {
if (lineProcessingFuture == null || lineProcessingFuture.isDone()) {
lineProcessingFuture = discordSRV.scheduler().runLater(this::processLines, TimeUnit.SECONDS.toMillis(2));
}
}
}
private void processLines() {
LogEntry entry;
while ((entry = linesToAdd.poll()) != null) {
while ((entry = linesToWrite.poll()) != null) {
writeToFile(entry.log(), entry.loggerName(), entry.time(), entry.logLevel(), entry.message(), entry.throwable());
}
}
@ -178,8 +201,15 @@ public class DiscordSRVLogger implements Logger {
message = "[" + loggerName + "] " + message;
}
String timestamp = DATE_TIME_FORMATTER.format(time);
String line = String.format(LOG_LINE_FORMAT, timestamp, logLevel.name(), message) + "\n";
String line;
if (logLevel == null) {
String timestamp = DAY_DATE_TIME_FORMATTER.format(time);
line = String.format(DAY_LOG_LINE_FORMAT, timestamp, message) + "\n";
} else {
String timestamp = ROTATED_DATE_TIME_FORMATTER.format(time);
line = String.format(ROTATED_LOG_LINE_FORMAT, timestamp, logLevel.name(), message) + "\n";
}
if (throwable != null) {
line += ExceptionUtils.getStackTrace(throwable) + "\n";
}
@ -199,7 +229,7 @@ public class DiscordSRVLogger implements Logger {
if (discordSRV.status() == DiscordSRV.Status.SHUTDOWN) {
return;
}
discordSRV.platformLogger().error("Failed to write to debug log", e);
discordSRV.platformLogger().error("Failed to write to log", e);
} catch (Throwable ignored) {}
}
}