Resolves #7965: Logging on Service Registration.

pull/7977/head
Halil İbrahim Kalkan 5 years ago
parent 62100f16dc
commit 859c4e9a6c

@ -0,0 +1,12 @@
using Volo.Abp.Logging;
namespace Microsoft.Extensions.DependencyInjection
{
public static class ServiceCollectionLoggingExtensions
{
public static IInitLogger GetInitLogger(this IServiceCollection services)
{
return services.GetSingletonInstance<IInitLogger>();
}
}
}

@ -3,8 +3,10 @@ using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Internal;
using Volo.Abp.Logging;
using Volo.Abp.Modularity;
namespace Volo.Abp
@ -71,11 +73,30 @@ namespace Volo.Abp
{
using (var scope = ServiceProvider.CreateScope())
{
WriteInitLogs(scope.ServiceProvider);
scope.ServiceProvider
.GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(scope.ServiceProvider));
}
}
protected virtual void WriteInitLogs(IServiceProvider serviceProvider)
{
var logger = serviceProvider.GetService<ILogger<AbpApplicationBase>>();
if (logger == null)
{
return;
}
var initLogger = serviceProvider.GetRequiredService<IInitLogger>();
foreach (var entry in initLogger.Entries)
{
logger.LogWithLevel(entry.Level, entry.Message, entry.Exception);
}
initLogger.Entries.Clear();
}
protected virtual IReadOnlyList<IAbpModuleDescriptor> LoadModules(IServiceCollection services, AbpApplicationCreationOptions options)
{

@ -1,6 +1,7 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Logging;
using Volo.Abp.Modularity;
using Volo.Abp.Reflection;
@ -35,6 +36,7 @@ namespace Volo.Abp.Internal
services.TryAddSingleton<IModuleLoader>(moduleLoader);
services.TryAddSingleton<IAssemblyFinder>(assemblyFinder);
services.TryAddSingleton<ITypeFinder>(typeFinder);
services.TryAddSingleton<IInitLogger>(new DefaultInitLogger());
services.AddAssemblyOf<IAbpApplication>();

@ -0,0 +1,26 @@
using System;
using JetBrains.Annotations;
using Microsoft.Extensions.Logging;
namespace Volo.Abp.Logging
{
public class AbpInitLogEntry
{
public LogLevel Level { get; }
public string Message { get; }
[CanBeNull]
public Exception Exception { get; }
public AbpInitLogEntry(
LogLevel level,
string message,
Exception exception)
{
Level = level;
Message = message;
Exception = exception;
}
}
}

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
namespace Volo.Abp.Logging
{
public class DefaultInitLogger : IInitLogger
{
public List<AbpInitLogEntry> Entries { get; }
public DefaultInitLogger()
{
Entries = new List<AbpInitLogEntry>();
}
public void Log(
LogLevel logLevel,
string message,
Exception exception = null)
{
Entries.Add(new AbpInitLogEntry(logLevel, message, exception));
}
}
}

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
namespace Volo.Abp.Logging
{
public interface IInitLogger
{
public List<AbpInitLogEntry> Entries { get; }
void Log(
LogLevel logLevel,
string message,
Exception exception = null);
}
}

@ -2,15 +2,18 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Microsoft.Extensions.Logging;
using Volo.Abp.Logging;
namespace Volo.Abp.Modularity
{
internal static class AbpModuleHelper
{
public static List<Type> FindAllModuleTypes(Type startupModuleType)
public static List<Type> FindAllModuleTypes(Type startupModuleType, IInitLogger logger)
{
var moduleTypes = new List<Type>();
AddModuleAndDependenciesResursively(moduleTypes, startupModuleType);
logger.Log(LogLevel.Information, "Loaded ABP modules:");
AddModuleAndDependenciesResursively(moduleTypes, startupModuleType, logger);
return moduleTypes;
}
@ -35,7 +38,11 @@ namespace Volo.Abp.Modularity
return dependencies;
}
private static void AddModuleAndDependenciesResursively(List<Type> moduleTypes, Type moduleType)
private static void AddModuleAndDependenciesResursively(
List<Type> moduleTypes,
Type moduleType,
IInitLogger logger,
int depth = 0)
{
AbpModule.CheckAbpModuleType(moduleType);
@ -45,10 +52,11 @@ namespace Volo.Abp.Modularity
}
moduleTypes.Add(moduleType);
logger.Log(LogLevel.Information, $"{new string(' ', depth * 2)}- {moduleType.FullName}");
foreach (var dependedModuleType in FindDependedModuleTypes(moduleType))
{
AddModuleAndDependenciesResursively(moduleTypes, dependedModuleType);
AddModuleAndDependenciesResursively(moduleTypes, dependedModuleType, logger, depth + 1);
}
}
}

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Logging;
using Volo.Abp.Modularity.PlugIns;
namespace Volo.Abp.Modularity
@ -43,14 +44,16 @@ namespace Volo.Abp.Modularity
Type startupModuleType,
PlugInSourceList plugInSources)
{
var initLogger = services.GetInitLogger();
//All modules starting from the startup module
foreach (var moduleType in AbpModuleHelper.FindAllModuleTypes(startupModuleType))
foreach (var moduleType in AbpModuleHelper.FindAllModuleTypes(startupModuleType, initLogger))
{
modules.Add(CreateModuleDescriptor(services, moduleType));
}
//Plugin modules
foreach (var moduleType in plugInSources.GetAllModules())
foreach (var moduleType in plugInSources.GetAllModules(initLogger))
{
if (modules.Any(m => m.Type == moduleType))
{

@ -32,8 +32,6 @@ namespace Volo.Abp.Modularity
public void InitializeModules(ApplicationInitializationContext context)
{
LogListOfModules();
foreach (var contributor in _lifecycleContributors)
{
foreach (var module in _moduleContainer.Modules)
@ -52,16 +50,6 @@ namespace Volo.Abp.Modularity
_logger.LogInformation("Initialized all ABP modules.");
}
private void LogListOfModules()
{
_logger.LogInformation("Loaded ABP modules:");
foreach (var module in _moduleContainer.Modules)
{
_logger.LogInformation("- " + module.Type.FullName);
}
}
public void ShutdownModules(ApplicationShutdownContext context)
{
var modules = _moduleContainer.Modules.Reverse().ToList();

@ -1,19 +1,20 @@
using System;
using System.Linq;
using JetBrains.Annotations;
using Volo.Abp.Logging;
namespace Volo.Abp.Modularity.PlugIns
{
public static class PlugInSourceExtensions
{
[NotNull]
public static Type[] GetModulesWithAllDependencies([NotNull] this IPlugInSource plugInSource)
public static Type[] GetModulesWithAllDependencies([NotNull] this IPlugInSource plugInSource, IInitLogger logger)
{
Check.NotNull(plugInSource, nameof(plugInSource));
return plugInSource
.GetModules()
.SelectMany(AbpModuleHelper.FindAllModuleTypes)
.SelectMany(type => AbpModuleHelper.FindAllModuleTypes(type, logger))
.Distinct()
.ToArray();
}

@ -2,16 +2,17 @@
using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
using Volo.Abp.Logging;
namespace Volo.Abp.Modularity.PlugIns
{
public class PlugInSourceList : List<IPlugInSource>
{
[NotNull]
internal Type[] GetAllModules()
internal Type[] GetAllModules(IInitLogger logger)
{
return this
.SelectMany(pluginSource => pluginSource.GetModulesWithAllDependencies())
.SelectMany(pluginSource => pluginSource.GetModulesWithAllDependencies(logger))
.Distinct()
.ToArray();
}

@ -1,5 +1,6 @@
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Logging;
using Volo.Abp.Modularity.PlugIns;
using Xunit;
@ -11,7 +12,12 @@ namespace Volo.Abp.Modularity
public void Should_Load_Modules_By_Dependency_Order()
{
var moduleLoader = new ModuleLoader();
var modules = moduleLoader.LoadModules(new ServiceCollection(), typeof(MyStartupModule), new PlugInSourceList());
var modules = moduleLoader.LoadModules(
new ServiceCollection()
.AddSingleton<IInitLogger>(new DefaultInitLogger()),
typeof(MyStartupModule),
new PlugInSourceList()
);
modules.Length.ShouldBe(2);
modules[0].Type.ShouldBe(typeof(IndependentEmptyModule));
modules[1].Type.ShouldBe(typeof(MyStartupModule));

Loading…
Cancel
Save