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);
}
}