1
- using Files . Common ;
2
- using System ;
3
- using System . Collections . Generic ;
1
+ using System ;
4
2
using System . Diagnostics ;
5
3
using System . IO ;
6
- using System . Linq ;
7
- using System . Text ;
8
4
using System . Threading ;
9
5
using System . Threading . Tasks ;
10
6
@@ -15,70 +11,65 @@ public class Logger
15
11
ILogWriter LogWriter { get ; }
16
12
SemaphoreSlim semaphoreSlim = new SemaphoreSlim ( 1 ) ;
17
13
18
- public Logger ( ILogWriter logWriter , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
14
+ public Logger ( ILogWriter logWriter )
19
15
{
20
16
LogWriter = logWriter ;
21
17
}
22
18
23
- public void Error ( Exception ex , string formattedException , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
19
+ public void Error ( Exception ex , string error = "" , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
24
20
{
25
- Log ( type : "ERROR" , caller : caller , message : $ "{ ex . Message } \n \t { formattedException } ") ;
21
+ LogAsync ( type : "ERROR" , caller : caller , message : $ "{ error } \n \t { ex } ") ;
26
22
}
27
23
28
- public void Error ( Exception ex , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
24
+ public void UnhandledError ( Exception ex , string error = "" , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
29
25
{
30
- Log ( type : "ERROR" , caller : caller , message : $ "{ ex . Message } \n \t { ex } ") ;
26
+ LogSync ( type : "ERROR" , caller : caller , message : $ "{ error } \n \t { ex } ") ;
31
27
}
32
28
33
29
public void Error ( string error , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
34
30
{
35
- Log ( type : "ERROR" , caller : caller , message : error ) ;
31
+ LogAsync ( type : "ERROR" , caller : caller , message : error ) ;
36
32
}
37
33
38
- public void Info ( string info , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
39
- {
40
- Log ( type : "INFO" , caller : caller , message : info ) ;
41
- }
42
-
43
- public void Warn ( Exception ex , string warning , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
34
+ public void Warn ( Exception ex , string warning = "" , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
44
35
{
45
- Log ( type : "WARN" , caller : caller , message : $ "{ warning } \n \t { ex } ") ;
36
+ LogAsync ( type : "WARN" , caller : caller , message : $ "{ warning } \n \t { ex } ") ;
46
37
}
47
38
48
39
public void Warn ( string warning , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
49
40
{
50
- Log ( type : "WARN" , caller : caller , message : warning ) ;
41
+ LogAsync ( type : "WARN" , caller : caller , message : warning ) ;
51
42
}
52
43
53
- public void Info ( Exception ex , string info , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
44
+ public void Info ( Exception ex , string info = "" , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
54
45
{
55
- Log ( type : "INFO" , caller : caller , message : $ "{ info } \n \t { ex } ") ;
46
+ LogAsync ( type : "INFO" , caller : caller , message : $ "{ info } \n \t { ex } ") ;
56
47
}
57
48
58
- public void Info ( string info , object obj , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
49
+ public void Info ( string info , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
59
50
{
60
- Log ( type : "INFO" , caller : caller , message : string . Format ( info , obj ) ) ;
51
+ LogAsync ( type : "INFO" , caller : caller , message : info ) ;
61
52
}
62
53
63
- public void Warn ( Exception ex , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
54
+ public void Info ( string info , object obj , [ System . Runtime . CompilerServices . CallerMemberName ] string caller = "" )
64
55
{
65
- Log ( type : "WARN " , caller : caller , message : $ " { ex . Message } \n \t { ex } " ) ;
56
+ LogAsync ( type : "INFO " , caller : caller , message : string . Format ( info , obj ) ) ;
66
57
}
67
58
68
- private async void Log ( string type , string caller , string message , int attemptNumber = 0 )
59
+ private async void LogAsync ( string type , string caller , string message , int attemptNumber = 0 )
69
60
{
70
61
try
71
62
{
72
63
await semaphoreSlim . WaitAsync ( ) ;
73
- await LogWriter . WriteLineToLog ( $ "{ DateTime . Now : yyyy-MM-dd HH:mm:ss.ffff} |{ type } |{ caller } |{ message } ") ;
64
+ await LogWriter . WriteLineToLogAsync ( $ "{ DateTime . Now : yyyy-MM-dd HH:mm:ss.ffff} |{ type } |{ caller } |{ message } ") ;
74
65
}
75
66
catch ( IOException e ) when ( ! ( e is FileNotFoundException ) )
76
67
{
77
68
if ( attemptNumber < 5 ) // check the attempt count to prevent a stack overflow exception
78
69
{
79
70
// Log is likely in use by another process instance, so wait then try again
80
71
await Task . Delay ( 50 ) ;
81
- Log ( type , caller , message , attemptNumber + 1 ) ;
72
+ LogAsync ( type , caller , message , attemptNumber + 1 ) ;
82
73
}
83
74
else
84
75
{
@@ -94,5 +85,22 @@ private async void Log(string type, string caller, string message, int attemptNu
94
85
semaphoreSlim . Release ( ) ;
95
86
}
96
87
}
88
+
89
+ private void LogSync ( string type , string caller , string message )
90
+ {
91
+ try
92
+ {
93
+ semaphoreSlim . Wait ( ) ;
94
+ LogWriter . WriteLineToLog ( $ "{ DateTime . Now : yyyy-MM-dd HH:mm:ss.ffff} |{ type } |{ caller } |{ message } ") ;
95
+ }
96
+ catch ( Exception e )
97
+ {
98
+ Debug . WriteLine ( $ "Writing to log file failed with the following exception:\n { e } ") ;
99
+ }
100
+ finally
101
+ {
102
+ semaphoreSlim . Release ( ) ;
103
+ }
104
+ }
97
105
}
98
106
}
0 commit comments