首页 > 解决方案 > 如何使用 Serilog 为每个客户端写入文件?

问题描述

我正在制作 .Net 核心应用程序并使用 Serilog 进行日志记录。现在我想使用 Serilog 为每个已经登录的客户写一个日志。

我预计应用程序会有单独的记录器

从我尝试做的应用程序生成txt文件。但是,它不会向其写入任何内容。

程序.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>();
                });

    }

启动.cs

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

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

记录器管理器.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);
        }


}

家庭控制器.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();
}
}

应用设置.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
              }
            }
          ]
        }
      }
    ]
  }

标签: c#asp.net-coreserilog

解决方案


我随机找到了“sinks-map”。这个水槽绝对满足我的要求。

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


推荐阅读