Kien Alexander Nguyen
Kien Alexander Nguyen

Reputation: 85

How to use Serilog to write file for each client?

I am making .Net core application and use Serilog for logging. Now I want to use Serilog to write a log for each clients who already logged in.

I expected the application gonna have seperate logger

From what I tried to do the application do generate the txt file. However, it doesn't write anything to it.

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
              }
            }
          ]
        }
      }
    ]
  }

Upvotes: 2

Views: 2473

Answers (1)

Kien Alexander Nguyen
Kien Alexander Nguyen

Reputation: 85

I randomly found the "sinks-map". This sinks definitely satisfy my requirement.

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

Upvotes: 1

Related Questions