refactor: add persistence groundwork and structured logging

This commit is contained in:
2026-07-20 21:48:08 +02:00
parent 7dde7378b8
commit 5fd48d1971
19 changed files with 567 additions and 200 deletions
+22 -15
View File
@@ -10,6 +10,9 @@ import {
ServerStartCommand,
ServerStopCommand
} from "server-manager-shared";
import { getLogger } from "./logger";
const logger = getLogger("Wrapper");
class Wrapper {
@@ -36,6 +39,7 @@ class Wrapper {
const config =
loadConfig();
logger.info("Konfiguration geladen");
if(config.wrapperId){
@@ -46,7 +50,7 @@ class Wrapper {
console.log(
logger.debug(
"Starte mit vorhandener ID:",
this.id
);
@@ -55,7 +59,7 @@ class Wrapper {
}else{
console.log(
logger.warn(
"Keine Wrapper ID vorhanden - neue Registrierung"
);
@@ -77,8 +81,8 @@ class Wrapper {
console.log(
"RabbitMQ verbunden"
logger.info(
"RabbitMQ Verbindung hergestellt"
);
@@ -136,9 +140,9 @@ class Wrapper {
console.log(
logger.debug(
"Antwort vom Manager:",
data
data.type
);
@@ -162,14 +166,17 @@ class Wrapper {
console.log(
logger.info(
"Registrierung beim Manager erfolgreich"
);
logger.debug(
"Wrapper ID gespeichert:",
this.id
);
if(!this.id){
console.error(
logger.error(
"Keine Wrapper ID erhalten!"
);
@@ -272,7 +279,7 @@ class Wrapper {
console.log(
logger.debug(
"Registrierung gesendet",
this.id ?? "ohne ID"
);
@@ -319,7 +326,7 @@ class Wrapper {
message?: unknown;
};
console.log(
logger.debug(
"TEST COMMAND:",
command.message
);
@@ -356,9 +363,9 @@ class Wrapper {
default:
console.log(
logger.warn(
"Unbekannter Command:",
rawCommand
commandType
);
@@ -376,7 +383,7 @@ class Wrapper {
console.log(
logger.debug(
"Warte auf Commands:",
queue
);
@@ -392,7 +399,7 @@ class Wrapper {
heartbeat(){
console.log("Heartbeat gestartet");
logger.debug("Heartbeat gestartet");
setInterval(()=>{
@@ -438,7 +445,7 @@ class Wrapper {
console.log(
logger.debug(
"Heartbeat gesendet"
);
+62
View File
@@ -0,0 +1,62 @@
declare const process: {
env: Record<string, string | undefined>;
};
type LogLevel = "DEBUG" | "INFO" | "WARN" | "ERROR";
const LEVELS: Record<LogLevel, number> = {
DEBUG: 0,
INFO: 1,
WARN: 2,
ERROR: 3,
};
const DEFAULT_LOG_LEVEL: LogLevel = "INFO";
const configuredLevel =
(process.env.LOG_LEVEL ?? "").toUpperCase() as LogLevel;
const currentLogLevel: LogLevel =
configuredLevel in LEVELS ? configuredLevel : DEFAULT_LOG_LEVEL;
const currentLogLevelValue = LEVELS[currentLogLevel];
function shouldLog(level: LogLevel): boolean {
return LEVELS[level] >= currentLogLevelValue;
}
function formatMessage(
level: LogLevel,
component: string,
message: unknown
): string {
return `${new Date().toISOString()} ${level} [${component}] ${message}`;
}
class Logger {
constructor(private component: string) {}
debug(message: unknown, ...args: unknown[]): void {
if (!shouldLog("DEBUG")) return;
console.log(formatMessage("DEBUG", this.component, message), ...args);
}
info(message: unknown, ...args: unknown[]): void {
if (!shouldLog("INFO")) return;
console.log(formatMessage("INFO", this.component, message), ...args);
}
warn(message: unknown, ...args: unknown[]): void {
if (!shouldLog("WARN")) return;
console.warn(formatMessage("WARN", this.component, message), ...args);
}
error(message: unknown, ...args: unknown[]): void {
if (!shouldLog("ERROR")) return;
console.error(formatMessage("ERROR", this.component, message), ...args);
}
}
export function getLogger(component: string): Logger {
return new Logger(component);
}
+10 -18
View File
@@ -1,6 +1,9 @@
import { spawn, ChildProcess } from "child_process";
import { ServerStartCommand } from "server-manager-shared";
import { SERVER_SCRIPT_PATH, SERVER_WORKING_DIRECTORY } from "./config";
import { getLogger } from "./logger";
const logger = getLogger("ProcessManager");
interface ServerProcess {
@@ -46,7 +49,7 @@ export class ProcessManager {
console.log(
logger.debug(
"Starte Game Server:",
data.name
);
@@ -89,11 +92,9 @@ export class ProcessManager {
data=>{
console.log(
logger.debug(
`[${data.name}]`,
data.toString()
);
@@ -112,7 +113,7 @@ export class ProcessManager {
data=>{
console.error(
logger.error(
"SERVER ERROR:",
data.toString()
@@ -141,7 +142,7 @@ export class ProcessManager {
if(server){
console.log(
logger.info(
"Server beendet:",
server.name,
code
@@ -199,18 +200,12 @@ export class ProcessManager {
console.log(
logger.info(
"Server gestartet:",
{
id:data.serverId,
pid:process.pid
}
);
@@ -238,7 +233,7 @@ export class ProcessManager {
if(!server){
console.log(
logger.warn(
"Server nicht gefunden:",
@@ -256,12 +251,9 @@ export class ProcessManager {
console.log(
logger.debug(
"Stoppe Server:",
server.name
);
+6 -8
View File
@@ -1,7 +1,9 @@
import { queryGameServerInfo } from "steam-server-query";
import { ProcessManager } from "./processManager";
import { WRAPPER_QUERY_INTERVAL } from "./config";
import { getLogger } from "./logger";
const logger = getLogger("QueryManager");
export class QueryManager {
@@ -16,7 +18,7 @@ export class QueryManager {
start(){
console.log(
logger.debug(
"Query Manager gestartet"
);
@@ -73,12 +75,10 @@ export class QueryManager {
console.log(
"Query:",
logger.debug(
"Query erfolgreich:",
server.name,
`${server.players}/${server.maxPlayers}`
);
@@ -86,11 +86,9 @@ export class QueryManager {
catch(err){
console.log(
logger.warn(
"Query fehlgeschlagen:",
server.name
);
+4 -5
View File
@@ -4,7 +4,9 @@ import os from "os";
import { QueryManager } from "./queryManager";
import { WrapperStatusMessage } from "server-manager-shared";
import { WRAPPER_STATUS_INTERVAL } from "./config";
import { getLogger } from "./logger";
const logger = getLogger("StatusReporter");
export class StatusReporter {
@@ -25,7 +27,7 @@ export class StatusReporter {
start(){
console.log(
logger.debug(
"Status Reporter gestartet"
);
@@ -147,12 +149,9 @@ export class StatusReporter {
console.log(
logger.debug(
"Status gesendet:",
servers.length,
"Server"
);