Skip to content

Commit bc3a429

Browse files
authored
Fix the serilog bug (#11)
1 parent 17290ef commit bc3a429

File tree

20 files changed

+89
-92
lines changed

20 files changed

+89
-92
lines changed

GitVersion.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
next-version: 2.1.0
1+
next-version: 2.2.0
22
mode: Mainline
33
major-version-bump-message: '\+semver:\s?(breaking|major)'
44
minor-version-bump-message: '\+semver:\s?(feature|minor)'

src/LittleBlocks.AspNetCore.Bootstrap/ApiPipelineOptions.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,14 @@
1616

1717
namespace LittleBlocks.AspNetCore.Bootstrap;
1818

19-
public sealed class ApiPipelineOptions
19+
public sealed class ApiPipelineOptions(
20+
IConfiguration configuration,
21+
IHostEnvironment environment,
22+
ILoggerFactory loggerFactory)
2023
{
21-
public ApiPipelineOptions(IConfiguration configuration, IHostEnvironment environment,
22-
ILoggerFactory loggerFactory)
23-
{
24-
Configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
25-
Environment = environment ?? throw new ArgumentNullException(nameof(environment));
26-
LoggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
27-
}
28-
29-
public IConfiguration Configuration { get; }
30-
public IHostEnvironment Environment { get; }
31-
public ILoggerFactory LoggerFactory { get; }
24+
public IConfiguration Configuration { get; } = configuration ?? throw new ArgumentNullException(nameof(configuration));
25+
public IHostEnvironment Environment { get; } = environment ?? throw new ArgumentNullException(nameof(environment));
26+
public ILoggerFactory LoggerFactory { get; } = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
3227
public Action PostAuthenticationConfigure { get; } = null;
3328
public Action<IEndpointRouteBuilder> PreEndPointsConfigure { get; } = null;
3429
public Action<IEndpointRouteBuilder> PostEndPointsConfigure { get; } = null;

src/LittleBlocks.AspNetCore.Bootstrap/ApplicationBuilderExtensions.cs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,38 @@
1414
// You should have received a copy of the GNU Affero General Public License
1515
// along with this program. If not, see <http://www.gnu.org/licenses/>.
1616

17+
using Serilog;
18+
1719
namespace LittleBlocks.AspNetCore.Bootstrap;
1820

1921
public static class ApplicationBuilderExtensions
2022
{
2123
public static void UseDefaultApiPipeline(this IApplicationBuilder app,
2224
IConfiguration configuration,
2325
IWebHostEnvironment env,
26+
IHostApplicationLifetime lifetime,
2427
ILoggerFactory loggerFactory)
2528
{
26-
if (app == null) throw new ArgumentNullException(nameof(app));
27-
if (configuration == null) throw new ArgumentNullException(nameof(configuration));
28-
if (env == null) throw new ArgumentNullException(nameof(env));
29-
if (loggerFactory == null) throw new ArgumentNullException(nameof(loggerFactory));
29+
ArgumentNullException.ThrowIfNull(lifetime);
30+
ArgumentNullException.ThrowIfNull(app);
31+
ArgumentNullException.ThrowIfNull(configuration);
32+
ArgumentNullException.ThrowIfNull(env);
33+
ArgumentNullException.ThrowIfNull(loggerFactory);
3034

35+
InitiateFlushOutstandingOperations(lifetime);
3136
var options = new ApiPipelineOptions(configuration, env, loggerFactory);
3237
app.UseDefaultApiPipeline(options);
3338
}
3439

35-
public static void UseDefaultApiPipeline(this IApplicationBuilder app, ApiPipelineOptions options)
40+
private static void InitiateFlushOutstandingOperations(IHostApplicationLifetime lifetime)
41+
{
42+
lifetime.ApplicationStopped.Register(Log.CloseAndFlush);
43+
}
44+
45+
private static void UseDefaultApiPipeline(this IApplicationBuilder app, ApiPipelineOptions options)
3646
{
37-
if (app == null) throw new ArgumentNullException(nameof(app));
38-
if (options == null) throw new ArgumentNullException(nameof(options));
47+
ArgumentNullException.ThrowIfNull(app);
48+
ArgumentNullException.ThrowIfNull(options);
3949

4050
var appInfo = options.Configuration.GetApplicationInfo();
4151
var authOptions = options.Configuration.GetAuthOptions();
@@ -87,8 +97,8 @@ public static void UseDefaultApiPipeline(this IApplicationBuilder app, ApiPipeli
8797

8898
public static void UseStartPage(this IEndpointRouteBuilder endpoints, string applicationName)
8999
{
90-
if (endpoints == null) throw new ArgumentNullException(nameof(endpoints));
91-
if (applicationName == null) throw new ArgumentNullException(nameof(applicationName));
100+
ArgumentNullException.ThrowIfNull(endpoints);
101+
ArgumentNullException.ThrowIfNull(applicationName);
92102

93103
endpoints.MapGet("/", context =>
94104
{
@@ -128,6 +138,6 @@ private static string LoadStartPageFromEmbeddedResource(string applicationName)
128138
private static void LogResolvedEnvironment(IHostEnvironment env, ILoggerFactory loggerFactory)
129139
{
130140
var log = loggerFactory.CreateLogger("Startup");
131-
log.LogInformation($"Application is started in '{env.EnvironmentName.ToUpper()}' environment ...");
141+
log.LogInformation($"{nameof(Application)} is started in '{env.EnvironmentName.ToUpper()}' environment ...");
132142
}
133143
}

src/LittleBlocks.AspNetCore/HostAsWeb.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ private static IWebHost Build<TStartup>(
3939
})
4040
.ConfigureServices((context, services) =>
4141
{
42-
loggerConfigure(new LoggerBuilder(context.HostingEnvironment, context.Configuration, new LoggerConfiguration())).Build<TStartup>();
42+
loggerConfigure(new LoggerBuilder(services, context.HostingEnvironment, context.Configuration)).Build<TStartup>();
4343
})
4444
.Build();
4545

src/LittleBlocks.AspNetCore/Logging/SeriLog/Fluent/LoggerBuilder.cs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@
1616

1717
namespace LittleBlocks.AspNetCore.Logging.SeriLog.Fluent;
1818

19-
public sealed class LoggerBuilder : ILoggerBuilder, IBuildLogger
19+
public sealed class LoggerBuilder(
20+
IServiceCollection services,
21+
IHostEnvironment environment,
22+
IConfiguration configuration)
23+
: ILoggerBuilder, IBuildLogger
2024
{
2125
private const string LogMessageTemplate =
2226
"{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{MachineName}] [{EnvironmentUserName}] [{ProcessId}] " +
@@ -25,25 +29,18 @@ public sealed class LoggerBuilder : ILoggerBuilder, IBuildLogger
2529
private const string SerilogConfigSectionName = "Logging:Serilog";
2630
private const string SerilogMinimumLevelKey = "MinimumLevel";
2731
private const LogEventLevel DefaultLogLevel = LogEventLevel.Information;
28-
private readonly IHostEnvironment _environment;
29-
private readonly IConfiguration _configuration;
30-
private readonly LoggerConfiguration _loggerConfiguration;
32+
33+
private readonly IServiceCollection _services = services ?? throw new ArgumentNullException(nameof(services));
34+
private readonly IHostEnvironment _environment = environment ?? throw new ArgumentNullException(nameof(environment));
35+
private readonly IConfiguration _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
3136

3237
private Func<ISetFileSizeLimit, IBuildSeriLogOptions> _optionsProvider;
3338
private Func<ISinkBuilderContext, ISinkBuilderContext> _sinksProvider;
3439

35-
public LoggerBuilder(IHostEnvironment environment, IConfiguration configuration, LoggerConfiguration loggerConfiguration)
36-
{
37-
_environment = environment ?? throw new ArgumentNullException(nameof(environment));
38-
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
39-
_loggerConfiguration = loggerConfiguration ?? throw new ArgumentNullException(nameof(loggerConfiguration));
40-
}
41-
4240
public void Build<TStartup>() where TStartup : class
4341
{
44-
ConfigureLogger<TStartup>(_loggerConfiguration, _optionsProvider, _sinksProvider);
42+
_services.AddSerilog(lg => ConfigureLogger<TStartup>(lg, _optionsProvider, _sinksProvider));
4543
}
46-
4744
public IConfiguration Configuration => _configuration;
4845
public IHostEnvironment Environment => _environment;
4946

@@ -86,7 +83,7 @@ private void ConfigureLogger<TStartup>(LoggerConfiguration loggerConfiguration,
8683
Func<ISetFileSizeLimit, IBuildSeriLogOptions> optionsProvider,
8784
Func<ISinkBuilderContext, ISinkBuilderContext> sinksProvider) where TStartup : class
8885
{
89-
if (loggerConfiguration == null) throw new ArgumentNullException(nameof(loggerConfiguration));
86+
ArgumentNullException.ThrowIfNull(loggerConfiguration);
9087

9188
var env = _environment;
9289
var configuration = _configuration;

src/LittleBlocks.AspNetCore/RequestCorrelation/Core/CorrelateRequestMiddleware.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ private HttpContext CorrelateRequest(HttpContext context)
5454
new List<string> {HttpHeaders.HttpCorrelationId, HttpHeaders.HttpRequestId});
5555

5656
correlationId = _correlationIdProvider.GenerateId();
57-
context.Request.Headers.Add(HttpHeaders.HttpRequestId, correlationId);
57+
context.Request.Headers.Append(HttpHeaders.HttpRequestId, correlationId);
5858
}
5959

6060
context.Response.OnStarting(state =>
6161
{
62-
((HttpContext) state).Response.Headers.Add(HttpHeaders.HttpRequestId, correlationId);
62+
((HttpContext) state).Response.Headers.Append(HttpHeaders.HttpRequestId, correlationId);
6363
return Task.FromResult(0);
6464
}, context);
6565

src/LittleBlocks.AspNetCore/Security/Impersonation/ImpersonationAuthenticationHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace LittleBlocks.AspNetCore.Security.Impersonation;
2323
public sealed class ImpersonationAuthenticationHandler : AuthenticationHandler<ImpersonationBearerOptions>
2424
{
2525
public ImpersonationAuthenticationHandler(IOptionsMonitor<ImpersonationBearerOptions> options,
26-
ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
26+
ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock): base(options, logger, encoder, clock)
2727
{
2828
}
2929

src/LittleBlocks.Hosting.WindowsService/HostAsWindowsService.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,9 @@ private static IHost Build<TStartup>(
4141
config.ConfigureBuilder(options);
4242
configurationConfigure(config);
4343
})
44-
.UseSerilog((context, configuration) =>
44+
.ConfigureServices((context, services) =>
4545
{
46-
loggerConfigure(new LoggerBuilder(context.HostingEnvironment, context.Configuration,
47-
configuration)).Build<TStartup>();
46+
loggerConfigure(new LoggerBuilder(services, context.HostingEnvironment, context.Configuration)).Build<TStartup>();
4847
})
4948
.Build();
5049

src/LittleBlocks.Logging.SeriLog/SinkBuilderExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ public static class SinkBuilderExtensions
2020
{
2121
public static ISinkBuilderContext BuildAndCloneContext(this ISinkBuilder builder, ISinkBuilderContext sinkBuilderContext)
2222
{
23-
if (builder == null) throw new ArgumentNullException(nameof(builder));
24-
if (sinkBuilderContext == null) throw new ArgumentNullException(nameof(sinkBuilderContext));
23+
ArgumentNullException.ThrowIfNull(builder);
24+
ArgumentNullException.ThrowIfNull(sinkBuilderContext);
2525

2626
var loggerConfiguration = builder.Build();
2727
return sinkBuilderContext.Clone(loggerConfiguration);

src/Samples/LittleBlocks.Sample.WebAPI.IntegrationTests/CorrelateRequestMiddlewareTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public async Task Given_CorrelationId_IsPresent_ThenInvokeNextMiddlewareComponen
4040
var next = Substitute.For<RequestDelegate>();
4141
var sut = new CorrelateRequestMiddleware(next, options, idProvider);
4242
var context = GetDefaultHttpContext();
43-
context.Request.Headers.Add(header, Guid.NewGuid().ToString());
43+
context.Request.Headers.Append(header, Guid.NewGuid().ToString());
4444

4545
// Act
4646
await sut.Invoke(context);

0 commit comments

Comments
 (0)