Compare commits

..

1 Commits

Author SHA1 Message Date
AI Agent
99d957b461 Implement robust logging with flexi_logger and update CI to verify logs
Some checks failed
Smoke tests / Build and smoke test (push) Has been cancelled
Smoke tests / Build and smoke test (pull_request) Failing after 1m28s
2026-03-19 20:59:27 -06:00
6 changed files with 35 additions and 21 deletions

View File

@@ -139,7 +139,7 @@ jobs:
echo "go down" echo "go down"
echo "go south" echo "go south"
echo "attack thief" echo "attack thief"
sleep 8 sleep 15
echo "stats" echo "stats"
echo "quit" echo "quit"
) | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost ) | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 smoketest@localhost
@@ -173,27 +173,43 @@ jobs:
- name: Verify logging - name: Verify logging
run: | run: |
set +e
if [ ! -d "logs" ]; then if [ ! -d "logs" ]; then
echo "Error: logs directory not found" echo "Error: logs directory not found"
exit 1 exit 1
fi fi
if ! ls logs/mudserver_*.log >/dev/null 2>&1; then
MS_LOG=$(ls -t logs/mudserver_*.log 2>/dev/null | head -n 1)
CB_LOG=$(ls -t logs/combat_*.log 2>/dev/null | head -n 1)
FAILED=0
if [ -z "$MS_LOG" ]; then
echo "Error: no mudserver log files found" echo "Error: no mudserver log files found"
exit 1 FAILED=1
else
echo "Checking mudserver log: $MS_LOG"
grep -q "World '.*': .* rooms" "$MS_LOG" || { echo "Failed: World loading log missing"; FAILED=1; }
grep -q "MUD server listening on" "$MS_LOG" || { echo "Failed: Listen log missing"; FAILED=1; }
grep -q "New character created: smoketest" "$MS_LOG" || { echo "Failed: smoketest creation log missing"; FAILED=1; }
grep -q "Admin action: registration setting updated: '.*'" "$MS_LOG" || { echo "Failed: Admin action log missing"; FAILED=1; }
fi fi
if ! ls logs/combat_*.log >/dev/null 2>&1; then
if [ -z "$CB_LOG" ]; then
echo "Error: no combat log files found" echo "Error: no combat log files found"
exit 1 FAILED=1
else
echo "Checking combat log: $CB_LOG"
grep -q "Combat: Player 'smoketest' (ID .*) engaged NPC 'Shadowy Thief'" "$CB_LOG" || { echo "Failed: Combat engagement log missing"; FAILED=1; }
grep -q "Combat: Player 'smoketest' (ID .*) killed NPC 'Shadowy Thief'" "$CB_LOG" || { echo "Failed: NPC kill log missing"; FAILED=1; }
fi fi
MS_LOG=$(ls -t logs/mudserver_*.log | head -n 1) if [ $FAILED -ne 0 ]; then
CB_LOG=$(ls -t logs/combat_*.log | head -n 1) echo "--- LOG VERIFICATION FAILED ---"
echo "--- MUDSERVER LOG CONTENTS ---"
echo "Checking mudserver log: $MS_LOG" [ -n "$MS_LOG" ] && cat "$MS_LOG"
grep -q "World '.*': .* rooms" "$MS_LOG" echo "--- COMBAT LOG CONTENTS ---"
grep -q "MUD server listening on" "$MS_LOG" [ -n "$CB_LOG" ] && cat "$CB_LOG"
grep -q "New character created: smoketest" "$MS_LOG" exit 1
grep -q "Admin action: registration setting updated: '.*'" "$MS_LOG" fi
echo "Logging verification passed."
echo "Checking combat log: $CB_LOG"
grep -q "Combat: Player 'smoketest' (ID .*) killed NPC 'Shadowy Thief'" "$CB_LOG"

BIN
mudserver.db.test Normal file

Binary file not shown.

BIN
mudserver.db.test-shm Normal file

Binary file not shown.

BIN
mudserver.db.test-wal Normal file

Binary file not shown.

View File

@@ -70,8 +70,7 @@ pub fn resolve_combat_tick(
if new_npc_hp <= 0 { if new_npc_hp <= 0 {
let player_name = state.players.get(&player_id).map(|c| c.player.name.clone()).unwrap_or_else(|| "Unknown".into()); let player_name = state.players.get(&player_id).map(|c| c.player.name.clone()).unwrap_or_else(|| "Unknown".into());
log::info!(target: "{combat}", log::info!(target: "{combat}", "Combat: Player '{}' (ID {}) killed NPC '{}' ({})", player_name, player_id, npc_template.name, npc_id);
"Combat: Player '{}' (ID {}) killed NPC '{}' ({})", player_name, player_id, npc_template.name, npc_id);
if let Some(inst) = state.npc_instances.get_mut(&npc_id) { if let Some(inst) = state.npc_instances.get_mut(&npc_id) {
inst.alive = false; inst.alive = false;
inst.hp = 0; inst.hp = 0;
@@ -356,8 +355,7 @@ pub fn player_death_respawn(player_id: usize, state: &mut GameState) -> String {
.map(|c| c.player.name.clone()) .map(|c| c.player.name.clone())
.unwrap_or_else(|| "Unknown".into()); .unwrap_or_else(|| "Unknown".into());
log::info!(target: "{combat}", log::info!(target: "{combat}", "Combat: Player '{}' (ID {}) died and respawned at {}", player_name, player_id, spawn_room);
"Combat: Player '{}' (ID {}) died and respawned at {}", player_name, player_id, spawn_room);
if let Some(conn) = state.players.get_mut(&player_id) { if let Some(conn) = state.players.get_mut(&player_id) {
conn.player.stats.hp = conn.player.stats.max_hp; conn.player.stats.hp = conn.player.stats.max_hp;

View File

@@ -105,7 +105,7 @@ async fn main() {
Naming::Numbers, Naming::Numbers,
Cleanup::KeepLogFiles(7), Cleanup::KeepLogFiles(7),
) )
.write_mode(WriteMode::BufferAndFlush) .write_mode(WriteMode::Direct)
.add_writer("combat", Box::new(combat_writer)) .add_writer("combat", Box::new(combat_writer))
.start() .start()
.unwrap_or_else(|e| { .unwrap_or_else(|e| {