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 System.Linq;
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Internal; using Volo.Abp.Internal;
using Volo.Abp.Logging;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace Volo.Abp namespace Volo.Abp
@ -71,11 +73,30 @@ namespace Volo.Abp
{ {
using (var scope = ServiceProvider.CreateScope()) using (var scope = ServiceProvider.CreateScope())
{ {
WriteInitLogs(scope.ServiceProvider);
scope.ServiceProvider scope.ServiceProvider
.GetRequiredService<IModuleManager>() .GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(scope.ServiceProvider)); .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) protected virtual IReadOnlyList<IAbpModuleDescriptor> LoadModules(IServiceCollection services, AbpApplicationCreationOptions options)
{ {

@ -1,6 +1,7 @@
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Logging;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Reflection; using Volo.Abp.Reflection;
@ -35,6 +36,7 @@ namespace Volo.Abp.Internal
services.TryAddSingleton<IModuleLoader>(moduleLoader); services.TryAddSingleton<IModuleLoader>(moduleLoader);
services.TryAddSingleton<IAssemblyFinder>(assemblyFinder); services.TryAddSingleton<IAssemblyFinder>(assemblyFinder);
services.TryAddSingleton<ITypeFinder>(typeFinder); services.TryAddSingleton<ITypeFinder>(typeFinder);
services.TryAddSingleton<IInitLogger>(new DefaultInitLogger());
services.AddAssemblyOf<IAbpApplication>(); 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.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Microsoft.Extensions.Logging;
using Volo.Abp.Logging;
namespace Volo.Abp.Modularity namespace Volo.Abp.Modularity
{ {
internal static class AbpModuleHelper 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>(); var moduleTypes = new List<Type>();
AddModuleAndDependenciesResursively(moduleTypes, startupModuleType); logger.Log(LogLevel.Information, "Loaded ABP modules:");
AddModuleAndDependenciesResursively(moduleTypes, startupModuleType, logger);
return moduleTypes; return moduleTypes;
} }
@ -35,7 +38,11 @@ namespace Volo.Abp.Modularity
return dependencies; 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); AbpModule.CheckAbpModuleType(moduleType);
@ -45,10 +52,11 @@ namespace Volo.Abp.Modularity
} }
moduleTypes.Add(moduleType); moduleTypes.Add(moduleType);
logger.Log(LogLevel.Information, $"{new string(' ', depth * 2)}- {moduleType.FullName}");
foreach (var dependedModuleType in FindDependedModuleTypes(moduleType)) 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.Collections.Generic;
using System.Linq; using System.Linq;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Logging;
using Volo.Abp.Modularity.PlugIns; using Volo.Abp.Modularity.PlugIns;
namespace Volo.Abp.Modularity namespace Volo.Abp.Modularity
@ -43,14 +44,16 @@ namespace Volo.Abp.Modularity
Type startupModuleType, Type startupModuleType,
PlugInSourceList plugInSources) PlugInSourceList plugInSources)
{ {
var initLogger = services.GetInitLogger();
//All modules starting from the startup module //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)); modules.Add(CreateModuleDescriptor(services, moduleType));
} }
//Plugin modules //Plugin modules
foreach (var moduleType in plugInSources.GetAllModules()) foreach (var moduleType in plugInSources.GetAllModules(initLogger))
{ {
if (modules.Any(m => m.Type == moduleType)) if (modules.Any(m => m.Type == moduleType))
{ {

@ -32,8 +32,6 @@ namespace Volo.Abp.Modularity
public void InitializeModules(ApplicationInitializationContext context) public void InitializeModules(ApplicationInitializationContext context)
{ {
LogListOfModules();
foreach (var contributor in _lifecycleContributors) foreach (var contributor in _lifecycleContributors)
{ {
foreach (var module in _moduleContainer.Modules) foreach (var module in _moduleContainer.Modules)
@ -52,16 +50,6 @@ namespace Volo.Abp.Modularity
_logger.LogInformation("Initialized all ABP modules."); _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) public void ShutdownModules(ApplicationShutdownContext context)
{ {
var modules = _moduleContainer.Modules.Reverse().ToList(); var modules = _moduleContainer.Modules.Reverse().ToList();

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

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

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

Loading…
Cancel
Save