using Serilog; using Serilog.Events; namespace Avalonia_Common.Infrastructure { /// /// Serilog 日志配置 —— 可在 Avalonia-API 和 Avalonia-PC 中共享。 /// public static class LoggingConfiguration { /// /// 默认日志目录 /// private static readonly string DefaultLogDir = Path.Combine(AppContext.BaseDirectory, "logs"); /// /// 创建控制台日志记录器(开发环境)。 /// public static ILogger CreateConsoleLogger( LogEventLevel minimumLevel = LogEventLevel.Debug) { return new LoggerConfiguration() .MinimumLevel.Is(minimumLevel) .Enrich.FromLogContext() .WriteTo.Console( outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}") .CreateLogger(); } /// /// 创建控制台 + 文件日志记录器。 /// /// 最低日志级别 /// 日志目录,默认 ./logs /// 保留天数 public static ILogger CreateDefaultLogger( LogEventLevel minimumLevel = LogEventLevel.Information, string? logDir = null, int retainedDays = 30) { logDir ??= DefaultLogDir; return new LoggerConfiguration() .MinimumLevel.Is(minimumLevel) //.MinimumLevel.Override("Microsoft", LogEventLevel.Warning) //.MinimumLevel.Override("System", LogEventLevel.Warning) .Enrich.FromLogContext() .Enrich.WithMachineName() .Enrich.WithThreadId() .WriteTo.Console( outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}") .WriteTo.File( path: Path.Combine(logDir, "log-.txt"), rollingInterval: RollingInterval.Day, retainedFileCountLimit: retainedDays, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}", encoding: System.Text.Encoding.UTF8) .CreateLogger(); } /// /// 创建只写文件的日志记录器(桌面应用静默模式)。 /// public static ILogger CreateFileOnlyLogger( LogEventLevel minimumLevel = LogEventLevel.Information, string? logDir = null, int retainedDays = 30) { logDir ??= DefaultLogDir; return new LoggerConfiguration() .MinimumLevel.Is(minimumLevel) .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) .Enrich.FromLogContext() .WriteTo.File( path: Path.Combine(logDir, "app-.txt"), rollingInterval: RollingInterval.Day, retainedFileCountLimit: retainedDays, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}", encoding: System.Text.Encoding.UTF8) .CreateLogger(); } } /// /// 静态日志访问器 —— 全局静态入口,方便在没有 DI 的场景下使用。 /// public static class AppLog { /// /// 保存全局日志记录器实例。 /// private static ILogger? _logger; /// /// 初始化全局日志记录器。 /// public static void Initialize(ILogger logger) { _logger = logger; Log.Logger = logger; } /// /// 获取全局日志记录器。若未初始化则回退到 Serilog.Log.Logger。 /// public static ILogger Logger => _logger ?? Log.Logger; /// /// 写入 Debug 级别日志。 /// /// 消息模板。 /// 属性值。 public static void Debug(string messageTemplate, params object?[] propertyValues) => Logger.Debug(messageTemplate, propertyValues); /// /// 写入 Information 级别日志。 /// /// 消息模板。 /// 属性值。 public static void Information(string messageTemplate, params object?[] propertyValues) => Logger.Information(messageTemplate, propertyValues); /// /// 写入 Warning 级别日志。 /// /// 消息模板。 /// 属性值。 public static void Warning(string messageTemplate, params object?[] propertyValues) => Logger.Warning(messageTemplate, propertyValues); /// /// 写入 Error 级别日志。 /// /// 消息模板。 /// 属性值。 public static void Error(string messageTemplate, params object?[] propertyValues) => Logger.Error(messageTemplate, propertyValues); /// /// 写入 Error 级别日志,并附带异常信息。 /// /// 异常对象。 /// 消息模板。 /// 属性值。 public static void Error(Exception exception, string messageTemplate, params object?[] propertyValues) => Logger.Error(exception, messageTemplate, propertyValues); /// /// 写入 Fatal 级别日志。 /// /// 消息模板。 /// 属性值。 public static void Fatal(string messageTemplate, params object?[] propertyValues) => Logger.Fatal(messageTemplate, propertyValues); /// /// 写入 Fatal 级别日志,并附带异常信息。 /// /// 异常对象。 /// 消息模板。 /// 属性值。 public static void Fatal(Exception exception, string messageTemplate, params object?[] propertyValues) => Logger.Fatal(exception, messageTemplate, propertyValues); } }