Solution is to have a static reference to the LoggerFactory in a utility static class initialized on startup:
/// <summary> /// Shared logger /// </summary> internal static class ApplicationLogging { internal static ILoggerFactory LoggerFactory { get; set; }// = new LoggerFactory(); internal static ILogger CreateLogger<T>() => LoggerFactory.CreateLogger<T>(); internal static ILogger CreateLogger(string categoryName) => LoggerFactory.CreateLogger(categoryName); } /// <summary> /// Shared logger /// </summary> internal static class ApplicationLogging { internal static ILoggerFactory LoggerFactory { get; set; }// = new LoggerFactory(); internal static ILogger CreateLogger<T>() => LoggerFactory.CreateLogger<T>(); internal static ILogger CreateLogger(string categoryName) => LoggerFactory.CreateLogger(categoryName); } Which you initialize on Startup.cs:
public Startup(ILogger<Startup> logger, ILoggerFactory logFactory, IHostingEnvironment hostingEnvironment) { _log = logger; _hostingEnvironment = hostingEnvironment; Util.ApplicationLogging.LoggerFactory = logFactory;//<===HERE } public Startup(ILogger<Startup> logger, ILoggerFactory logFactory, IHostingEnvironment hostingEnvironment) { _log = logger; _hostingEnvironment = hostingEnvironment; Util.ApplicationLogging.LoggerFactory = logFactory;//<===HERE } Then you can build a logger to use from your static class like so:
internal static class CoreJobSweeper { private static ILogger log = Util.ApplicationLogging.CreateLogger("CoreJobSweeper"); } internal static class CoreJobSweeper { private static ILogger log = Util.ApplicationLogging.CreateLogger("CoreJobSweeper"); }