From 31dcded8d610874ad80e11e241f7b1adc8b4aad7 Mon Sep 17 00:00:00 2001 From: Warren Date: Tue, 14 Aug 2018 09:37:29 +0100 Subject: [PATCH] Moves parts of the Serilog LoggerConfiguration to extensions methods for easier to read & re-use (if someone is attempting to configure the Serilog pipeline in code) --- src/Umbraco.Core/Logging/Logger.cs | 48 +++---------- .../LoggerConfigExtensions.cs | 72 +++++++++++++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + 3 files changed, 81 insertions(+), 40 deletions(-) create mode 100644 src/Umbraco.Core/Logging/SerilogExtensions/LoggerConfigExtensions.cs diff --git a/src/Umbraco.Core/Logging/Logger.cs b/src/Umbraco.Core/Logging/Logger.cs index 563dd92681..a59162cf25 100644 --- a/src/Umbraco.Core/Logging/Logger.cs +++ b/src/Umbraco.Core/Logging/Logger.cs @@ -2,13 +2,9 @@ using System.IO; using System.Reflection; using System.Threading; -using System.Web; using Umbraco.Core.Configuration; using Umbraco.Core.Diagnostics; using Serilog; -using Serilog.Events; -using Serilog.Filters; -using Serilog.Formatting.Compact; using Umbraco.Core.Logging.SerilogExtensions; namespace Umbraco.Core.Logging @@ -32,43 +28,15 @@ namespace Umbraco.Core.Logging // private for CreateWithDefaultConfiguration private Logger() { - Serilog.Debugging.SelfLog.Enable(msg => System.Diagnostics.Debug.WriteLine(msg)); - - //Set this environment variable - so that it can be used in external config file - //add key="serilog:write-to:RollingFile.pathFormat" value="%BASEDIR%\logs\log.txt" /> - Environment.SetEnvironmentVariable("BASEDIR", AppDomain.CurrentDomain.BaseDirectory, EnvironmentVariableTarget.Process); - - Log.Logger = new LoggerConfiguration() - .MinimumLevel.Verbose() //Set to highest level of logging (as any sinks may want to restrict it to Errors only) - .Enrich.WithProcessId() - .Enrich.WithProcessName() - .Enrich.WithThreadId() - .Enrich.WithProperty("AppDomainId", AppDomain.CurrentDomain.Id) - .Enrich.WithProperty("AppDomainAppId", HttpRuntime.AppDomainAppId.ReplaceNonAlphanumericChars(string.Empty)) - .Enrich.With() + var loggerConfig = new LoggerConfiguration(); + loggerConfig + .MinimalConfiguration() + .OutputDefaultTextFile() + .OutputDefaultJsonFile() + .ReadFromConfigFile() + .ReadFromUserConfigFile(); - //Main .txt logfile - in similar format to older Log4Net output - //Ends with ..txt as Date is inserted before file extension substring - .WriteTo.File($@"{AppDomain.CurrentDomain.BaseDirectory}\App_Data\Logs\UmbracoTraceLog.{Environment.MachineName}..txt", - rollingInterval: RollingInterval.Day, - restrictedToMinimumLevel: LogEventLevel.Verbose, - retainedFileCountLimit: null, //Setting to null means we keep all files - default is 31 days - outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} [P{ProcessId}/D{AppDomainId}/T{ThreadId}] {Log4NetLevel} {SourceContext} - {Message:lj}{NewLine}{Exception}") - - //.clef format (Compact log event format, that can be imported into local SEQ & will make searching/filtering logs easier) - //Ends with ..txt as Date is inserted before file extension substring - .WriteTo.File(new CompactJsonFormatter(), $@"{AppDomain.CurrentDomain.BaseDirectory}\App_Data\Logs\UmbracoTraceLog.{Environment.MachineName}..json", - rollingInterval: RollingInterval.Day, //Create a new JSON file every day - retainedFileCountLimit: null, //Setting to null means we keep all files - default is 31 days - restrictedToMinimumLevel: LogEventLevel.Verbose) - - //Read from main serilog.config file - .ReadFrom.AppSettings(filePath: AppDomain.CurrentDomain.BaseDirectory + @"\config\serilog.config") - - //A nested logger - where any user configured sinks via config can not effect the main 'umbraco' logger above - .WriteTo.Logger(cfg => - cfg.ReadFrom.AppSettings(filePath: AppDomain.CurrentDomain.BaseDirectory + @"\config\serilog.user.config")) - .CreateLogger(); + Log.Logger = loggerConfig.CreateLogger(); } /// diff --git a/src/Umbraco.Core/Logging/SerilogExtensions/LoggerConfigExtensions.cs b/src/Umbraco.Core/Logging/SerilogExtensions/LoggerConfigExtensions.cs new file mode 100644 index 0000000000..c72b7b0958 --- /dev/null +++ b/src/Umbraco.Core/Logging/SerilogExtensions/LoggerConfigExtensions.cs @@ -0,0 +1,72 @@ +using System; +using System.Web; +using Serilog; +using Serilog.Events; +using Serilog.Formatting.Compact; + +namespace Umbraco.Core.Logging.SerilogExtensions +{ + public static class LoggerConfigExtensions + { + public static LoggerConfiguration MinimalConfiguration(this LoggerConfiguration logConfig) + { + Serilog.Debugging.SelfLog.Enable(msg => System.Diagnostics.Debug.WriteLine(msg)); + + //Set this environment variable - so that it can be used in external config file + //add key="serilog:write-to:RollingFile.pathFormat" value="%BASEDIR%\logs\log.txt" /> + Environment.SetEnvironmentVariable("BASEDIR", AppDomain.CurrentDomain.BaseDirectory, EnvironmentVariableTarget.Process); + + logConfig.MinimumLevel.Verbose() //Set to highest level of logging (as any sinks may want to restrict it to Errors only) + .Enrich.WithProcessId() + .Enrich.WithProcessName() + .Enrich.WithThreadId() + .Enrich.WithProperty("AppDomainId", AppDomain.CurrentDomain.Id) + .Enrich.WithProperty("AppDomainAppId", HttpRuntime.AppDomainAppId.ReplaceNonAlphanumericChars(string.Empty)) + .Enrich.With(); + + return logConfig; + } + + public static LoggerConfiguration OutputDefaultTextFile(this LoggerConfiguration logConfig) + { + //Main .txt logfile - in similar format to older Log4Net output + //Ends with ..txt as Date is inserted before file extension substring + logConfig.WriteTo.File($@"{AppDomain.CurrentDomain.BaseDirectory}\App_Data\Logs\UmbracoTraceLog.{Environment.MachineName}..txt", + rollingInterval: RollingInterval.Day, + restrictedToMinimumLevel: LogEventLevel.Verbose, + retainedFileCountLimit: null, //Setting to null means we keep all files - default is 31 days + outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} [P{ProcessId}/D{AppDomainId}/T{ThreadId}] {Log4NetLevel} {SourceContext} - {Message:lj}{NewLine}{Exception}"); + + return logConfig; + } + + public static LoggerConfiguration OutputDefaultJsonFile(this LoggerConfiguration logConfig) + { + //.clef format (Compact log event format, that can be imported into local SEQ & will make searching/filtering logs easier) + //Ends with ..txt as Date is inserted before file extension substring + logConfig.WriteTo.File(new CompactJsonFormatter(), $@"{AppDomain.CurrentDomain.BaseDirectory}\App_Data\Logs\UmbracoTraceLog.{Environment.MachineName}..json", + rollingInterval: RollingInterval.Day, //Create a new JSON file every day + retainedFileCountLimit: null, //Setting to null means we keep all files - default is 31 days + restrictedToMinimumLevel: LogEventLevel.Verbose); + + return logConfig; + } + + public static LoggerConfiguration ReadFromConfigFile(this LoggerConfiguration logConfig) + { + //Read from main serilog.config file + logConfig.ReadFrom.AppSettings(filePath: AppDomain.CurrentDomain.BaseDirectory + @"\config\serilog.config"); + + return logConfig; + } + + public static LoggerConfiguration ReadFromUserConfigFile(this LoggerConfiguration logConfig) + { + //A nested logger - where any user configured sinks via config can not effect the main 'umbraco' logger above + logConfig.WriteTo.Logger(cfg => + cfg.ReadFrom.AppSettings(filePath: AppDomain.CurrentDomain.BaseDirectory + @"\config\serilog.user.config")); + + return logConfig; + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index c2b826419f..084ebdf13e 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -329,6 +329,7 @@ +