Я использую Serilog на стороне сервера для всех своих служб .NETCore, использующих консоль, файл и приемники Graylog. Мне также нравится использовать его в моих толстых клиентах Windows (приложениях WPF).
С последним у меня проблема, так как я не понимаю, как я могу добавить еще один приемник файлов ПОСЛЕ того, как пользователь успешно вошел в систему. Мне нужен журнал приложения, хранящийся в глобальной папке AppData (Environment.SpecialFolder.CommonApplicationData)
, и другой журнал пользователя в подпапке пользователя, например что-то вроде этого:
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?