Hello, blightmud-batmud-logger

This commit is contained in:
2026-05-15 14:38:26 +02:00
commit d86ec87c95
4 changed files with 86 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
{
"Lua.diagnostics.globals": ["cformat", "mud"]
}
+15
View File
@@ -0,0 +1,15 @@
FROM alpine:3.19
# zstd for compression, tzdata so cron fires at correct local time
RUN apk add --no-cache zstd tzdata
COPY compress.sh /usr/local/bin/compress.sh
RUN chmod +x /usr/local/bin/compress.sh
# Install crontab: run compress at 02:00 every night
RUN echo "0 2 * * * /usr/local/bin/compress.sh > /proc/1/fd/1 2>&1" \
| crontab -
# crond -f: foreground (required for containers)
# crond -l 2: log level warning and above
CMD ["crond", "-f", "-l", "2"]
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env sh
# Compress all .log files not modified today across all character subdirs.
# Expects /logs to be mounted from the host.
LOG_DIR="${LOG_DIR:-/logs}"
TODAY=$(date +%Y-%m-%d)
find "$LOG_DIR" -maxdepth 2 -name "*.log" | while read -r f; do
FILE_DATE=$(date -r "$f" +%Y-%m-%d 2>/dev/null)
if [ "$FILE_DATE" = "$TODAY" ]; then
echo "[$(date +%H:%M:%S)] Skipping active log: $f"
continue
fi
echo "[$(date +%H:%M:%S)] Compressing: $f"
if zstd -19 --rm -q "$f"; then
echo "[$(date +%H:%M:%S)] Done: ${f}.zst"
else
echo "[$(date +%H:%M:%S)] ERROR compressing: $f" >&2
fi
done
echo "[$(date +%H:%M:%S)] Compression run complete."
+44
View File
@@ -0,0 +1,44 @@
OUTPUT = ":"
INPUT = ">"
local current_log_filepath = nil
local current_log_file = nil
local get_current_log_filepath = function()
local date = os.date("%Y-%m-%d")
local data_home = os.getenv("XDG_DATA_HOME") or string.format("%s/.local/share", os.getenv("HOME"))
return string.format("%s/blightmud/logs/batmud/%s/%s.log", data_home, os.getenv("BATMUD_CHAR"), date)
end
local write_log = function(line, type)
local path = get_current_log_filepath()
if current_log_filepath == nil or current_log_filepath ~= path then
current_log_filepath = path
os.execute(string.format("mkdir -p %q", path:match("^(.*)/[^/]+$")))
current_log_file = assert(io.open(path, "a"))
end
local log_line = cformat("<black>[%s]%s<reset> %s\n", os.date("%H:%M:%S"), type, line)
if current_log_file ~= nil then
assert(current_log_file:write(log_line))
assert(current_log_file:flush())
end
end
mud.add_output_listener(function(line)
if not line:skip_log() then
if line:replacement() == nil then
write_log(line:raw(), OUTPUT)
else
write_log(line:replacement(), OUTPUT)
end
end
return line
end)
mud.add_input_listener(function(line)
if not line:skip_log() then
write_log(line:raw(), INPUT)
end
return line
end)