【发布时间】:2018-08-23 06:46:25
【问题描述】:
我使用控制台、文件和 Graylog 接收器在服务器端为我的所有 .NETCore 服务使用 Serilog。我也喜欢在我的 Windows 胖客户端(WPF 应用程序)中使用它。
我有一个问题,因为我没有看到,我如何在用户成功登录后添加另一个文件接收器。我需要一个存储在全局 AppData (Environment.SpecialFolder.CommonApplicationData) 文件夹中的应用程序日志和另一个 User-log 用户 子文件夹 例如像这样:
var appName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
AppDataDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), appName);
Directory.CreateDirectory(AppDataDir);
AppLogDir = Path.Combine(AppDataDir, $@"Logs");
Directory.CreateDirectory(AppLogDir);
Log.Logger = new LoggerConfiguration()
.ReadFrom.AppSettings()
.Enrich.WithExceptionDetails()
.Enrich.FromLogContext()
.Enrich.WithProcessName()
.Enrich.WithThreadId()
.Enrich.WithAssemblyName()
.WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] [{SourceContext}] " +
"ThreadId: [{ThreadId}] {Message:lj}{NewLine}{Exception}")
.WriteTo.File(Path.Combine(AppLogDir, $"{appName}-.log"), rollOnFileSizeLimit: true,
fileSizeLimitBytes: 1048576, retainedFileCountLimit: 30,
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] [{SourceContext}] " +
"[ThreadId: {ThreadId}] {Message:lj}{NewLine}{Exception}")
.CreateLogger();
然后在我的LoginViewModel 中,在成功 登录并且在配置初始应用程序记录器很久之后,我知道用户名并且可以为该用户创建一个文件夹并在那里放一个日志文件:
var userLogDir = Path.Combine(AppDataDir, userName); // <-- userName comes from login token
Directory.CreateDirectory(userLogDir);
现在出现了棘手的问题:如何将文件接收器添加到我的现有记录器配置?我需要类似的东西:
var loggerConfig = Log.GetLoggerConfiguration(); //<--- This is missing, at least I could not find it!
loggerConfig.WriteTo.File(Path.Combine(userLogDir, $"{appName}-{userName}-.log"), rollOnFileSizeLimit: true,
fileSizeLimitBytes: 10485760, retainedFileCountLimit: 30,
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] [{SourceContext}] " +
"[ThreadId: {ThreadId}] {Message:lj}{NewLine}{Exception}")
知道如何使用 Serilog 实现这一点吗?
【问题讨论】:
标签: c# .net-core serilog graylog