Logujesz tylko za pomocą zastrzyka zależności na moich kontrolerach, teraz muszę zalogować coś z klasy statycznej.

Jak mogę zalogować z klasy statycznej?

Nie mogę używać wstrzykiwania zależności, ponieważ jest statyczny i nie mogę po prostu przejść w istniejącym obiekcie rejestratora do klasy statycznej, ponieważ miałoby to złe nazwę klas w pliku dziennika.

Innymi słowy, jak mogę uzyskać rejestrator z logowania w mojej klasie statycznej?

Natknąłem się na podobne pytanie i wskazywali na artykuł na temat rejestratora w klasie statycznej, ale to nie działa, ponieważ nie mogę uzyskać nowego rejestratora, ponieważ nie zaakceptuje klasy statycznej jako parametru:

"Typy statyczne nie mogą być używane jako argumenty typu"

39
JohnC 8 luty 2018, 04:41

4 odpowiedzi

Najlepsza odpowiedź

Rozwiązanie ma mieć odniesienie statyczne do rejestratora w klasie statycznej użytkowej zainicjowaną na uruchomieniu:

/// <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);

    }

Który zainicjujesz na starcie:

 public Startup(ILogger<Startup> logger, ILoggerFactory logFactory, IHostingEnvironment hostingEnvironment)
        {
            _log = logger;
            _hostingEnvironment = hostingEnvironment;
            Util.ApplicationLogging.LoggerFactory = logFactory;//<===HERE

        }

Następnie możesz zbudować rejestrator do użycia z klasy statycznej, takiej jak:

internal static class CoreJobSweeper
    {
        private static ILogger log = Util.ApplicationLogging.CreateLogger("CoreJobSweeper");
37
JohnC 1 czerwiec 2018, 15:01

Możesz użyć instancji statycznej {X0}} z następującą metodą rozszerzenia, która akceptuje regularny parametr typu Type, a nie parametru typu ogólnego: CreateGerogger ( IloggerFactory, typ)

Tj. loggerFactory.CreateLogger(typeof(T)) zamiast {x1}}

4
Adrian 17 styczeń 2019, 11:24

Po pierwsze, zgadzam się z Nightowl888 odpowiedź.

Ale jako opcja (rozważ to jako obejście), możesz wstrzyknąć ILogger zależność od metody parametru = & gt; Więc klasa, która zadzwoni do tej metody statycznej powinna być odpowiedzialna za zapewnienie prawidłowej realizacji {x1}}.

static class YourClass
{
    public static void DoSomething(ILogger logger)
    {
         // do something
         // call log.Log();
    }
}
1
Set 8 luty 2018, 08:44

Znalazłem to pytanie z odpowiedziami przydatnymi, ale pamiętałem już zainstalowany Serilog. Zamiast wdrażać niestandardową instancję statyczną, mógłbym użyć domyślnej implementacji z Serilog.

Jest wyposażony w wiele ładnych funkcji rejestrowania z wielokrotną wersją przeciążeniem.
Oto dwa przykłady:

using Serilog;
...
    Log.Error(myException, "my message");
    Log.Warning("My message", myValue);

Serilog.Log jest instancją statyczną, która jest gotowa po skonfigurowaniu w programie.cs lub startup.cs.

1
pekaaw 17 marzec 2020, 09:43