@@ -4,18 +4,43 @@ public class LogService : ILogService
44 {
55 private readonly List < LogEntry > _logs = new ( ) ;
66 private readonly object _lock = new ( ) ;
7+ private const string LogFilePath = "logs/log.txt" ;
8+
9+ public LogService ( )
10+ {
11+ Directory . CreateDirectory ( "logs" ) ;
12+
13+ // Load existing logs from file at startup
14+ if ( File . Exists ( LogFilePath ) )
15+ {
16+ var lines = File . ReadAllLines ( LogFilePath ) ;
17+ foreach ( var line in lines )
18+ {
19+ var entry = ParseLogLine ( line ) ;
20+ if ( entry != null )
21+ _logs . Add ( entry ) ;
22+ }
23+ }
24+ }
725
826 public void Log ( string message , string level = "INFO" , string ? context = null )
927 {
10- var entry = new LogEntry { Message = message , Level = level , Context = context } ;
28+ var entry = new LogEntry
29+ {
30+ Message = message ,
31+ Level = level ,
32+ Context = context ,
33+ Timestamp = DateTime . UtcNow
34+ } ;
35+
1136 lock ( _lock )
1237 {
1338 _logs . Add ( entry ) ;
14- if ( _logs . Count > 1000 ) _logs . RemoveAt ( 0 ) ; // keep memory usage in check
15- }
39+ if ( _logs . Count > 10000 ) _logs . RemoveAt ( 0 ) ; // optional trim
1640
17- // Optional: Also write to file
18- File . AppendAllText ( "logs/log.txt" , $ "{ entry . Timestamp : o} [{ level } ] ({ context } ) { message } { Environment . NewLine } ") ;
41+ File . AppendAllText ( LogFilePath ,
42+ $ "{ entry . Timestamp : o} [{ entry . Level } ] ({ entry . Context } ) { entry . Message } { Environment . NewLine } ") ;
43+ }
1944 }
2045
2146 public IEnumerable < LogEntry > GetLogs ( )
@@ -25,5 +50,39 @@ public IEnumerable<LogEntry> GetLogs()
2550 return _logs . ToList ( ) ;
2651 }
2752 }
53+
54+ private LogEntry ? ParseLogLine ( string line )
55+ {
56+ try
57+ {
58+ // Format: 2025-06-02T12:34:56.7890000Z [INFO] (Context) Message
59+ var timestampEnd = line . IndexOf ( '[' ) - 1 ;
60+ var timestamp = DateTime . Parse ( line . Substring ( 0 , timestampEnd ) . Trim ( ) ) ;
61+
62+ var levelStart = line . IndexOf ( '[' ) + 1 ;
63+ var levelEnd = line . IndexOf ( ']' ) ;
64+ var level = line . Substring ( levelStart , levelEnd - levelStart ) ;
65+
66+ var contextStart = line . IndexOf ( '(' , levelEnd ) + 1 ;
67+ var contextEnd = line . IndexOf ( ')' , contextStart ) ;
68+ var context = line . Substring ( contextStart , contextEnd - contextStart ) ;
69+
70+ var messageStart = line . IndexOf ( ')' , contextEnd ) + 2 ;
71+ var message = line . Substring ( messageStart ) ;
72+
73+ return new LogEntry
74+ {
75+ Timestamp = timestamp ,
76+ Level = level ,
77+ Context = context ,
78+ Message = message
79+ } ;
80+ }
81+ catch
82+ {
83+ // Ignore malformed lines
84+ return null ;
85+ }
86+ }
2887 }
2988}
0 commit comments