ASP. Net Core Serilog Как читать из файла журнала во время выполнения - PullRequest
2 голосов
/ 08 марта 2020

Я работаю над приложением ASP. NET Core 3.1. Я хочу записывать события в файл и иметь возможность читать их во время выполнения приложения. Для этого я пытаюсь использовать Serilog.Extensions.Logging.File пакет NuGet и затем указать путь к файлу журнала следующим образом:

Startup.cs

 public void Configure(IApplicationBuilder app, ILoggerFactory logFactory)
 {
     logFactory.AddFile("Log");
 }

Любая попытка чтения или записи в файл подобным образом

string ReadLog(string logPath)
{
    return System.IO.File.ReadAllText(logPath);
}

заканчивается System.IO.IOException: 'The process cannot access the file {log-path} because it is being used by another process.' исключением.


РЕДАКТИРОВАТЬ : я установил Serilog.AspNetCore и внес изменения, показанные ниже, а также удалил logFactory из функции Configure. Но исключение продолжает возникать.


Program.cs

public static int Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
        .Enrich.FromLogContext()
        .WriteTo.Console()
        .WriteTo.File(
            "Logs/log-.txt", 
            shared: true,
            flushToDiskInterval: TimeSpan.FromSeconds(5),
            rollingInterval: RollingInterval.Day)
        .CreateLogger();

    try
    {
        Log.Information("Starting web host");
        CreateHostBuilder(args).Build().Run();
        return 0;
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Host terminated unexpectedly");
        return 1;
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        }).UseSerilog();

РЕДАКТИРОВАТЬ 2 : по запросу julealgon Я делюсь своей точной логикой чтения c. Я пытаюсь читать с помощью контроллера, который я объявил следующим образом:

[Controller]
[Route("[controller]")]
public class LogController : Controller
{
    [Route("Read")]
    public IActionResult ReadLog(string logPath)
    {
        if (System.IO.File.Exists(logPath))
        {
            string logContent = System.IO.File.ReadAllText(logPath);//exception appears here.
            return Content(logContent);
        }
        else return NotFound();
    }
}

Затем с помощью приведенного ниже примера запроса прочитайте журнал, записанный к пятнице, 13 марта 2020 года.

https://localhost:44323/Log/Read?logPath=Logs\log-20200313.txt

1 Ответ

2 голосов
/ 09 марта 2020

При настройке приемника File существует перегрузка, предоставляющая логический аргумент shared. Если вы установите значение true (по умолчанию это false), вы сможете прочитать содержимое файла где-то еще в вашем приложении.

...