Как использовать Serilog для записи файла для каждого клиента? - PullRequest
1 голос
/ 02 октября 2019

Я делаю основное приложение .Net и использую Serilog для регистрации. Теперь я хочу использовать Serilog для записи журнала для всех клиентов, которые уже вошли в систему.

Я ожидал, что приложение будет иметь отдельный регистратор

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

Из того, что я пытался сделать, приложение генерирует текстовый файл. Однако он ничего не записывает в него.

Program.cs

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

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

    }

Startup.cs

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<LoggerManager>();
}
...MORE CODE...
}

LoggerManager.cs

public class LoggerManager
    {
        public static Dictionary<string, ILogger> loggerDict = new Dictionary<string, ILogger>();

public void CreateUserLogger(string username, EnumType userType)
        {
            var logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .WriteTo.Console()
                .WriteTo.Async(a => a.File(@$"Log/{userType}/{username}.txt",
                        buffered:true,
                        rollingInterval:RollingInterval.Day,
                        retainedFileCountLimit:90))
                .CreateLogger();
            loggerDict.TryAdd(cheID, logger);
        }

        public void WriteInfoLog (string username, string message)
        {
            loggerDict.TryGetValue(username, out ILogger logger);
            logger.Information(message);
        }


}

HomeController.cs

class HomeController {

        private readonly LoggerManager _loggerManager;
        public HomeController(LoggerManager loggerManager)
        {
            _loggerManager = loggerManager;
        }
public IActionResult Index() {

                _loggerManager.WriteInfoLog(authenticatedUser.CHEID, "HELLO HOW ARE U TODAY");
    return View();
}
}

appsettings.json

 "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "System": "Warning",
        "Microsoft": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Async",
        "Args": {
          "configure": [
            {
              "Name": "File",
              "Args": {
                "path": "Logs/Server/serverlog.txt",
                "rollingInterval": "Day",
                "retainedFileCountLimit": 7,
                "buffered": true
              }
            }
          ]
        }
      }
    ]
  }

1 Ответ

0 голосов
/ 02 октября 2019

Я случайно нашел «карту раковин». Эти раковины определенно удовлетворяют моим требованиям.

https://github.com/serilog/serilog-sinks-map

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...