c# - 如何使用 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
}
}
]
}
}
]
}
解决方案
我随机找到了“sinks-map”。这个水槽绝对满足我的要求。
推荐阅读
- mongodb - 从 Scala 中的 mongoDB 读取
- python - 字符串 '\' 替换为 '/'
- python - 使用 Python 类在属性更新时触发程序终止
- javascript - 第一次安装组件后 componentDidUpdate 未触发(React)
- ios - 技术上是否可以截取 iOS 音频以添加 DSP 声音过滤?
- python - ValueError:logits 和标签必须具有相同的形状 ((None, 14) vs (None, 1))
- mysql - 计算 mysql group 上未重复的元素
- spring - 弹簧和不同的方式来避免使用新的
- google-cloud-platform - 如何在 GCP memorystore redis 实例中安装 redisearch 模块
- kotlin - 当工作本身包含另一个工作时,如何等待工作加入?- 科特林