1+ using System ;
2+ using System . Text ;
3+ using Microsoft . Extensions . Logging ;
4+ using Xunit . Abstractions ;
5+
6+ namespace WorkflowCore . Testing
7+ {
8+ internal class XUnitLogger : ILogger
9+ {
10+ private readonly ITestOutputHelper _testOutputHelper ;
11+ private readonly string _categoryName ;
12+ private readonly LoggerExternalScopeProvider _scopeProvider ;
13+
14+ public static ILogger CreateLogger ( ITestOutputHelper testOutputHelper ) =>
15+ new XUnitLogger ( testOutputHelper , new LoggerExternalScopeProvider ( ) , "" ) ;
16+
17+ public static ILogger < T > CreateLogger < T > ( ITestOutputHelper testOutputHelper ) =>
18+ new XUnitLogger < T > ( testOutputHelper , new LoggerExternalScopeProvider ( ) ) ;
19+
20+ public XUnitLogger ( ITestOutputHelper testOutputHelper , LoggerExternalScopeProvider scopeProvider ,
21+ string categoryName )
22+ {
23+ _testOutputHelper = testOutputHelper ;
24+ _scopeProvider = scopeProvider ;
25+ _categoryName = categoryName ;
26+ }
27+
28+ public bool IsEnabled ( LogLevel logLevel ) => logLevel != LogLevel . None ;
29+
30+ public IDisposable BeginScope < TState > ( TState state ) => _scopeProvider . Push ( state ) ;
31+
32+ public void Log < TState > ( LogLevel logLevel , EventId eventId , TState state , Exception exception ,
33+ Func < TState , Exception , string > formatter )
34+ {
35+ if ( _testOutputHelper == null ) return ;
36+ var sb = new StringBuilder ( ) ;
37+ sb . Append ( DateTime . Now . ToString ( "HH:mm:ss.fff" ) )
38+ . Append ( " " )
39+ . Append ( GetLogLevelString ( logLevel ) )
40+ . Append ( " [" ) . Append ( _categoryName ) . Append ( "] " )
41+ . Append ( formatter ( state , exception ) ) ;
42+
43+ if ( exception != null )
44+ {
45+ sb . Append ( '\n ' ) . Append ( exception ) ;
46+ }
47+
48+ // Append scopes
49+ _scopeProvider . ForEachScope ( ( scope , s ) =>
50+ {
51+ s . Append ( "\n => " ) ;
52+ s . Append ( scope ) ;
53+ } , sb ) ;
54+
55+ _testOutputHelper . WriteLine ( sb . ToString ( ) ) ;
56+ }
57+
58+ private static string GetLogLevelString ( LogLevel logLevel )
59+ {
60+ return logLevel . ToString ( ) . ToUpper ( ) ;
61+ }
62+ }
63+
64+ internal sealed class XUnitLogger < T > : XUnitLogger , ILogger < T >
65+ {
66+ public XUnitLogger ( ITestOutputHelper testOutputHelper , LoggerExternalScopeProvider scopeProvider )
67+ : base ( testOutputHelper , scopeProvider , typeof ( T ) . FullName )
68+ {
69+ }
70+ }
71+
72+ internal sealed class XUnitLoggerProvider : ILoggerProvider
73+ {
74+ private readonly ITestOutputHelper _testOutputHelper ;
75+ private readonly LoggerExternalScopeProvider _scopeProvider = new LoggerExternalScopeProvider ( ) ;
76+
77+ public XUnitLoggerProvider ( ITestOutputHelper testOutputHelper )
78+ {
79+ _testOutputHelper = testOutputHelper ;
80+ }
81+
82+ public ILogger CreateLogger ( string categoryName )
83+ {
84+ return new XUnitLogger ( _testOutputHelper , _scopeProvider , categoryName ) ;
85+ }
86+
87+ public void Dispose ( )
88+ {
89+ }
90+ }
91+ }
0 commit comments