Serilog - nie wszystkie logi zapisywane są do pliku

0

Witam.
Ostatnio widziałem tutaj posta, w którym był porównany Serilog z NLog. Do tej pory używałem NLog ale postanowiłem dać szanse temu drugiemu. No i zaczęły się problemy.

Mam trzy projekty w solucji. Jeden z projektów to biblioteka (Class Library), która ma Serilog i obiekt Loggera.

public static class AppUtils
{
        private static Logger _logger;
     
        public static void Error(Exception ex, string message)
        {
            if (_logger is null)
                _logger = new LoggerConfiguration().MinimumLevel.Information().WriteTo.File("logs.log", rollingInterval: RollingInterval.Day).CreateLogger();

            _logger.Error(ex, message);
        }

        public static void Information(string message)
        {
            if (_logger is null)
                _logger = new LoggerConfiguration().MinimumLevel.Information().WriteTo.File("logs.log", rollingInterval: RollingInterval.Day).CreateLogger();

            _logger.Information(message);
        }
}

Loguje mi tylko wpis z formy, w której uruchamiam usługę

AppUtils.Information("Uruchamiam usługę");

NIE LOGUJE - w usłudze

            try
            {
                AppUtils.Information("Uruchamiam usługę");
                _sql = new SqlService();
                _appConfig = _sql.LoadConfiguration();
                _optima = new OptimaService(_sql, _appConfig);

                TimerService.CreateSchedules(_appConfig, _optima, _sql);
                AppUtils.Information("Usługa uruchomiona. Timery ustawione");
            }
            catch(Exception ex)
            {
                AppUtils.Error(ex, "ServiceStart");
            }

NIE LOGUJE - jedno z zadań, które uruchamiam przy pomocy FluentScheduler

        public void Execute()
        {
            AppUtils.Information("[ORDER_JOB] Starting");
            EmpikService empik = new EmpikService(_appConfig, _sql);

            try
            {
                AppUtils.Information("[ORDER_JOB] GetAndAcceptNewOrders()");

                empik.GetAndAcceptNewOrders();
            }
            catch (Exception ex)
            {
                AppUtils.Error(ex, "[ORDER_JOB] GetAndAcceptNewOrders()");
            }

            try
            {
                var orders = empik.GetOrdersForShipping();

                for (int i = 0; i < orders.Orders.Count; i++)
                {
                    var order = orders.Orders[i];
                    try
                    {
                        AppUtils.Information("[ORDER_JOB] InsertOrder " + order.OrderId);
                        _optima.InsertOrder(order);
                    }
                    catch (Exception ex)
                    {
                        AppUtils.Error(ex, "[ORDER_JOB] InsertOrder()");
                    }
                }
            }
            catch(Exception ex)
            {
                AppUtils.Error(ex, "[ORDER_JOB] GetOrdersForShipping()");
            }
        }

Co robię źle? Jak mam ogarnąć "globalny" logger? Najlepiej było by jakby każdy element miał swojego loggera ale to też nie działa. Też loguje mi tylko z projektu WinForms.

2

Może jest inna ścieżka i plik ląduje gdzie indziej?

0

No ale jakim cudem? Plik logs20210702.log pojawia się normalnie w folderze gdzie aplikacja jest z wpisem

2021-07-02 14:42:38.994 +02:00 [INF] Uruchamiam usługę

I jest tylko ten wpis. Żadnego innego już nie ma.

1
if (_logger is null)
    _logger = new LoggerConfiguration().MinimumLevel.Information().WriteTo.File("logs.log", rollingInterval: RollingInterval.Day).CreateLogger();

a może static constructor?

albo

private static Logger _logger = new LoggerConfiguration().MinimumLevel.Information().WriteTo.File("logs.log", rollingInterval: RollingInterval.Day).CreateLogger();

a co się stanie jak dasz dla testu ścieżkę absolutną do pliku? C:\logs\log.log

0

To faktycznie jest kwestia ścieżki. Gdy robiłem debug to Serilog zapisywał tam gdzie apka się zbudowała. W momencie kiedy zrobiłem release i apka była gdzie indziej, to działały logi z okienkowej, ale nie z biblioteki i usługi, ponieważ (najprawdopodobniej) kontekst, ścieżka gdzie usługa się uruchamia nie jest tam gdzie jest plik .exe, a wydawało się to logiczne. Pytanie teraz - czy to jest kwestia samego Serilog, że tak ogarnia podanie tylko nazwy pliku, czy całego .NET i Windowsa? Gdzie domyślnie taki plik z logiem by wylądował jak nie podam całej ścieżki?

1

To jest kwestia Windowsa i aplikacji gdzie będzie miała ustawiona ścieżkę aktualną. Ja stosuje w Serilog ścieżki względem i konfigurację z pliku. I np przy starcie windows service podaje mi jaka jest ustawiona ścieżka aktualną w aplikacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1