@@ -24,10 +24,22 @@ export enum LogLevel {
2424 CRITICAL = 4 ,
2525}
2626
27+ // Buffer to store early logs before debug mode is determined
28+ interface BufferedLog {
29+ logger : Logger ;
30+ level : LogLevel ;
31+ levelName : string ;
32+ levelColor : string ;
33+ message : string ;
34+ args : unknown [ ] ;
35+ }
36+
2737class Logger {
2838 private name : string ;
2939 private static globalLevel : LogLevel = LogLevel . WARN ;
3040 private static isDebugMode : boolean = false ;
41+ private static earlyLogs : BufferedLog [ ] = [ ] ;
42+ private static bufferEarlyLogs : boolean = true ;
3143
3244 constructor ( name : string ) {
3345 this . name = name ;
@@ -36,6 +48,28 @@ class Logger {
3648 static setDebugMode ( enabled : boolean ) : void {
3749 Logger . isDebugMode = enabled ;
3850 Logger . globalLevel = enabled ? LogLevel . DEBUG : LogLevel . WARN ;
51+
52+ // Stop buffering after debug mode is set
53+ Logger . bufferEarlyLogs = false ;
54+
55+ // Replay buffered logs if debug mode is enabled
56+ if ( enabled && Logger . earlyLogs . length > 0 ) {
57+ console . log ( '[zeroeval] Replaying buffered debug logs...' ) ;
58+ for ( const log of Logger . earlyLogs ) {
59+ if ( Logger . globalLevel <= log . level ) {
60+ const fn = log . level <= LogLevel . INFO ? console . log : console . error ;
61+ fn (
62+ log . logger . formatMessage (
63+ log . levelName ,
64+ log . levelColor ,
65+ log . message
66+ ) ,
67+ ...log . args
68+ ) ;
69+ }
70+ }
71+ Logger . earlyLogs = [ ] ;
72+ }
3973 }
4074
4175 static isDebugEnabled ( ) : boolean {
@@ -66,12 +100,38 @@ class Logger {
66100 }
67101
68102 debug ( message : string , ...args : unknown [ ] ) : void {
103+ // Buffer debug logs if we haven't determined debug mode yet
104+ if ( Logger . bufferEarlyLogs && LogLevel . DEBUG >= Logger . globalLevel ) {
105+ Logger . earlyLogs . push ( {
106+ logger : this ,
107+ level : LogLevel . DEBUG ,
108+ levelName : 'DEBUG' ,
109+ levelColor : colors . blue ,
110+ message,
111+ args,
112+ } ) ;
113+ return ;
114+ }
115+
69116 if ( Logger . globalLevel <= LogLevel . DEBUG ) {
70117 console . log ( this . formatMessage ( 'DEBUG' , colors . blue , message ) , ...args ) ;
71118 }
72119 }
73120
74121 info ( message : string , ...args : unknown [ ] ) : void {
122+ // Buffer info logs if we haven't determined debug mode yet
123+ if ( Logger . bufferEarlyLogs && LogLevel . INFO >= Logger . globalLevel ) {
124+ Logger . earlyLogs . push ( {
125+ logger : this ,
126+ level : LogLevel . INFO ,
127+ levelName : 'INFO' ,
128+ levelColor : colors . green ,
129+ message,
130+ args,
131+ } ) ;
132+ return ;
133+ }
134+
75135 if ( Logger . globalLevel <= LogLevel . INFO ) {
76136 console . log ( this . formatMessage ( 'INFO' , colors . green , message ) , ...args ) ;
77137 }
0 commit comments