Как использовать отдельный файл журнала для каждой службы в ядре .NET

Я пытаюсь регистрировать ошибки и информацию для каждой службы, используя ядро ​​.net. Как использовать отдельные файлы для ведения журнала.

В настоящее время я использую один файл для регистрации всех ошибок и информации.

Вот мои Program.cs и Startup.cs

// Program.cs

public static void Main(string[] args)
        {
            CreateWebHostBuilder(args)
                .ConfigureLogging((hostingContext, logging) =>
                {
                    // Requires `using Microsoft.Extensions.Logging;`
                    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                    logging.AddConsole();
                    logging.AddDebug();
                    logging.AddEventSourceLogger();
                })
                .Build()
                .Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.AddConsole();
                });


// Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {

            loggerFactory.AddFile("Logs/SmsDomeLogs-{Date}.txt");
            //.........
        }

1 ответ

Идея в качестве обходного пути может заключаться в создании настраиваемого регистратора, который записывает данные в файл, и вы можете создать имя файла, которое будет содержать какую-то настраиваемую строку из ваших служб. Я тоже этим способом пользуюсь. Например:

private static string logFilePath;
private static readonly object _lock = new object();

public static void log(string serviceId, string className, string error, Exception exception) {
    string toLog = $"{className}: {error}";
    lock (_lock) {
        if (string.IsNullOrEmpty(logFilePath)) {
            string fileName = $"log-{DateTime.Now.Month}-{DateTime.Now.Day}-{serviceId}.log"; // you can also date if you want
            logFilePath = Path.Combine(<path to save>, fileName);
            if (!File.Exists(logFilePath)) {
                // create the file
            }
        }
        if (exception != null) { // you can log exceptions and debug messages too
            toLog += Environment.NewLine + exception.ToString();
        }

        toLog = $"{<you can add here date if you want>} - {toLog}";
        using (StreamWriter writer = File.AppendText(logFilePath)) {
            writer.WriteLine(toLog);
        }
    }
}

И, конечно же, вы можете улучшить, как хотите, добавить уровни журнала и т. Д.

Другие вопросы по тегам