Moved serilog config to appsettings and configured it to also catch MS logging messages.
Added Console log for Development
This commit is contained in:
@@ -7,7 +7,5 @@
|
||||
/// The physical path where logs are stored
|
||||
/// </summary>
|
||||
string LogDirectory { get; }
|
||||
string LogConfigurationFile { get; }
|
||||
string UserLogConfigurationFile { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,17 +4,11 @@ namespace Umbraco.Core.Logging
|
||||
{
|
||||
public class LoggingConfiguration : ILoggingConfiguration
|
||||
{
|
||||
public LoggingConfiguration(string logDirectory, string logConfigurationFile, string userLogConfigurationFile)
|
||||
public LoggingConfiguration(string logDirectory)
|
||||
{
|
||||
LogDirectory = logDirectory ?? throw new ArgumentNullException(nameof(logDirectory));
|
||||
LogConfigurationFile = logConfigurationFile ?? throw new ArgumentNullException(nameof(logConfigurationFile));
|
||||
UserLogConfigurationFile = userLogConfigurationFile ?? throw new ArgumentNullException(nameof(userLogConfigurationFile));
|
||||
}
|
||||
|
||||
public string LogDirectory { get; }
|
||||
|
||||
public string LogConfigurationFile { get; }
|
||||
|
||||
public string UserLogConfigurationFile { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ namespace Umbraco.Core.Composing
|
||||
/// <param name="umbracoServiceProviderFactory"></param>
|
||||
/// <returns></returns>
|
||||
public static IHostBuilder UseUmbraco(this IHostBuilder builder, UmbracoServiceProviderFactory umbracoServiceProviderFactory)
|
||||
=> builder.UseServiceProviderFactory(umbracoServiceProviderFactory)
|
||||
.UseSerilog();
|
||||
=> builder.UseServiceProviderFactory(umbracoServiceProviderFactory);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ using Serilog.Core;
|
||||
using Serilog.Events;
|
||||
using Serilog.Formatting;
|
||||
using Serilog.Formatting.Compact;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Core.Hosting;
|
||||
using Umbraco.Core.Logging.Serilog.Enrichers;
|
||||
|
||||
@@ -61,7 +60,7 @@ namespace Umbraco.Core.Logging.Serilog
|
||||
public static LoggerConfiguration OutputDefaultTextFile(
|
||||
this LoggerConfiguration logConfig,
|
||||
IHostingEnvironment hostingEnvironment,
|
||||
ILoggingConfiguration loggingConfiguration, LogEventLevel minimumLevel = LogEventLevel.Verbose, int? retainedFileCount = null)
|
||||
LogEventLevel minimumLevel = LogEventLevel.Verbose)
|
||||
{
|
||||
//Main .txt logfile - in similar format to older Log4Net output
|
||||
//Ends with ..txt as Date is inserted before file extension substring
|
||||
@@ -79,18 +78,25 @@ namespace Umbraco.Core.Logging.Serilog
|
||||
/// <remarks>
|
||||
/// Used in config - If renamed or moved to other assembly the config file also has be updated.
|
||||
/// </remarks>
|
||||
public static LoggerConfiguration File(this LoggerSinkConfiguration configuration, ITextFormatter formatter,
|
||||
public static LoggerConfiguration UmbracoFile(this LoggerSinkConfiguration configuration,
|
||||
string path,
|
||||
ITextFormatter formatter = null,
|
||||
LogEventLevel restrictedToMinimumLevel = LogEventLevel.Verbose,
|
||||
LoggingLevelSwitch levelSwitch = null,
|
||||
long? fileSizeLimitBytes = 1073741824,
|
||||
TimeSpan? flushToDiskInterval = null,
|
||||
RollingInterval rollingInterval = RollingInterval.Infinite,
|
||||
RollingInterval rollingInterval = RollingInterval.Day,
|
||||
bool rollOnFileSizeLimit = false,
|
||||
int? retainedFileCountLimit = 31,
|
||||
Encoding encoding = null
|
||||
)
|
||||
{
|
||||
|
||||
if (formatter is null)
|
||||
{
|
||||
formatter = new CompactJsonFormatter();
|
||||
}
|
||||
|
||||
return configuration.Async(
|
||||
asyncConfiguration => asyncConfiguration.Map(AppDomainId, (_,mapConfiguration) =>
|
||||
mapConfiguration.File(
|
||||
@@ -136,34 +142,5 @@ namespace Umbraco.Core.Logging.Serilog
|
||||
return logConfig;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads settings from /config/serilog.config
|
||||
/// That allows the main logging pipeline to be configured
|
||||
/// </summary>
|
||||
/// <param name="logConfig">A Serilog LoggerConfiguration</param>
|
||||
/// <param name="loggingConfiguration"></param>
|
||||
public static LoggerConfiguration ReadFromConfigFile(this LoggerConfiguration logConfig, ILoggingConfiguration loggingConfiguration)
|
||||
{
|
||||
//Read from main serilog.config file
|
||||
logConfig.ReadFrom.AppSettings(filePath: loggingConfiguration.LogConfigurationFile);
|
||||
|
||||
return logConfig;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads settings from /config/serilog.user.config
|
||||
/// That allows a separate logging pipeline to be configured that will not affect the main Umbraco log
|
||||
/// </summary>
|
||||
/// <param name="logConfig">A Serilog LoggerConfiguration</param>
|
||||
/// <param name="loggingConfiguration"></param>
|
||||
public static LoggerConfiguration ReadFromUserConfigFile(this LoggerConfiguration logConfig, ILoggingConfiguration loggingConfiguration)
|
||||
{
|
||||
//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: loggingConfiguration.UserLogConfigurationFile));
|
||||
|
||||
return logConfig;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Serilog;
|
||||
using Serilog.Events;
|
||||
using Serilog.Extensions.Logging;
|
||||
using Umbraco.Core.Hosting;
|
||||
|
||||
namespace Umbraco.Core.Logging.Serilog
|
||||
@@ -35,13 +37,14 @@ namespace Umbraco.Core.Logging.Serilog
|
||||
/// Creates a logger with some pre-defined configuration and remainder from config file
|
||||
/// </summary>
|
||||
/// <remarks>Used by UmbracoApplicationBase to get its logger.</remarks>
|
||||
public static SerilogLogger CreateWithDefaultConfiguration(IHostingEnvironment hostingEnvironment, ILoggingConfiguration loggingConfiguration)
|
||||
public static SerilogLogger CreateWithDefaultConfiguration(
|
||||
IHostingEnvironment hostingEnvironment,
|
||||
ILoggingConfiguration loggingConfiguration,
|
||||
IConfiguration configuration)
|
||||
{
|
||||
var loggerConfig = new LoggerConfiguration();
|
||||
loggerConfig
|
||||
var loggerConfig = new LoggerConfiguration()
|
||||
.MinimalConfiguration(hostingEnvironment, loggingConfiguration)
|
||||
.ReadFromConfigFile(loggingConfiguration)
|
||||
.ReadFromUserConfigFile(loggingConfiguration);
|
||||
.ReadFrom.Configuration(configuration);
|
||||
|
||||
return new SerilogLogger(loggerConfig);
|
||||
}
|
||||
@@ -83,7 +86,7 @@ namespace Umbraco.Core.Logging.Serilog
|
||||
/// <inheritdoc/>
|
||||
public void Fatal(Type reporting, Exception exception, string message)
|
||||
{
|
||||
var logger = LoggerFor(reporting);
|
||||
var logger = LoggerFor(reporting);
|
||||
logger.Fatal(exception, message);
|
||||
}
|
||||
|
||||
@@ -91,7 +94,7 @@ namespace Umbraco.Core.Logging.Serilog
|
||||
public void Fatal(Type reporting, Exception exception)
|
||||
{
|
||||
var logger = LoggerFor(reporting);
|
||||
var message = "Exception.";
|
||||
var message = "Exception.";
|
||||
logger.Fatal(exception, message);
|
||||
}
|
||||
|
||||
@@ -110,14 +113,14 @@ namespace Umbraco.Core.Logging.Serilog
|
||||
/// <inheritdoc/>
|
||||
public void Fatal(Type reporting, Exception exception, string messageTemplate, params object[] propertyValues)
|
||||
{
|
||||
var logger = LoggerFor(reporting);
|
||||
var logger = LoggerFor(reporting);
|
||||
logger.Fatal(exception, messageTemplate, propertyValues);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public void Error(Type reporting, Exception exception, string message)
|
||||
{
|
||||
var logger = LoggerFor(reporting);
|
||||
var logger = LoggerFor(reporting);
|
||||
logger.Error(exception, message);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,16 +11,6 @@ namespace Umbraco.Core.Logging.Viewer
|
||||
{
|
||||
public void Compose(Composition composition)
|
||||
{
|
||||
|
||||
|
||||
composition.RegisterUnique<ILoggingConfiguration>(factory =>
|
||||
{
|
||||
var hostingEnvironment = factory.GetInstance<IHostingEnvironment>();
|
||||
return new LoggingConfiguration(
|
||||
Path.Combine(hostingEnvironment.ApplicationPhysicalPath, "App_Data", "Logs"),
|
||||
Path.Combine(hostingEnvironment.ApplicationPhysicalPath, "config", "serilog.config"),
|
||||
Path.Combine(hostingEnvironment.ApplicationPhysicalPath, "config", "serilog.user.config"));
|
||||
});
|
||||
composition.RegisterUnique<ILogViewerConfig, LogViewerConfig>();
|
||||
composition.SetLogViewer<SerilogJsonLogViewer>();
|
||||
composition.RegisterUnique<ILogViewer>(factory =>
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
<PackageReference Include="Serilog.Formatting.Compact" Version="1.1.0" />
|
||||
<PackageReference Include="Serilog.Formatting.Compact.Reader" Version="1.0.3" />
|
||||
<PackageReference Include="Serilog.Settings.AppSettings" Version="2.2.2" />
|
||||
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
|
||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.4.0" />
|
||||
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
|
||||
<PackageReference Include="Serilog.Sinks.Map" Version="1.0.0" />
|
||||
|
||||
@@ -147,9 +147,7 @@ namespace Umbraco.Tests.Common
|
||||
{
|
||||
hostingEnv = hostingEnv ?? GetHostingEnvironment();
|
||||
return new LoggingConfiguration(
|
||||
Path.Combine(hostingEnv.ApplicationPhysicalPath, "App_Data","Logs"),
|
||||
Path.Combine(hostingEnv.ApplicationPhysicalPath, "config","serilog.config"),
|
||||
Path.Combine(hostingEnv.ApplicationPhysicalPath, "config","serilog.user.config"));
|
||||
Path.Combine(hostingEnv.ApplicationPhysicalPath, "umbraco","logs"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@ namespace Umbraco.Tests.Integration
|
||||
|
||||
// Add it!
|
||||
services.AddUmbracoConfiguration(hostContext.Configuration);
|
||||
services.AddUmbracoCore(webHostEnvironment, umbracoContainer, GetType().Assembly, AppCaches.NoCache, testHelper.GetLoggingConfiguration(), out _);
|
||||
services.AddUmbracoCore(webHostEnvironment, umbracoContainer, GetType().Assembly, AppCaches.NoCache, testHelper.GetLoggingConfiguration(), hostContext.Configuration,out _);
|
||||
});
|
||||
|
||||
var host = await hostBuilder.StartAsync();
|
||||
@@ -141,7 +141,7 @@ namespace Umbraco.Tests.Integration
|
||||
|
||||
// Add it!
|
||||
services.AddUmbracoConfiguration(hostContext.Configuration);
|
||||
services.AddUmbracoCore(webHostEnvironment, umbracoContainer, GetType().Assembly, AppCaches.NoCache, testHelper.GetLoggingConfiguration(), out _);
|
||||
services.AddUmbracoCore(webHostEnvironment, umbracoContainer, GetType().Assembly, AppCaches.NoCache, testHelper.GetLoggingConfiguration(),hostContext.Configuration, out _);
|
||||
});
|
||||
|
||||
var host = await hostBuilder.StartAsync();
|
||||
|
||||
@@ -28,6 +28,7 @@ namespace Umbraco.Tests.Integration.TestServerTest
|
||||
typeof(UmbracoBuilderExtensions).Assembly,
|
||||
AppCaches.NoCache, // Disable caches in integration tests
|
||||
testHelper.GetLoggingConfiguration(),
|
||||
builder.Config,
|
||||
// TODO: Yep that's extremely ugly
|
||||
(configs, umbVersion, ioHelper, logger, profiler, hostingEnv, backOfficeInfo, typeFinder, appCaches, dbProviderFactoryCreator) =>
|
||||
{
|
||||
@@ -46,7 +47,7 @@ namespace Umbraco.Tests.Integration.TestServerTest
|
||||
dbInstallEventHandler); // DB Installation event handler
|
||||
|
||||
return runtime;
|
||||
},
|
||||
},
|
||||
out _);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
{
|
||||
var hostBuilder = CreateHostBuilder();
|
||||
var host = await hostBuilder.StartAsync();
|
||||
Services = host.Services;
|
||||
Services = host.Services;
|
||||
var app = new ApplicationBuilder(host.Services);
|
||||
Configure(app);
|
||||
}
|
||||
@@ -141,7 +141,7 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
logger,
|
||||
profiler,
|
||||
hostingEnvironment,
|
||||
backOfficeInfo,
|
||||
backOfficeInfo,
|
||||
typeFinder,
|
||||
appCaches,
|
||||
dbProviderFactoryCreator,
|
||||
@@ -181,7 +181,7 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
profiler,
|
||||
Mock.Of<IUmbracoBootPermissionChecker>(),
|
||||
hostingEnvironment,
|
||||
backOfficeInfo,
|
||||
backOfficeInfo,
|
||||
dbProviderFactoryCreator,
|
||||
mainDom,
|
||||
typeFinder,
|
||||
@@ -210,6 +210,7 @@ namespace Umbraco.Tests.Integration.Testing
|
||||
GetType().Assembly,
|
||||
AppCaches.NoCache, // Disable caches for integration tests
|
||||
TestHelper.GetLoggingConfiguration(),
|
||||
Configuration,
|
||||
CreateTestRuntime,
|
||||
out _);
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace Umbraco.Web.Common.Builder
|
||||
=> builder.AddWith(nameof(WithConfiguration), () => builder.Services.AddUmbracoConfiguration(builder.Config));
|
||||
|
||||
public static IUmbracoBuilder WithCore(this IUmbracoBuilder builder)
|
||||
=> builder.AddWith(nameof(WithCore), () => builder.Services.AddUmbracoCore(builder.WebHostEnvironment, out _));
|
||||
=> builder.AddWith(nameof(WithCore), () => builder.Services.AddUmbracoCore(builder.WebHostEnvironment, builder.Config, out _));
|
||||
|
||||
public static IUmbracoBuilder WithMiniProfiler(this IUmbracoBuilder builder)
|
||||
=> builder.AddWith(nameof(WithMiniProfiler), () =>
|
||||
@@ -34,7 +34,7 @@ namespace Umbraco.Web.Common.Builder
|
||||
{
|
||||
options.ShouldProfile = request => false; // WebProfiler determine and start profiling. We should not use the MiniProfilerMiddleware to also profile
|
||||
}));
|
||||
|
||||
|
||||
public static IUmbracoBuilder WithMvcAndRazor(this IUmbracoBuilder builder, Action<MvcOptions> mvcOptions = null, Action<IMvcBuilder> mvcBuilding = null)
|
||||
=> builder.AddWith(nameof(WithMvcAndRazor), () =>
|
||||
{
|
||||
|
||||
@@ -119,10 +119,11 @@ namespace Umbraco.Extensions
|
||||
/// </summary>
|
||||
/// <param name="services"></param>
|
||||
/// <param name="webHostEnvironment"></param>
|
||||
/// <param name="configuration"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddUmbracoCore(this IServiceCollection services, IWebHostEnvironment webHostEnvironment)
|
||||
public static IServiceCollection AddUmbracoCore(this IServiceCollection services, IWebHostEnvironment webHostEnvironment, IConfiguration configuration)
|
||||
{
|
||||
return services.AddUmbracoCore(webHostEnvironment, out _);
|
||||
return services.AddUmbracoCore(webHostEnvironment, configuration, out _);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -130,9 +131,10 @@ namespace Umbraco.Extensions
|
||||
/// </summary>
|
||||
/// <param name="services"></param>
|
||||
/// <param name="webHostEnvironment"></param>
|
||||
/// <param name="configuration"></param>
|
||||
/// <param name="factory"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddUmbracoCore(this IServiceCollection services, IWebHostEnvironment webHostEnvironment, out IFactory factory)
|
||||
public static IServiceCollection AddUmbracoCore(this IServiceCollection services, IWebHostEnvironment webHostEnvironment, IConfiguration configuration, out IFactory factory)
|
||||
{
|
||||
if (!UmbracoServiceProviderFactory.IsActive)
|
||||
throw new InvalidOperationException("Ensure to add UseUmbraco() in your Program.cs after ConfigureWebHostDefaults to enable Umbraco's service provider factory");
|
||||
@@ -140,12 +142,11 @@ namespace Umbraco.Extensions
|
||||
var umbContainer = UmbracoServiceProviderFactory.UmbracoContainer;
|
||||
|
||||
var loggingConfig = new LoggingConfiguration(
|
||||
Path.Combine(webHostEnvironment.ContentRootPath, "App_Data", "Logs"),
|
||||
Path.Combine(webHostEnvironment.ContentRootPath, "config", "serilog.config"),
|
||||
Path.Combine(webHostEnvironment.ContentRootPath, "config", "serilog.user.config"));
|
||||
Path.Combine(webHostEnvironment.ContentRootPath, "umbraco", "logs"));
|
||||
|
||||
IHttpContextAccessor httpContextAccessor = new HttpContextAccessor();
|
||||
services.AddSingleton<IHttpContextAccessor>(httpContextAccessor);
|
||||
services.AddSingleton<ILoggingConfiguration>(loggingConfig);
|
||||
|
||||
var requestCache = new GenericDictionaryRequestAppCache(() => httpContextAccessor.HttpContext?.Items);
|
||||
var appCaches = new AppCaches(
|
||||
@@ -158,6 +159,7 @@ namespace Umbraco.Extensions
|
||||
Assembly.GetEntryAssembly(),
|
||||
appCaches,
|
||||
loggingConfig,
|
||||
configuration,
|
||||
out factory);
|
||||
|
||||
return services;
|
||||
@@ -182,8 +184,9 @@ namespace Umbraco.Extensions
|
||||
Assembly entryAssembly,
|
||||
AppCaches appCaches,
|
||||
ILoggingConfiguration loggingConfiguration,
|
||||
IConfiguration configuration,
|
||||
out IFactory factory)
|
||||
=> services.AddUmbracoCore(webHostEnvironment, umbContainer, entryAssembly, appCaches, loggingConfiguration, GetCoreRuntime, out factory);
|
||||
=> services.AddUmbracoCore(webHostEnvironment, umbContainer, entryAssembly, appCaches, loggingConfiguration, configuration, GetCoreRuntime, out factory);
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -206,6 +209,7 @@ namespace Umbraco.Extensions
|
||||
Assembly entryAssembly,
|
||||
AppCaches appCaches,
|
||||
ILoggingConfiguration loggingConfiguration,
|
||||
IConfiguration configuration,
|
||||
// TODO: Yep that's extremely ugly
|
||||
Func<Configs, IUmbracoVersion, IIOHelper, Core.Logging.ILogger, IProfiler, Core.Hosting.IHostingEnvironment, IBackOfficeInfo, ITypeFinder, AppCaches, IDbProviderFactoryCreator, IRuntime> getRuntime,
|
||||
out IFactory factory)
|
||||
@@ -241,6 +245,7 @@ namespace Umbraco.Extensions
|
||||
configs,
|
||||
webHostEnvironment,
|
||||
loggingConfiguration,
|
||||
configuration,
|
||||
out var logger, out var ioHelper, out var hostingEnvironment, out var backOfficeInfo, out var profiler);
|
||||
|
||||
var globalSettings = configs.Global();
|
||||
@@ -248,7 +253,7 @@ namespace Umbraco.Extensions
|
||||
var typeFinder = CreateTypeFinder(logger, profiler, webHostEnvironment, entryAssembly, configs.TypeFinder());
|
||||
|
||||
var runtime = getRuntime(
|
||||
configs,
|
||||
configs,
|
||||
umbracoVersion,
|
||||
ioHelper,
|
||||
logger,
|
||||
@@ -291,7 +296,7 @@ namespace Umbraco.Extensions
|
||||
var mainDom = new MainDom(logger, mainDomLock);
|
||||
|
||||
var coreRuntime = new CoreRuntime(
|
||||
configs,
|
||||
configs,
|
||||
umbracoVersion,
|
||||
ioHelper,
|
||||
logger,
|
||||
@@ -312,6 +317,7 @@ namespace Umbraco.Extensions
|
||||
Configs configs,
|
||||
IWebHostEnvironment webHostEnvironment,
|
||||
ILoggingConfiguration loggingConfiguration,
|
||||
IConfiguration configuration,
|
||||
out Core.Logging.ILogger logger,
|
||||
out IIOHelper ioHelper,
|
||||
out Core.Hosting.IHostingEnvironment hostingEnvironment,
|
||||
@@ -326,8 +332,7 @@ namespace Umbraco.Extensions
|
||||
|
||||
hostingEnvironment = new AspNetCoreHostingEnvironment(hostingSettings, webHostEnvironment);
|
||||
ioHelper = new IOHelper(hostingEnvironment);
|
||||
logger = AddLogger(services, hostingEnvironment, loggingConfiguration);
|
||||
|
||||
logger = AddLogger(services, hostingEnvironment, loggingConfiguration, configuration);
|
||||
backOfficeInfo = new AspNetCoreBackOfficeInfo(globalSettings);
|
||||
profiler = GetWebProfiler(hostingEnvironment);
|
||||
|
||||
@@ -338,10 +343,14 @@ namespace Umbraco.Extensions
|
||||
/// Create and configure the logger
|
||||
/// </summary>
|
||||
/// <param name="hostingEnvironment"></param>
|
||||
private static Core.Logging.ILogger AddLogger(IServiceCollection services, Core.Hosting.IHostingEnvironment hostingEnvironment, ILoggingConfiguration loggingConfiguration)
|
||||
private static Core.Logging.ILogger AddLogger(IServiceCollection services, Core.Hosting.IHostingEnvironment hostingEnvironment, ILoggingConfiguration loggingConfiguration, IConfiguration configuration)
|
||||
{
|
||||
// Create a serilog logger
|
||||
var logger = SerilogLogger.CreateWithDefaultConfiguration(hostingEnvironment, loggingConfiguration);
|
||||
var logger = SerilogLogger.CreateWithDefaultConfiguration(hostingEnvironment, loggingConfiguration, configuration);
|
||||
|
||||
// This is nessasary to pick up all the loggins to MS ILogger.
|
||||
Log.Logger = logger.SerilogLog;
|
||||
|
||||
|
||||
// Wire up all the bits that serilog needs. We need to use our own code since the Serilog ext methods don't cater to our needs since
|
||||
// we don't want to use the global serilog `Log` object and we don't have our own ILogger implementation before the HostBuilder runs which
|
||||
@@ -349,6 +358,11 @@ namespace Umbraco.Extensions
|
||||
// I have created a PR to make this nicer https://github.com/serilog/serilog-extensions-hosting/pull/19 but we'll need to wait for that.
|
||||
// Also see : https://github.com/serilog/serilog-extensions-hosting/blob/dev/src/Serilog.Extensions.Hosting/SerilogHostBuilderExtensions.cs
|
||||
|
||||
// services.AddLogging(configure =>
|
||||
// {
|
||||
// configure.AddSerilog();
|
||||
// });
|
||||
|
||||
services.AddSingleton<ILoggerFactory>(services => new SerilogLoggerFactory(logger.SerilogLog, false));
|
||||
|
||||
// This won't (and shouldn't) take ownership of the logger.
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<ProjectReference Include="..\Umbraco.Web.BackOffice\Umbraco.Web.BackOffice.csproj" />
|
||||
<ProjectReference Include="..\Umbraco.Web.Common\Umbraco.Web.Common.csproj" />
|
||||
<ProjectReference Include="..\Umbraco.Web.Website\Umbraco.Web.Website.csproj" />
|
||||
<ProjectReference Include="..\Umbraco.Persistance.SqlCe\Umbraco.Persistance.SqlCe.csproj" Condition="'$(OS)' == 'Windows_NT'" />
|
||||
<ProjectReference Include="..\Umbraco.Persistance.SqlCe\Umbraco.Persistance.SqlCe.csproj" Condition="'$(OS)' == 'Windows_NT'" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -59,11 +59,11 @@
|
||||
|
||||
<!-- We don't want to include the generated files, they will throw a lot of errors -->
|
||||
<ItemGroup>
|
||||
<None Remove="Umbraco/Models/all.generated.cs"/>
|
||||
<Compile Remove="Umbraco/Models/all.generated.cs"/>
|
||||
<None Remove="Umbraco/Models/models.generated.cs"/>
|
||||
<None Remove="Umbraco/Models/all.generated.cs" />
|
||||
<Compile Remove="Umbraco/Models/all.generated.cs" />
|
||||
<None Remove="Umbraco/Models/models.generated.cs" />
|
||||
<Compile Remove="Umbraco/Models/models.generated.cs" />
|
||||
<Folder Remove="Umbraco/Models/Compiled"/>
|
||||
<Folder Remove="Umbraco/Models/Compiled" />
|
||||
<None Remove="Umbraco/Models/Compiled/**" />
|
||||
<None Remove="Umbraco/Models/all.dll.path" />
|
||||
<None Remove="Umbraco/Models/models.hash" />
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage
|
||||
@{
|
||||
Layout = null;
|
||||
}
|
||||
@@ -1,11 +1,28 @@
|
||||
{
|
||||
"Serilog": {
|
||||
"MinimumLevel": {
|
||||
"Default": "Information"
|
||||
},
|
||||
"WriteTo:1":
|
||||
{
|
||||
"Name": "Async",
|
||||
"Args": {
|
||||
"configure": [
|
||||
{
|
||||
"Name": "Console"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
"Umbraco": {
|
||||
"CMS": {
|
||||
"Global":{
|
||||
"Smtp": {
|
||||
"From": "your@email.here",
|
||||
"Host": "localhost",
|
||||
"Port": "25"
|
||||
// "From": "your@email.here",
|
||||
// "Host": "localhost",
|
||||
// "Port": "25"
|
||||
}
|
||||
},
|
||||
"Hosting":{
|
||||
|
||||
@@ -1,64 +1,83 @@
|
||||
{
|
||||
"ConnectionStrings": {
|
||||
"umbracoDbDSN": ""
|
||||
},
|
||||
"Umbraco": {
|
||||
"CMS": {
|
||||
"Content": {
|
||||
"Notifications": {
|
||||
"Email": "your@email.here"
|
||||
"ConnectionStrings": {
|
||||
"umbracoDbDSN": "Data Source=|DataDirectory|\\Umbraco.sdf;Flush Interval=1;"
|
||||
},
|
||||
"Serilog": {
|
||||
"Using": [
|
||||
"Umbraco.Infrastructure"
|
||||
],
|
||||
"MinimumLevel": {
|
||||
"Default": "Information",
|
||||
"Override": {
|
||||
"Microsoft": "Warning",
|
||||
"Microsoft.Hosting.Lifetime": "Information",
|
||||
"System": "Warning"
|
||||
}
|
||||
},
|
||||
"MacroErrors": "throw"
|
||||
},
|
||||
"Global": {
|
||||
"DefaultUILanguage": "en-us",
|
||||
"HideTopLevelNodeFromPath": true,
|
||||
"Path": "~/umbraco",
|
||||
"TimeOutInMinutes": 20,
|
||||
"UseHttps": false
|
||||
},
|
||||
"Hosting": {
|
||||
"Debug": false
|
||||
},
|
||||
"KeepAlive": {
|
||||
"DisableKeepAliveTask": false,
|
||||
"KeepAlivePingUrl": "{umbracoApplicationUrl}/api/keepalive/ping"
|
||||
},
|
||||
"RequestHandler": {
|
||||
"ConvertUrlsToAscii": "try"
|
||||
},
|
||||
"RuntimeMinification": {
|
||||
"dataFolder": "App_Data\\Smidge",
|
||||
"version": "1"
|
||||
},
|
||||
"Security": {
|
||||
"KeepUserLoggedIn": false,
|
||||
"UsernameIsEmail": true,
|
||||
"HideDisabledUsersInBackoffice": false,
|
||||
"UserPassword": {
|
||||
"RequiredLength": 10,
|
||||
"RequireNonLetterOrDigit": false,
|
||||
"RequireDigit": false,
|
||||
"RequireLowercase": false,
|
||||
"RequireUppercase": false,
|
||||
"MaxFailedAccessAttemptsBeforeLockout": 5
|
||||
},
|
||||
"MemberPassword": {
|
||||
"RequiredLength": 10,
|
||||
"RequireNonLetterOrDigit": false,
|
||||
"RequireDigit": false,
|
||||
"RequireLowercase": false,
|
||||
"RequireUppercase": false,
|
||||
"MaxFailedAccessAttemptsBeforeLockout": 5
|
||||
"WriteTo:0": {
|
||||
"Name": "UmbracoFile",
|
||||
"Args": {
|
||||
"path" : "%UMBLOGDIR%/UmbracoTraceLog.%MACHINENAME%..json"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Umbraco": {
|
||||
"CMS": {
|
||||
"Content": {
|
||||
"Notifications": {
|
||||
"Email": "your@email.here"
|
||||
},
|
||||
"MacroErrors": "throw"
|
||||
},
|
||||
"Global": {
|
||||
"DefaultUILanguage": "en-us",
|
||||
"HideTopLevelNodeFromPath": true,
|
||||
"Path": "~/umbraco",
|
||||
"TimeOutInMinutes": 20,
|
||||
"UseHttps": false
|
||||
},
|
||||
"Hosting": {
|
||||
"Debug": false
|
||||
},
|
||||
"KeepAlive": {
|
||||
"DisableKeepAliveTask": false,
|
||||
"KeepAlivePingUrl": "{umbracoApplicationUrl}/api/keepalive/ping"
|
||||
},
|
||||
"RequestHandler": {
|
||||
"ConvertUrlsToAscii": "try"
|
||||
},
|
||||
"RuntimeMinification": {
|
||||
"dataFolder": "App_Data\\Smidge",
|
||||
"version": "1"
|
||||
},
|
||||
"Security": {
|
||||
"KeepUserLoggedIn": false,
|
||||
"UsernameIsEmail": true,
|
||||
"HideDisabledUsersInBackoffice": false,
|
||||
"UserPassword": {
|
||||
"RequiredLength": 10,
|
||||
"RequireNonLetterOrDigit": false,
|
||||
"RequireDigit": false,
|
||||
"RequireLowercase": false,
|
||||
"RequireUppercase": false,
|
||||
"MaxFailedAccessAttemptsBeforeLockout": 5
|
||||
},
|
||||
"MemberPassword": {
|
||||
"RequiredLength": 10,
|
||||
"RequireNonLetterOrDigit": false,
|
||||
"RequireDigit": false,
|
||||
"RequireLowercase": false,
|
||||
"RequireUppercase": false,
|
||||
"MaxFailedAccessAttemptsBeforeLockout": 5
|
||||
}
|
||||
},
|
||||
"Tours": {
|
||||
"EnableTours": true
|
||||
},
|
||||
"ModelsBuilder": {
|
||||
"ModelsMode": "PureLive",
|
||||
"Enable": "true"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Tours": {
|
||||
"EnableTours": true
|
||||
},
|
||||
"ModelsBuilder": {
|
||||
"ModelsMode": "PureLive",
|
||||
"Enable": "true"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
|
||||
<!-- Used to toggle the log levels for the main Umbraco log files -->
|
||||
<!-- Found at /app_data/logs/ -->
|
||||
<!-- NOTE: Changing this will also flow down into serilog.user.config -->
|
||||
<!-- VALID Values: Verbose, Debug, Information, Warning, Error, Fatal -->
|
||||
<add key="serilog:minimum-level" value="Information" />
|
||||
|
||||
<!-- NOTE: This is how sources can have a different level -->
|
||||
<!--
|
||||
<add key="serilog:minimum-level:override:Umbraco.Core.Composing.TypeLoader" value="Warning" />
|
||||
-->
|
||||
|
||||
<!-- NOTE: Only one logger below can be enabled, you cannot log JSON & TXT files at the same time -->
|
||||
|
||||
<!-- Default JSON log file -->
|
||||
<!-- This is used by the default log viewer in the Umbraco backoffice -->
|
||||
<add key="serilog:using:File" value="Umbraco.Infrastructure" />
|
||||
<add key="serilog:write-to:File.formatter" value="Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact" />
|
||||
<add key="serilog:write-to:File.path" value="%UMBLOGDIR%\UmbracoTraceLog.%MACHINENAME%..json" />
|
||||
<add key="serilog:write-to:File.restrictedToMinimumLevel" value="Debug" />
|
||||
<add key="serilog:write-to:File.retainedFileCountLimit" value="" /> <!-- Number of log files to keep (or remove value to keep all files) -->
|
||||
<add key="serilog:write-to:File.rollingInterval" value="Day" /> <!-- Create a new log file every Minute/Hour/Day/Month/Year/infinite -->
|
||||
|
||||
|
||||
<!-- Optional TXT log file -->
|
||||
<!--<add key="serilog:using:File" value="Serilog.Sinks.File" /> -->
|
||||
<!--<add key="serilog:write-to:File.path" value="%UMBLOGDIR%\UmbracoTraceLog.%MACHINENAME%..txt" /> -->
|
||||
<!--<add key="serilog:write-to:File.shared" value="true" /> -->
|
||||
<!--<add key="serilog:write-to:File.restrictedToMinimumLevel" value="Debug" /> -->
|
||||
<!--<add key="serilog:write-to:File.retainedFileCountLimit" value="" /> --> <!-- Number of log files to keep (or remove value to keep all files) -->
|
||||
<!--<add key="serilog:write-to:File.rollingInterval" value="Day" /> --> <!-- Create a new log file every Minute/Hour/Day/Month/Year/infinite -->
|
||||
<!--<add key="serilog:write-to:File.outputTemplate" value="{Timestamp:yyyy-MM-dd HH:mm:ss,fff} [P{ProcessId}/D{AppDomainId}/T{ThreadId}] {Log4NetLevel} {SourceContext} - {Message:lj}{NewLine}{Exception}" /> -->
|
||||
|
||||
<!-- To write to new log locations (aka Sinks) such as your own .txt files with filtering, ELMAH.io, Elastic, SEQ -->
|
||||
<!-- Please use the serilog.user.config file to configure your own logging needs -->
|
||||
|
||||
</appSettings>
|
||||
</configuration>
|
||||
@@ -1,41 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
|
||||
<!-- Used to toggle the log levels for the main Umbraco log files -->
|
||||
<!-- Found at /app_data/logs/ -->
|
||||
<!-- NOTE: Changing this will also flow down into serilog.user.config -->
|
||||
<!-- VALID Values: Verbose, Debug, Information, Warning, Error, Fatal -->
|
||||
<add key="serilog:minimum-level" value="Information" />
|
||||
|
||||
<!-- NOTE: This is how sources can have a different level -->
|
||||
<!--
|
||||
<add key="serilog:minimum-level:override:Umbraco.Core.Composing.TypeLoader" value="Warning" />
|
||||
-->
|
||||
|
||||
<!-- NOTE: Only one logger below can be enabled, you cannot log JSON & TXT files at the same time -->
|
||||
|
||||
<!-- Default JSON log file -->
|
||||
<!-- This is used by the default log viewer in the Umbraco backoffice -->
|
||||
<add key="serilog:using:File" value="Umbraco.Infrastructure" />
|
||||
<add key="serilog:write-to:File.formatter" value="Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact" />
|
||||
<add key="serilog:write-to:File.path" value="%UMBLOGDIR%/UmbracoTraceLog.%MACHINENAME%..json" /> <!-- folder seperator need to be / and not \ to support both windows and linux-->
|
||||
<add key="serilog:write-to:File.restrictedToMinimumLevel" value="Debug" />
|
||||
<add key="serilog:write-to:File.retainedFileCountLimit" value="" /> <!-- Number of log files to keep (or remove value to keep all files) -->
|
||||
<add key="serilog:write-to:File.rollingInterval" value="Day" /> <!-- Create a new log file every Minute/Hour/Day/Month/Year/infinite -->
|
||||
|
||||
|
||||
<!-- Optional TXT log file -->
|
||||
<!--<add key="serilog:using:File" value="Serilog.Sinks.File" /> -->
|
||||
<!--<add key="serilog:write-to:File.path" value="%UMBLOGDIR%\UmbracoTraceLog.%MACHINENAME%..txt" /> -->
|
||||
<!--<add key="serilog:write-to:File.shared" value="true" /> -->
|
||||
<!--<add key="serilog:write-to:File.restrictedToMinimumLevel" value="Debug" /> -->
|
||||
<!--<add key="serilog:write-to:File.retainedFileCountLimit" value="" /> --> <!-- Number of log files to keep (or remove value to keep all files) -->
|
||||
<!--<add key="serilog:write-to:File.rollingInterval" value="Day" /> --> <!-- Create a new log file every Minute/Hour/Day/Month/Year/infinite -->
|
||||
<!--<add key="serilog:write-to:File.outputTemplate" value="{Timestamp:yyyy-MM-dd HH:mm:ss,fff} [P{ProcessId}/D{AppDomainId}/T{ThreadId}] {Log4NetLevel} {SourceContext} - {Message:lj}{NewLine}{Exception}" /> -->
|
||||
|
||||
<!-- To write to new log locations (aka Sinks) such as your own .txt files with filtering, ELMAH.io, Elastic, SEQ -->
|
||||
<!-- Please use the serilog.user.config file to configure your own logging needs -->
|
||||
|
||||
</appSettings>
|
||||
</configuration>
|
||||
@@ -1,39 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
|
||||
<!-- Controls log levels for all user-defined child sub-logger sinks configured here (Set this higher than child sinks defined here) -->
|
||||
<!-- VALID Values: Verbose, Debug, Information, Warning, Error, Fatal -->
|
||||
<add key="serilog:minimum-level" value="Information" />
|
||||
|
||||
<!-- For Different Namespaces - Set different logging levels -->
|
||||
<!--
|
||||
<add key="serilog:minimum-level:override:Microsoft" value="Warning" />
|
||||
<add key="serilog:minimum-level:override:Microsoft.AspNetCore.Mvc" value="Error" />
|
||||
<add key="serilog:minimum-level:override:YourNameSpace" value="Information" />
|
||||
-->
|
||||
|
||||
<!-- All logs defined via user.config will contain this property (won't be in main Umbraco logs) -->
|
||||
<!--
|
||||
<add key="serilog:enrich:with-property:websiteName" value="My Awesome Website - Development" />
|
||||
-->
|
||||
|
||||
<!-- Write to a user log file -->
|
||||
<!--
|
||||
<add key="serilog:using:File" value="Serilog.Sinks.File" />
|
||||
<add key="serilog:write-to:File.path" value="%BASEDIR%\logs\my-custom-logfile.txt" />
|
||||
<add key="serilog:write-to:File.shared" value="true" />
|
||||
<add key="serilog:write-to:File.restrictedToMinimumLevel" value="Debug" />
|
||||
<add key="serilog:write-to:File.retainedFileCountLimit" value="32" />--> <!-- Number of log files to keep (or remove value to keep all files) -->
|
||||
<!--<add key="serilog:write-to:File.rollingInterval" value="Day" />--> <!-- Create a new log file every Minute/Hour/Day/Month/Year/infinite -->
|
||||
<!--<add key="serilog:write-to:File.outputTemplate" value="{Timestamp:yyyy-MM-dd HH:mm:ss,fff} [P{ProcessId}/D{AppDomainId}/T{ThreadId}] {Log4NetLevel} {SourceContext} - {Message:lj}{NewLine}{Exception}" /> -->
|
||||
|
||||
<!-- Filters all above sink's to use this expression -->
|
||||
<!-- Common use case is to include SourceType starting with your own namespace -->
|
||||
<!--
|
||||
<add key="serilog:using:FilterExpressions" value="Serilog.Filters.Expressions" />
|
||||
<add key="serilog:filter:ByIncludingOnly.expression" value="StartsWith(SourceContext, 'Umbraco.Core')" />
|
||||
-->
|
||||
|
||||
</appSettings>
|
||||
</configuration>
|
||||
@@ -1,39 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
|
||||
<!-- Controls log levels for all user-defined child sub-logger sinks configured here (Set this higher than child sinks defined here) -->
|
||||
<!-- VALID Values: Verbose, Debug, Information, Warning, Error, Fatal -->
|
||||
<add key="serilog:minimum-level" value="Information" />
|
||||
|
||||
<!-- For Different Namespaces - Set different logging levels -->
|
||||
<!--
|
||||
<add key="serilog:minimum-level:override:Microsoft" value="Warning" />
|
||||
<add key="serilog:minimum-level:override:Microsoft.AspNetCore.Mvc" value="Error" />
|
||||
<add key="serilog:minimum-level:override:YourNameSpace" value="Information" />
|
||||
-->
|
||||
|
||||
<!-- All logs defined via user.config will contain this property (won't be in main Umbraco logs) -->
|
||||
<!--
|
||||
<add key="serilog:enrich:with-property:websiteName" value="My Awesome Website - Development" />
|
||||
-->
|
||||
|
||||
<!-- Write to a user log file -->
|
||||
<!--
|
||||
<add key="serilog:using:File" value="Serilog.Sinks.File" />
|
||||
<add key="serilog:write-to:File.path" value="%BASEDIR%\logs\my-custom-logfile.txt" />
|
||||
<add key="serilog:write-to:File.shared" value="true" />
|
||||
<add key="serilog:write-to:File.restrictedToMinimumLevel" value="Debug" />
|
||||
<add key="serilog:write-to:File.retainedFileCountLimit" value="32" />--> <!-- Number of log files to keep (or remove value to keep all files) -->
|
||||
<!--<add key="serilog:write-to:File.rollingInterval" value="Day" />--> <!-- Create a new log file every Minute/Hour/Day/Month/Year/infinite -->
|
||||
<!--<add key="serilog:write-to:File.outputTemplate" value="{Timestamp:yyyy-MM-dd HH:mm:ss,fff} [P{ProcessId}/D{AppDomainId}/T{ThreadId}] {Log4NetLevel} {SourceContext} - {Message:lj}{NewLine}{Exception}" /> -->
|
||||
|
||||
<!-- Filters all above sink's to use this expression -->
|
||||
<!-- Common use case is to include SourceType starting with your own namespace -->
|
||||
<!--
|
||||
<add key="serilog:using:FilterExpressions" value="Serilog.Filters.Expressions" />
|
||||
<add key="serilog:filter:ByIncludingOnly.expression" value="StartsWith(SourceContext, 'Umbraco.Core')" />
|
||||
-->
|
||||
|
||||
</appSettings>
|
||||
</configuration>
|
||||
@@ -1,10 +1,12 @@
|
||||
using Serilog.Context;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using System.Web;
|
||||
using System.Web.Hosting;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Composing;
|
||||
@@ -41,11 +43,9 @@ namespace Umbraco.Web
|
||||
|
||||
var hostingEnvironment = new AspNetHostingEnvironment(hostingSettings);
|
||||
var loggingConfiguration = new LoggingConfiguration(
|
||||
Path.Combine(hostingEnvironment.ApplicationPhysicalPath, "App_Data\\Logs"),
|
||||
Path.Combine(hostingEnvironment.ApplicationPhysicalPath, "config\\serilog.config"),
|
||||
Path.Combine(hostingEnvironment.ApplicationPhysicalPath, "config\\serilog.user.config"));
|
||||
Path.Combine(hostingEnvironment.ApplicationPhysicalPath, "App_Data\\Logs"));
|
||||
var ioHelper = new IOHelper(hostingEnvironment);
|
||||
var logger = SerilogLogger.CreateWithDefaultConfiguration(hostingEnvironment, loggingConfiguration);
|
||||
var logger = SerilogLogger.CreateWithDefaultConfiguration(hostingEnvironment, loggingConfiguration, new ConfigurationRoot(new List<IConfigurationProvider>()));
|
||||
|
||||
var configs = configFactory.Create();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user