Logger/src/Logger.Mod
Antranig Vartanian 7b4a1a6c1f
init
2025-06-15 03:48:15 +04:00

124 lines
3.3 KiB
Modula-2

MODULE Logger;
IMPORT Out, time;
CONST
ERROR* = 0;
WARN* = 1;
INFO* = 2;
DEBUG* = 3;
TYPE
Logger* = POINTER TO LoggerDesc;
LoggerDesc = RECORD
level: INTEGER;
prefix: ARRAY 64 OF CHAR;
END;
PROCEDURE New*(): Logger;
VAR self: Logger;
BEGIN
NEW(self);
self.level := INFO;
self.prefix[0] := 0X;
RETURN self
END New;
PROCEDURE (self: Logger) SetLevel*(level: INTEGER);
BEGIN
self.level := level
END SetLevel;
PROCEDURE (self: Logger) SetPrefix*(p: ARRAY OF CHAR);
VAR i: INTEGER;
BEGIN
i := 0;
WHILE (i < LEN(p)) & (p[i] # 0X) DO
self.prefix[i] := p[i]; INC(i)
END;
self.prefix[i] := 0X
END SetPrefix;
PROCEDURE (self: Logger) ClearPrefix*;
BEGIN
self.prefix[0] := 0X
END ClearPrefix;
PROCEDURE PrintTime;
VAR year, month, day, hour, min, sec: LONGINT;
BEGIN
time.Now(year, month, day, hour, min, sec);
Out.Int(year, 0); Out.Char("-");
IF month < 10 THEN Out.Char("0") END; Out.Int(month, 0); Out.Char("-");
IF day < 10 THEN Out.Char("0") END; Out.Int(day, 0); Out.Char("T");
IF hour < 10 THEN Out.Char("0") END; Out.Int(hour, 0); Out.Char(":");
IF min < 10 THEN Out.Char("0") END; Out.Int(min, 0); Out.Char(":");
IF sec < 10 THEN Out.Char("0") END; Out.Int(sec, 0);
Out.Char("Z")
END PrintTime;
PROCEDURE PrintMsg(self: Logger; levelStr, msg: ARRAY OF CHAR);
BEGIN
Out.String("["); PrintTime(); Out.String("] ");
Out.String("["); Out.String(levelStr); Out.String("] ");
IF self.prefix[0] # 0X THEN
Out.String("["); Out.String(self.prefix); Out.String("] ");
END;
Out.String(msg); Out.Ln
END PrintMsg;
PROCEDURE PrintMsgWithInt(self: Logger; levelStr, msg: ARRAY OF CHAR; n: INTEGER);
BEGIN
Out.String("["); PrintTime(); Out.String("] ");
Out.String("["); Out.String(levelStr); Out.String("] ");
IF self.prefix[0] # 0X THEN
Out.String("["); Out.String(self.prefix); Out.String("] ");
END;
Out.String(msg); Out.Int(n, 0); Out.Ln
END PrintMsgWithInt;
(* ===== Logging Methods ===== *)
PROCEDURE (self: Logger) Error*(msg: ARRAY OF CHAR);
BEGIN
IF self.level >= ERROR THEN PrintMsg(self, "ERROR", msg) END
END Error;
PROCEDURE (self: Logger) ErrorInt*(msg: ARRAY OF CHAR; n: INTEGER);
BEGIN
IF self.level >= ERROR THEN PrintMsgWithInt(self, "ERROR", msg, n) END
END ErrorInt;
PROCEDURE (self: Logger) Warn*(msg: ARRAY OF CHAR);
BEGIN
IF self.level >= WARN THEN PrintMsg(self, "WARN", msg) END
END Warn;
PROCEDURE (self: Logger) WarnInt*(msg: ARRAY OF CHAR; n: INTEGER);
BEGIN
IF self.level >= WARN THEN PrintMsgWithInt(self, "WARN", msg, n) END
END WarnInt;
PROCEDURE (self: Logger) Info*(msg: ARRAY OF CHAR);
BEGIN
IF self.level >= INFO THEN PrintMsg(self, "INFO", msg) END
END Info;
PROCEDURE (self: Logger) InfoInt*(msg: ARRAY OF CHAR; n: INTEGER);
BEGIN
IF self.level >= INFO THEN PrintMsgWithInt(self, "INFO", msg, n) END
END InfoInt;
PROCEDURE (self: Logger) Debug*(msg: ARRAY OF CHAR);
BEGIN
IF self.level >= DEBUG THEN PrintMsg(self, "DEBUG", msg) END
END Debug;
PROCEDURE (self: Logger) DebugInt*(msg: ARRAY OF CHAR; n: INTEGER);
BEGIN
IF self.level >= DEBUG THEN PrintMsgWithInt(self, "DEBUG", msg, n) END
END DebugInt;
END Logger.