aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton@traccar.org>2024-06-09 13:37:45 -0700
committerAnton Tananaev <anton@traccar.org>2024-06-09 13:37:45 -0700
commite92dea78ebad3f921c031a974378a218c6bd90b1 (patch)
tree4e9f39855c9137fb203dde85ec16535ee0cdce10
parent2147ecb2d9fe0fb49b3f03dc650bc363e72e3fd2 (diff)
downloadtrackermap-server-e92dea78ebad3f921c031a974378a218c6bd90b1.tar.gz
trackermap-server-e92dea78ebad3f921c031a974378a218c6bd90b1.tar.bz2
trackermap-server-e92dea78ebad3f921c031a974378a218c6bd90b1.zip
Decode text data in logs (fix #5336)
-rw-r--r--src/main/java/org/traccar/config/Keys.java8
-rw-r--r--src/main/java/org/traccar/handler/network/StandardLoggingHandler.java20
2 files changed, 27 insertions, 1 deletions
diff --git a/src/main/java/org/traccar/config/Keys.java b/src/main/java/org/traccar/config/Keys.java
index 91d5dac5d..e51ba07c4 100644
--- a/src/main/java/org/traccar/config/Keys.java
+++ b/src/main/java/org/traccar/config/Keys.java
@@ -1902,6 +1902,14 @@ public final class Keys {
true);
/**
+ * If all bytes are printable characters, log network data as text instead of HEX.
+ */
+ public static final ConfigKey<Boolean> LOGGER_TEXT_PROTOCOL = new BooleanConfigKey(
+ "logger.decodeTextData",
+ List.of(KeyType.CONFIG),
+ true);
+
+ /**
* Log file rotation interval, the default rotation interval is once a day.
* This option is ignored if 'logger.rotate' = false
* Available options: day, hour
diff --git a/src/main/java/org/traccar/handler/network/StandardLoggingHandler.java b/src/main/java/org/traccar/handler/network/StandardLoggingHandler.java
index dae93655d..f6ee08756 100644
--- a/src/main/java/org/traccar/handler/network/StandardLoggingHandler.java
+++ b/src/main/java/org/traccar/handler/network/StandardLoggingHandler.java
@@ -24,22 +24,33 @@ import jakarta.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.traccar.NetworkMessage;
+import org.traccar.config.Config;
+import org.traccar.config.Keys;
+import org.traccar.helper.BufferUtil;
import org.traccar.helper.NetworkUtil;
import org.traccar.model.LogRecord;
import org.traccar.session.ConnectionManager;
+import java.nio.charset.StandardCharsets;
+
public class StandardLoggingHandler extends ChannelDuplexHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(StandardLoggingHandler.class);
private final String protocol;
private ConnectionManager connectionManager;
+ private boolean decodeTextData;
public StandardLoggingHandler(String protocol) {
this.protocol = protocol;
}
@Inject
+ public void setConfig(Config config) {
+ decodeTextData = config.getBoolean(Keys.LOGGER_TEXT_PROTOCOL);
+ }
+
+ @Inject
public void setConnectionManager(ConnectionManager connectionManager) {
this.connectionManager = connectionManager;
}
@@ -66,7 +77,14 @@ public class StandardLoggingHandler extends ChannelDuplexHandler {
if (networkMessage.getMessage() instanceof ByteBuf) {
LogRecord record = new LogRecord(ctx.channel().localAddress(), networkMessage.getRemoteAddress());
record.setProtocol(protocol);
- record.setData(ByteBufUtil.hexDump((ByteBuf) networkMessage.getMessage()));
+ ByteBuf data = (ByteBuf) networkMessage.getMessage();
+ if (decodeTextData && BufferUtil.isPrintable(data, data.readableBytes())) {
+ record.setData(data.getCharSequence(
+ data.readerIndex(), data.readableBytes(), StandardCharsets.US_ASCII).toString()
+ .replace("\r", "\\r").replace("\n", "\\n"));
+ } else {
+ record.setData(ByteBufUtil.hexDump(data));
+ }
return record;
}
}