@@ -5,10 +5,12 @@ namespace Netcorext.Logging.HttpClientLogger;
55
66public class CustomLoggingHttpMessageHandler : DelegatingHandler
77{
8+ private readonly CustomLoggingOptions _options ;
89 private readonly ILogger _logger ;
910
10- public CustomLoggingHttpMessageHandler ( ILogger logger )
11+ public CustomLoggingHttpMessageHandler ( CustomLoggingOptions options , ILogger logger )
1112 {
13+ _options = options ;
1214 _logger = logger ?? throw new ArgumentNullException ( nameof ( logger ) ) ;
1315 }
1416
@@ -23,9 +25,9 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
2325
2426 // Not using a scope here because we always expect this to be at the end of the pipeline, thus there's
2527 // not really anything to surround.
26- Log . RequestStart ( _logger , request ) ;
28+ Log . RequestStart ( _options , _logger , request ) ;
2729 var response = await base . SendAsync ( request , cancellationToken ) . ConfigureAwait ( false ) ;
28- Log . RequestEnd ( _logger , response , stopwatch . GetElapsedTime ( ) ) ;
30+ Log . RequestEnd ( _options , _logger , response , stopwatch . GetElapsedTime ( ) ) ;
2931
3032 return response ;
3133 }
@@ -34,14 +36,14 @@ private static class Log
3436 {
3537 public static class EventIds
3638 {
37- public static readonly EventId RequestStart = new EventId ( 100 , "RequestStart" ) ;
38- public static readonly EventId RequestEnd = new EventId ( 101 , "RequestEnd" ) ;
39+ public static readonly EventId RequestStart = new ( 100 , "RequestStart" ) ;
40+ public static readonly EventId RequestEnd = new ( 101 , "RequestEnd" ) ;
3941
40- public static readonly EventId RequestHeader = new EventId ( 102 , "RequestHeader" ) ;
41- public static readonly EventId ResponseHeader = new EventId ( 103 , "ResponseHeader" ) ;
42+ public static readonly EventId RequestHeader = new ( 102 , "RequestHeader" ) ;
43+ public static readonly EventId ResponseHeader = new ( 103 , "ResponseHeader" ) ;
4244
43- public static readonly EventId RequestContent = new EventId ( 104 , "RequestContent" ) ;
44- public static readonly EventId ResponseContent = new EventId ( 105 , "ResponseContent" ) ;
45+ public static readonly EventId RequestContent = new ( 104 , "RequestContent" ) ;
46+ public static readonly EventId ResponseContent = new ( 105 , "ResponseContent" ) ;
4547 }
4648
4749 private static readonly Action < ILogger , HttpMethod , Uri , Exception > _requestStart = LoggerMessage . Define < HttpMethod , Uri > (
@@ -54,48 +56,58 @@ public static class EventIds
5456 EventIds . RequestEnd ,
5557 "Received HTTP response after {ElapsedMilliseconds}ms - {StatusCode}" ) ;
5658
57- public static void RequestStart ( ILogger logger , HttpRequestMessage request )
59+ private static readonly Action < ILogger , double , HttpStatusCode , Exception > _requestEndTooSlow = LoggerMessage . Define < double , HttpStatusCode > (
60+ LogLevel . Warning ,
61+ EventIds . RequestEnd ,
62+ "Received HTTP response too slow, elapsed: {ElapsedMilliseconds}ms - {StatusCode}" ) ;
63+
64+ public static void RequestStart ( CustomLoggingOptions options , ILogger logger , HttpRequestMessage request )
5865 {
5966 _requestStart ( logger , request . Method , request . RequestUri , null ) ;
6067
61- if ( logger . IsEnabled ( LogLevel . Trace ) )
62- {
68+ if ( options . LogRequestHeader && logger . IsEnabled ( LogLevel . Debug ) )
6369 logger . Log (
64- LogLevel . Trace ,
70+ LogLevel . Debug ,
6571 EventIds . RequestHeader ,
6672 new HttpHeadersLogValue ( Kind . Request , request . Headers , request . Content ? . Headers ) ,
6773 null ,
6874 ( state , ex ) => state . ToString ( ) ) ;
6975
76+ if ( options . LogRequestBody && logger . IsEnabled ( LogLevel . Debug ) )
7077 logger . Log (
71- LogLevel . Trace ,
78+ LogLevel . Debug ,
7279 EventIds . RequestContent ,
7380 new HttpContentLogValue ( Kind . Request , request . Content ) ,
7481 null ,
7582 ( state , ex ) => state . ToString ( ) ) ;
76- }
7783 }
7884
79- public static void RequestEnd ( ILogger logger , HttpResponseMessage response , TimeSpan duration )
85+ public static void RequestEnd ( CustomLoggingOptions options , ILogger logger , HttpResponseMessage response , TimeSpan duration )
8086 {
81- _requestEnd ( logger , duration . TotalMilliseconds , response . StatusCode , null ) ;
82-
83- if ( logger . IsEnabled ( LogLevel . Trace ) )
87+ if ( duration . TotalMilliseconds < options . SlowRequestLoggingThreshold )
8488 {
89+ _requestEnd ( logger , duration . TotalMilliseconds , response . StatusCode , null ) ;
90+ }
91+ else
92+ {
93+ _requestEndTooSlow ( logger , duration . TotalMilliseconds , response . StatusCode , null ) ;
94+ }
95+
96+ if ( options . LogResponseHeader && logger . IsEnabled ( LogLevel . Debug ) )
8597 logger . Log (
86- LogLevel . Trace ,
98+ LogLevel . Debug ,
8799 EventIds . ResponseHeader ,
88100 new HttpHeadersLogValue ( Kind . Response , response . Headers , response . Content ? . Headers ) ,
89101 null ,
90102 ( state , ex ) => state . ToString ( ) ) ;
91103
104+ if ( options . LogResponseBody && logger . IsEnabled ( LogLevel . Debug ) )
92105 logger . Log (
93- LogLevel . Trace ,
106+ LogLevel . Debug ,
94107 EventIds . ResponseContent ,
95108 new HttpContentLogValue ( Kind . Response , response . Content ) ,
96109 null ,
97110 ( state , ex ) => state . ToString ( ) ) ;
98- }
99111 }
100112 }
101113}
0 commit comments