Skip to content

Commit 8f60483

Browse files
authored
Forward logs to Discord (#579)
* Draft of discord log forwarding * rate limiting, batch sending, scheduling * Error handling and info/error channel split * javadoc * Sonar logging issue * Readability, CR (Mom0auth) * SImplified log forwarding by using webhook lib * Spotless
1 parent 6d9f6c0 commit 8f60483

25 files changed

+451
-37
lines changed

application/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ dependencies {
5050
implementation 'org.apache.logging.log4j:log4j-core:2.19.0'
5151
runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.18.0'
5252

53+
implementation 'club.minnced:discord-webhooks:0.8.2'
54+
5355
implementation 'org.jooq:jooq:3.17.2'
5456

5557
implementation 'io.mikael:urlbuilder:2.0.9'

application/config.json.template

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,7 @@
8383
"wsc",
8484
"wsf",
8585
"wsh"
86-
]
86+
],
87+
"logInfoChannelWebhook": "<put_your_webhook_here>",
88+
"logErrorChannelWebhook": "<put_your_webhook_here>"
8789
}

application/src/main/java/org/togetherjava/tjbot/Application.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import org.togetherjava.tjbot.commands.system.BotCore;
1313
import org.togetherjava.tjbot.config.Config;
1414
import org.togetherjava.tjbot.db.Database;
15+
import org.togetherjava.tjbot.logging.LogMarkers;
16+
import org.togetherjava.tjbot.logging.discord.DiscordLogging;
1517

1618
import java.io.IOException;
1719
import java.nio.file.Files;
@@ -57,6 +59,7 @@ public static void main(final String[] args) {
5759

5860
Thread.setDefaultUncaughtExceptionHandler(Application::onUncaughtException);
5961
Runtime.getRuntime().addShutdownHook(new Thread(Application::onShutdown));
62+
DiscordLogging.startDiscordLogging(config);
6063

6164
runBot(config);
6265
}
@@ -92,7 +95,7 @@ public static void runBot(Config config) {
9295

9396
logger.info("Bot is ready");
9497
} catch (InvalidTokenException e) {
95-
logger.error("Failed to login", e);
98+
logger.error(LogMarkers.SENSITIVE, "Failed to login", e);
9699
} catch (InterruptedException e) {
97100
logger.error("Interrupted while waiting for setup to complete", e);
98101
Thread.currentThread().interrupt();

application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdStore.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.togetherjava.tjbot.db.Database;
1313
import org.togetherjava.tjbot.db.generated.tables.ComponentIds;
1414
import org.togetherjava.tjbot.db.generated.tables.records.ComponentIdsRecord;
15+
import org.togetherjava.tjbot.logging.LogMarkers;
1516

1617
import java.time.Instant;
1718
import java.time.temporal.ChronoUnit;
@@ -323,8 +324,8 @@ private void logDebugSizeStatistics() {
323324
ComponentIds.COMPONENT_IDS.LIFESPAN.eq(lifespan.name())))));
324325
int recordsCount = lifespanToCount.values().stream().mapToInt(Integer::intValue).sum();
325326

326-
logger.debug("The component id store consists of {} records ({})", recordsCount,
327-
lifespanToCount);
327+
logger.debug(LogMarkers.SENSITIVE, "The component id store consists of {} records ({})",
328+
recordsCount, lifespanToCount);
328329
}
329330

330331
@Override

application/src/main/java/org/togetherjava/tjbot/commands/moderation/BanCommand.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.slf4j.LoggerFactory;
1919
import org.togetherjava.tjbot.commands.CommandVisibility;
2020
import org.togetherjava.tjbot.commands.SlashCommandAdapter;
21+
import org.togetherjava.tjbot.logging.LogMarkers;
2122

2223
import javax.annotation.Nullable;
2324
import java.time.Instant;
@@ -128,7 +129,8 @@ private static Optional<RestAction<InteractionHook>> handleNotAlreadyBannedRespo
128129
.setEphemeral(true));
129130
}
130131
}
131-
logger.warn("Something unexpected went wrong while trying to ban the user '{}'.",
132+
logger.warn(LogMarkers.SENSITIVE,
133+
"Something unexpected went wrong while trying to ban the user '{}'.",
132134
target.getAsTag(), alreadyBannedFailure);
133135
return Optional.of(event.reply("Failed to ban the user due to an unexpected problem.")
134136
.setEphemeral(true));
@@ -149,7 +151,7 @@ private AuditableRestAction<Void> banUser(User target, Member author,
149151
int deleteHistoryDays, Guild guild) {
150152
String durationMessage =
151153
temporaryData == null ? "permanently" : "for " + temporaryData.duration();
152-
logger.info(
154+
logger.info(LogMarkers.SENSITIVE,
153155
"'{}' ({}) banned the user '{}' ({}) {} from guild '{}' and deleted their message history of the last {} days, for reason '{}'.",
154156
author.getUser().getAsTag(), author.getId(), target.getAsTag(), target.getId(),
155157
durationMessage, guild.getName(), deleteHistoryDays, reason);

application/src/main/java/org/togetherjava/tjbot/commands/moderation/KickCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.slf4j.LoggerFactory;
1717
import org.togetherjava.tjbot.commands.CommandVisibility;
1818
import org.togetherjava.tjbot.commands.SlashCommandAdapter;
19+
import org.togetherjava.tjbot.logging.LogMarkers;
1920

2021
import javax.annotation.Nullable;
2122
import java.util.Objects;
@@ -82,7 +83,8 @@ private static RestAction<Boolean> sendDm(ISnowflake target, String reason, Guil
8283

8384
private AuditableRestAction<Void> kickUser(Member target, Member author, String reason,
8485
Guild guild) {
85-
logger.info("'{}' ({}) kicked the user '{}' ({}) from guild '{}' for reason '{}'.",
86+
logger.info(LogMarkers.SENSITIVE,
87+
"'{}' ({}) kicked the user '{}' ({}) from guild '{}' for reason '{}'.",
8688
author.getUser().getAsTag(), author.getId(), target.getUser().getAsTag(),
8789
target.getId(), guild.getName(), reason);
8890

application/src/main/java/org/togetherjava/tjbot/commands/moderation/MuteCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.togetherjava.tjbot.commands.CommandVisibility;
1515
import org.togetherjava.tjbot.commands.SlashCommandAdapter;
1616
import org.togetherjava.tjbot.config.Config;
17+
import org.togetherjava.tjbot.logging.LogMarkers;
1718

1819
import javax.annotation.Nullable;
1920
import java.time.Instant;
@@ -103,7 +104,8 @@ private AuditableRestAction<Void> muteUser(Member target, Member author,
103104
@Nullable ModerationUtils.TemporaryData temporaryData, String reason, Guild guild) {
104105
String durationMessage =
105106
temporaryData == null ? "permanently" : "for " + temporaryData.duration();
106-
logger.info("'{}' ({}) muted the user '{}' ({}) {} in guild '{}' for reason '{}'.",
107+
logger.info(LogMarkers.SENSITIVE,
108+
"'{}' ({}) muted the user '{}' ({}) {} in guild '{}' for reason '{}'.",
107109
author.getUser().getAsTag(), author.getId(), target.getUser().getAsTag(),
108110
target.getId(), durationMessage, guild.getName(), reason);
109111

application/src/main/java/org/togetherjava/tjbot/commands/moderation/NoteCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.slf4j.LoggerFactory;
1010
import org.togetherjava.tjbot.commands.CommandVisibility;
1111
import org.togetherjava.tjbot.commands.SlashCommandAdapter;
12+
import org.togetherjava.tjbot.logging.LogMarkers;
1213

1314
import javax.annotation.Nullable;
1415
import java.util.Objects;
@@ -77,7 +78,8 @@ private void sendNote(User target, Member author, String content, ISnowflake gui
7778
}
7879

7980
private void storeNote(User target, Member author, String content, ISnowflake guild) {
80-
logger.info("'{}' ({}) wrote a note about the user '{}' ({}) with content '{}'.",
81+
logger.info(LogMarkers.SENSITIVE,
82+
"'{}' ({}) wrote a note about the user '{}' ({}) with content '{}'.",
8183
author.getUser().getAsTag(), author.getId(), target.getAsTag(), target.getId(),
8284
content);
8385

application/src/main/java/org/togetherjava/tjbot/commands/moderation/QuarantineCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.togetherjava.tjbot.commands.CommandVisibility;
1414
import org.togetherjava.tjbot.commands.SlashCommandAdapter;
1515
import org.togetherjava.tjbot.config.Config;
16+
import org.togetherjava.tjbot.logging.LogMarkers;
1617

1718
import javax.annotation.Nullable;
1819
import java.util.Objects;
@@ -88,7 +89,8 @@ private static MessageEmbed sendFeedback(boolean hasSentDm, Member target, Membe
8889

8990
private AuditableRestAction<Void> quarantineUser(Member target, Member author, String reason,
9091
Guild guild) {
91-
logger.info("'{}' ({}) quarantined the user '{}' ({}) in guild '{}' for reason '{}'.",
92+
logger.info(LogMarkers.SENSITIVE,
93+
"'{}' ({}) quarantined the user '{}' ({}) in guild '{}' for reason '{}'.",
9294
author.getUser().getAsTag(), author.getId(), target.getUser().getAsTag(),
9395
target.getId(), guild.getName(), reason);
9496

application/src/main/java/org/togetherjava/tjbot/commands/moderation/RejoinModerationRoleListener.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.slf4j.LoggerFactory;
1111
import org.togetherjava.tjbot.commands.EventReceiver;
1212
import org.togetherjava.tjbot.config.Config;
13+
import org.togetherjava.tjbot.logging.LogMarkers;
1314

1415
import java.util.List;
1516
import java.util.Optional;
@@ -93,7 +94,8 @@ private boolean shouldApplyModerationRole(ModerationRole moderationRole,
9394

9495
private static void applyModerationRole(ModerationRole moderationRole, Member member) {
9596
Guild guild = member.getGuild();
96-
logger.info("Reapplied existing {} to user '{}' ({}) in guild '{}' after rejoining.",
97+
logger.info(LogMarkers.SENSITIVE,
98+
"Reapplied existing {} to user '{}' ({}) in guild '{}' after rejoining.",
9799
moderationRole.actionName, member.getUser().getAsTag(), member.getId(),
98100
guild.getName());
99101

0 commit comments

Comments
 (0)