Files
server/src/Core/Utilities/LoggerFactoryExtensions.cs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

146 lines
5.7 KiB
C#
Raw Normal View History

using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using Bit.Core.Settings;
2018-03-23 18:33:31 +01:00
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
2019-07-23 16:38:49 -04:00
using Microsoft.Extensions.Configuration;
2020-01-10 08:33:13 -05:00
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.Syslog;
2022-08-29 14:53:16 -04:00
namespace Bit.Core.Utilities;
public static class LoggerFactoryExtensions
{
2022-08-29 14:53:16 -04:00
public static void UseSerilog(
this IApplicationBuilder appBuilder,
IWebHostEnvironment env,
IHostApplicationLifetime applicationLifetime,
GlobalSettings globalSettings)
{
2022-08-29 14:53:16 -04:00
if (env.IsDevelopment())
{
2022-08-29 14:53:16 -04:00
return;
}
applicationLifetime.ApplicationStopped.Register(Log.CloseAndFlush);
}
2019-07-23 16:38:49 -04:00
2022-08-29 14:53:16 -04:00
public static ILoggingBuilder AddSerilog(
this ILoggingBuilder builder,
WebHostBuilderContext context,
Func<LogEvent, bool> filter = null)
{
if (context.HostingEnvironment.IsDevelopment())
{
return builder;
2019-07-23 16:38:49 -04:00
}
2022-08-29 14:53:16 -04:00
bool inclusionPredicate(LogEvent e)
2019-07-23 16:38:49 -04:00
{
2022-08-29 14:53:16 -04:00
if (filter == null)
2019-07-23 16:38:49 -04:00
{
2022-08-29 14:53:16 -04:00
return true;
2018-03-27 22:16:55 -04:00
}
2022-08-29 14:53:16 -04:00
var eventId = e.Properties.ContainsKey("EventId") ? e.Properties["EventId"].ToString() : null;
if (eventId?.Contains(Constants.BypassFiltersEventId.ToString()) ?? false)
2018-03-27 22:16:55 -04:00
{
2022-08-29 14:53:16 -04:00
return true;
2018-03-27 22:16:55 -04:00
}
2022-08-29 14:53:16 -04:00
return filter(e);
}
2022-08-29 14:53:16 -04:00
var globalSettings = new GlobalSettings();
ConfigurationBinder.Bind(context.Configuration.GetSection("GlobalSettings"), globalSettings);
2019-07-23 16:38:49 -04:00
2022-08-29 14:53:16 -04:00
var config = new LoggerConfiguration()
.Enrich.FromLogContext()
.Filter.ByIncludingOnly(inclusionPredicate);
2018-03-23 18:33:31 +01:00
2022-08-29 14:53:16 -04:00
if (CoreHelpers.SettingHasValue(globalSettings?.DocumentDb.Uri) &&
CoreHelpers.SettingHasValue(globalSettings?.DocumentDb.Key))
{
config.WriteTo.AzureCosmosDB(new Uri(globalSettings.DocumentDb.Uri),
globalSettings.DocumentDb.Key, timeToLive: TimeSpan.FromDays(7),
partitionKey: "_partitionKey")
.Enrich.FromLogContext()
.Enrich.WithProperty("Project", globalSettings.ProjectName);
}
else if (CoreHelpers.SettingHasValue(globalSettings?.Sentry.Dsn))
{
config.WriteTo.Sentry(globalSettings.Sentry.Dsn)
.Enrich.FromLogContext()
.Enrich.WithProperty("Project", globalSettings.ProjectName);
}
else if (CoreHelpers.SettingHasValue(globalSettings?.Syslog.Destination))
{
// appending sitename to project name to allow eaiser identification in syslog.
var appName = $"{globalSettings.SiteName}-{globalSettings.ProjectName}";
if (globalSettings.Syslog.Destination.Equals("local", StringComparison.OrdinalIgnoreCase))
2018-03-27 22:16:55 -04:00
{
2022-08-29 14:53:16 -04:00
config.WriteTo.LocalSyslog(appName);
}
2022-08-29 14:53:16 -04:00
else if (Uri.TryCreate(globalSettings.Syslog.Destination, UriKind.Absolute, out var syslogAddress))
{
2022-08-29 14:53:16 -04:00
// Syslog's standard port is 514 (both UDP and TCP). TLS does not have a standard port, so assume 514.
int port = syslogAddress.Port >= 0
? syslogAddress.Port
: 514;
if (syslogAddress.Scheme.Equals("udp"))
{
config.WriteTo.UdpSyslog(syslogAddress.Host, port, appName);
}
else if (syslogAddress.Scheme.Equals("tcp"))
{
2022-08-29 14:53:16 -04:00
config.WriteTo.TcpSyslog(syslogAddress.Host, port, appName);
}
2022-08-29 14:53:16 -04:00
else if (syslogAddress.Scheme.Equals("tls"))
{
2022-08-29 14:53:16 -04:00
// TLS v1.1, v1.2 and v1.3 are explicitly selected (leaving out TLS v1.0)
const SslProtocols protocols = SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13;
2022-08-29 14:53:16 -04:00
if (CoreHelpers.SettingHasValue(globalSettings.Syslog.CertificateThumbprint))
{
2022-08-29 14:53:16 -04:00
config.WriteTo.TcpSyslog(syslogAddress.Host, port, appName,
secureProtocols: protocols,
certProvider: new CertificateStoreProvider(StoreName.My, StoreLocation.CurrentUser,
globalSettings.Syslog.CertificateThumbprint));
}
2022-08-29 14:53:16 -04:00
else
{
2022-08-29 14:53:16 -04:00
config.WriteTo.TcpSyslog(syslogAddress.Host, port, appName,
secureProtocols: protocols,
certProvider: new CertificateFileProvider(globalSettings.Syslog.CertificatePath,
globalSettings.Syslog?.CertificatePassword ?? string.Empty));
}
}
}
2022-08-29 14:53:16 -04:00
}
else if (CoreHelpers.SettingHasValue(globalSettings.LogDirectory))
{
if (globalSettings.LogRollBySizeLimit.HasValue)
2018-03-27 22:16:55 -04:00
{
2022-08-29 14:53:16 -04:00
config.WriteTo.File($"{globalSettings.LogDirectory}/{globalSettings.ProjectName}/log.txt",
rollOnFileSizeLimit: true, fileSizeLimitBytes: globalSettings.LogRollBySizeLimit);
}
else
{
config.WriteTo
.RollingFile($"{globalSettings.LogDirectory}/{globalSettings.ProjectName}/{{Date}}.txt");
2018-03-27 22:16:55 -04:00
}
2022-08-29 14:53:16 -04:00
config
.Enrich.FromLogContext()
.Enrich.WithProperty("Project", globalSettings.ProjectName);
}
2018-03-27 22:16:55 -04:00
2022-08-29 14:53:16 -04:00
var serilog = config.CreateLogger();
builder.AddSerilog(serilog);
2022-08-29 14:53:16 -04:00
return builder;
}
}