using Serilog.Events;
using System.Collections.Generic;
namespace Ayay.SerilogLogs
{
///
/// 日志组件配置选项
/// 包含身份标识、存储路径、分级策略以及自动清理策略。
///
public class LogOptions
{
// ==========================================
// 1. 基础身份标识
// ==========================================
///
/// 应用名称/服务ID。
/// 例如: "VideoServer-01", "Gatekeeper-Api"。
/// 在 Seq 中对应 {AppId} 属性,用于区分多服务环境下的日志来源。
///
public string AppId { get; set; } = "DefaultApp";
// ==========================================
// 2. 存储路径配置
// ==========================================
///
/// 本地日志文件的存储根目录。
/// 默认: @"D:\Logs"
/// 程序会自动在此目录下按模块创建子文件夹(如 System, Network)。
/// 注意:如果该目录无写入权限,组件会自动降级到程序运行目录。
///
public string LogRootPath { get; set; } = @"D:\Logs";
// ==========================================
// 3. Seq 集中式日志配置
// ==========================================
///
/// Seq 服务器地址。
/// 例如: "http://192.168.1.100:5341"
/// 如果留空 (null/empty),则不启用 Seq 投递。
///
public string SeqServerUrl { get; set; }
///
/// Seq API Key (令牌)。
/// 建议在 Seq 后台申请仅具有 [Ingest] 权限的 Key。
/// 配置 Key 后支持动态调整日志级别 (Dynamic Level Control)。
///
public string SeqApiKey { get; set; }
// ==========================================
// 4. 输出端级别控制 (Sink Levels)
// 用于控制不同媒介的“过滤网”疏密程度
// ==========================================
///
/// 控制台输出的最低级别。
/// 默认: Information (开发调试时可改为 Debug)
///
public LogEventLevel ConsoleLevel { get; set; } = LogEventLevel.Information;
///
/// 本地文件记录的最低级别。
/// 默认: Debug (保留详细案底,便于事后追溯)
/// 注意:具体写入哪个文件(Main/Detail)由内部逻辑决定,此属性控制总开关。
///
public LogEventLevel FileLevel { get; set; } = LogEventLevel.Verbose;
///
/// Seq 网络传输的最低级别。
/// 默认: Information (减少网络带宽和服务器存储压力)
/// 生产环境建议设为 Information 或 Warning,除非需要在线排错。
///
public LogEventLevel SeqLevel { get; set; } = LogEventLevel.Verbose;
// ==========================================
// 5. 业务模块级别控制 (Context Levels)
// 用于精细化控制特定业务模块的日志开关
// ==========================================
///
/// 全局默认最低级别。
/// 如果某个日志没有指定模块,或者模块不在 ModuleLevels 列表中,则使用此级别。
///
public LogEventLevel GlobalMinimumLevel { get; set; } = LogEventLevel.Verbose;
///
/// 针对特定业务模块的日志级别覆盖 (Override)。
/// Key: 模块名称 (建议使用 LogModules 常量字符串)
/// Value: 该模块允许记录的最低级别
///
public Dictionary ModuleLevels { get; set; } = new Dictionary
{
// --- 系统层 ---
{ LogModules.Core, LogEventLevel.Debug }, // 系统主逻辑
{ LogModules.Network, LogEventLevel.Debug }, // 网络通讯:平时只看警告,防止心跳刷屏
{ LogModules.WebApi, LogEventLevel.Debug }, // WebAPI:记录请求响应
// --- 业务层 ---
{ LogModules.UserSystem, LogEventLevel.Debug }, // 用户系统
{ LogModules.UserAction, LogEventLevel.Debug }, // 用户操作:必须记录,用于审计
{ LogModules.DeviceOps, LogEventLevel.Debug }, // 设备操作:记录关键指令
// --- 核心/高频数据 ---
{ LogModules.Algorithm, LogEventLevel.Debug }, // 算法:核心业务,开启 Debug 以记录全过程
{ LogModules.Observation, LogEventLevel.Debug }, // 观察点:最详细的埋点
// --- 降噪区 (垃圾数据屏蔽) ---
{ LogModules.WebSocket, LogEventLevel.Debug }, // WS:数据量极大,除非报错否则不记
{ LogModules.Ping, LogEventLevel.Debug }, // Ping:几乎不记,除非完全断连
{ LogModules.Sdk, LogEventLevel.Debug } // SDK:屏蔽第三方的废话日志
};
// ==========================================
// 6. 文件滚动策略 (Rolling Policy)
// 控制单个日志文件的大小和生成频率
// ==========================================
///
/// 单个日志文件大小限制 (单位:字节)。
/// 默认: 10MB (10 * 1024 * 1024)
/// 当文件超过此大小时,会自动创建新文件 (例如 Main_001.txt)。
/// 建议不要设置过大,否则记事本打开会很卡。
///
public long FileSizeLimitBytes { get; set; } = 10 * 1024 * 1024;
///
/// 超过大小限制后是否创建新文件。
/// 默认: true (推荐)
///
public bool RollOnFileSizeLimit { get; set; } = true;
// ==========================================
// 7. 自动清理策略 (Auto Cleanup)
// 由后台 LogCleaner 任务执行,满足任意条件即清理
// ==========================================
///
/// 历史日志最大保留天数 (时间策略)。
/// 默认: 30天
/// 系统会强制删除最后修改时间超过此天数的文件。
///
public int MaxRetentionDays { get; set; } = 30;
///
/// 日志目录总大小上限 (空间策略)。
/// 默认: 1GB (1024 * 1024 * 1024)
/// 如果所有日志文件总和超过此大小,系统会按时间倒序(从旧到新)删除文件,直到空间低于此值。
///
public long MaxTotalLogSize { get; set; } = 1024L * 1024 * 1024;
}
}