FileShare/FileShare-Common/Infrastructure/LoggingConfiguration.cs

168 lines
6.9 KiB
C#

using Serilog;
using Serilog.Events;
namespace FileShare_Common.Infrastructure
{
/// <summary>
/// Serilog 日志配置 —— 可在 FileShare-API 和 FileShare-PC 中共享。
/// </summary>
public static class LoggingConfiguration
{
/// <summary>
/// 默认日志目录
/// </summary>
private static readonly string DefaultLogDir = Path.Combine(AppContext.BaseDirectory, "logs");
/// <summary>
/// 创建控制台日志记录器(开发环境)。
/// </summary>
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();
}
/// <summary>
/// 创建控制台 + 文件日志记录器。
/// </summary>
/// <param name="minimumLevel">最低日志级别</param>
/// <param name="logDir">日志目录,默认 ./logs</param>
/// <param name="retainedDays">保留天数</param>
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();
}
/// <summary>
/// 创建只写文件的日志记录器(桌面应用静默模式)。
/// </summary>
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();
}
}
/// <summary>
/// 静态日志访问器 —— 全局静态入口,方便在没有 DI 的场景下使用。
/// </summary>
public static class AppLog
{
/// <summary>
/// 保存全局日志记录器实例。
/// </summary>
private static ILogger? _logger;
/// <summary>
/// 初始化全局日志记录器。
/// </summary>
public static void Initialize(ILogger logger)
{
_logger = logger;
Log.Logger = logger;
}
/// <summary>
/// 获取全局日志记录器。若未初始化则回退到 Serilog.Log.Logger。
/// </summary>
public static ILogger Logger => _logger ?? Log.Logger;
/// <summary>
/// 写入 Debug 级别日志。
/// </summary>
/// <param name="messageTemplate">消息模板。</param>
/// <param name="propertyValues">属性值。</param>
public static void Debug(string messageTemplate, params object?[] propertyValues)
=> Logger.Debug(messageTemplate, propertyValues);
/// <summary>
/// 写入 Information 级别日志。
/// </summary>
/// <param name="messageTemplate">消息模板。</param>
/// <param name="propertyValues">属性值。</param>
public static void Information(string messageTemplate, params object?[] propertyValues)
=> Logger.Information(messageTemplate, propertyValues);
/// <summary>
/// 写入 Warning 级别日志。
/// </summary>
/// <param name="messageTemplate">消息模板。</param>
/// <param name="propertyValues">属性值。</param>
public static void Warning(string messageTemplate, params object?[] propertyValues)
=> Logger.Warning(messageTemplate, propertyValues);
/// <summary>
/// 写入 Error 级别日志。
/// </summary>
/// <param name="messageTemplate">消息模板。</param>
/// <param name="propertyValues">属性值。</param>
public static void Error(string messageTemplate, params object?[] propertyValues)
=> Logger.Error(messageTemplate, propertyValues);
/// <summary>
/// 写入 Error 级别日志,并附带异常信息。
/// </summary>
/// <param name="exception">异常对象。</param>
/// <param name="messageTemplate">消息模板。</param>
/// <param name="propertyValues">属性值。</param>
public static void Error(Exception exception, string messageTemplate, params object?[] propertyValues)
=> Logger.Error(exception, messageTemplate, propertyValues);
/// <summary>
/// 写入 Fatal 级别日志。
/// </summary>
/// <param name="messageTemplate">消息模板。</param>
/// <param name="propertyValues">属性值。</param>
public static void Fatal(string messageTemplate, params object?[] propertyValues)
=> Logger.Fatal(messageTemplate, propertyValues);
/// <summary>
/// 写入 Fatal 级别日志,并附带异常信息。
/// </summary>
/// <param name="exception">异常对象。</param>
/// <param name="messageTemplate">消息模板。</param>
/// <param name="propertyValues">属性值。</param>
public static void Fatal(Exception exception, string messageTemplate, params object?[] propertyValues)
=> Logger.Fatal(exception, messageTemplate, propertyValues);
}
}