永朝 發表於 2025-10-22 22:32:00

Serilog基于Seq开源框架实现日志分析

<blockquote>
<p>Serilog 是.NET 的日志记录库,核心是结构化日志;Seq 是开源的日志服务器,专注于集中管理和分析日志,接收、存储、查询和可视化日志,是独立于应用的 “日志管理中心”。</p>
</blockquote>
<h4 id="日志记录库-serilog">日志记录库 Serilog</h4>
<ol>
<li>
<h5 id="以键值对形式记录结构化日志">以键值对形式记录结构化日志</h5>
</li>
<li>
<h5 id="可灵活配置日志输出目的地支持控制台文件数据库等多种-接收器">可灵活配置日志输出目的地,支持控制台、文件、数据库等多种 “接收器”。</h5>
</li>
<li>
<h5 id="支持异步记录性能较好能适应高并发的net-应用场景">支持异步记录,性能较好,能适应高并发的.NET 应用场景。</h5>
</li>
</ol>
<h4 id="日志服务器-seq">日志服务器 Seq</h4>
<ol>
<li>
<h5 id="专为结构化日志设计能完美解析-serilog-生成的键值对日志">专为结构化日志设计,能完美解析 Serilog 生成的键值对日志。</h5>
</li>
<li>
<h5 id="提供实时查询功能可快速筛选分析日志数据不用手动翻找日志文件">提供实时查询功能,可快速筛选、分析日志数据,不用手动翻找日志文件。</h5>
</li>
<li>
<h5 id="支持日志可视化能通过图表直观展示日志趋势适合排查问题和监控应用">支持日志可视化,能通过图表直观展示日志趋势,适合排查问题和监控应用。</h5>
</li>
</ol>
<h3 id="一nuget-包管理器中下载相关包">一、NuGet 包管理器中下载相关包</h3>
<ol>
<li>
<h5 id="serilog">Serilog</h5>
</li>
<li>
<h5 id="serilogsinksconsole控制台输出">Serilog.Sinks.Console(控制台输出)</h5>
</li>
<li>
<h5 id="serilogsinksfile输出到文件">Serilog.Sinks.File(输出到文件)</h5>
</li>
<li>
<h5 id="serilogsinksseq输出到seq服务">Serilog.Sinks.Seq(输出到Seq服务)</h5>
</li>
<li>
<h5 id="seqapiseqapi-http服务">Seq.Api(Seq.Api HTTP服务)</h5>
</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/3482611/202510/3482611-20251028104309781-73384197.png"></p>
<h3 id="二搭建-seq-日志服务">二、搭建 Seq 日志服务</h3>
<h5 id="docker命令行快速启动">Docker命令行快速启动</h5>
<pre><code>// 启动项【将卷挂载到宿主机,配置数据持久化存储,可避免容器或服务重启后丢失数据】
docker run -d --name seq -e ACCEPT_EULA=Y   -v/data/SeqData:/data -e SEQ_FIRSTRUN_ADMINUSERNAME=admin-e SEQ_FIRSTRUN_ADMINPASSWORD="123456" -p 5341:5341 -p 8081:80 datalust/seq:2025.2
</code></pre>
<h5 id="浏览器输入地址查看是否部署成功httplocalhost8081">浏览器输入地址查看是否部署成功(http://localhost:8081/)</h5>
<p><img src="https://img2024.cnblogs.com/blog/3482611/202510/3482611-20251022222216238-1233630627.png"></p>
<h3 id="三创建serilog接口以及实现接口">三、创建Serilog接口以及实现接口</h3>
<details>
<summary>点击查看代码</summary>
<pre><code> /// &lt;summary&gt;
/// Serilog 日志接口
/// &lt;/summary&gt;
public interface ISerilogLogger
{
   /// &lt;summary&gt;
   /// 配置Seq服务日志记录器
   /// &lt;/summary&gt;
   /// &lt;returns&gt;Seq日志记录器实例&lt;/returns&gt;
   ILogger ConfigureSeqLogger();

   /// &lt;summary&gt;
   /// 配置控制台日志记录器
   /// &lt;/summary&gt;
   /// &lt;returns&gt;控制台日志记录器实例&lt;/returns&gt;
   ILogger ConfigureConsoleLogger();

   /// &lt;summary&gt;
   /// 配置文件日志记录器
   /// &lt;/summary&gt;
   /// &lt;returns&gt;文件日志记录器实例&lt;/returns&gt;
   ILogger ConfigureFileLogger();

   /// &lt;summary&gt;
   /// 获取默认日志记录器实例
   /// &lt;/summary&gt;
   /// &lt;returns&gt;Seq日志记录器实例&lt;/returns&gt;
   ILogger GetLogger();
}
</code></pre>
</details>
<details>
<summary>点击查看代码</summary>
<pre><code>/// &lt;summary&gt;
/// Serilog 记录日志
/// &lt;/summary&gt;
public class SerilogLogger : ISerilogLogger
{
   /// &lt;summary&gt;
   /// Seq服务 URL地址
   /// &lt;/summary&gt;
   private readonly string _connectionString;

   /// &lt;summary&gt;
   /// 启动程序
   /// &lt;/summary&gt;
   private readonly string _applicationName;

   /// &lt;summary&gt;
   /// 输出模板
   /// &lt;/summary&gt;
   private readonly string _outputTemplate;

   /// &lt;summary&gt;
   /// 日志实例
   /// &lt;/summary&gt;
   private ILogger _logger;

   /// &lt;summary&gt;
   /// 构造函数
   /// &lt;/summary&gt;
   /// &lt;param name="connectionString"&gt;Seq服务 URL地址&lt;/param&gt;
   public SerilogLogger(string connectionString)
   {
         this._connectionString = connectionString ?? string.Empty;
         this._applicationName = Assembly.GetEntryAssembly()?.GetName().Name ?? string.Empty;
         this._outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u4}] [{ApplicationName}] [{SourceContext}] [{Module}]{Message:lj}{NewLine}{Exception}";
         this._logger = ConfigureSeqLogger(); // 默认配置Seq日志记录器
   }

   /// &lt;summary&gt;
   /// 配置Seq服务日志记录器
   /// &lt;/summary&gt;
   /// &lt;returns&gt;Seq日志记录器实例&lt;/returns&gt;
   public ILogger ConfigureSeqLogger()
   {
         try
         {
             // 若连接字符串为空,则使用控制台日志
             if (string.IsNullOrWhiteSpace(_connectionString))
             {
               return ConfigureConsoleLogger();
             }

             // 配置 Seq 日志记录器
             return new LoggerConfiguration()
               .WriteTo.Seq(_connectionString)// 接入Seq日志服务
               .Enrich.WithProperty("ApplicationName", _applicationName)
               .Enrich.With(new UuidEnricher()) // 添加 UUID
               .MinimumLevel.Verbose()          // 设置最低日志级别为 Verbose
               .CreateLogger();
         }
         catch
         {
             // 若配置失败,创建控制台日志
             return ConfigureConsoleLogger();
         }
   }

   /// &lt;summary&gt;
   /// 配置控制台日志记录器
   /// &lt;/summary&gt;
   /// &lt;returns&gt;控制台日志记录器实例&lt;/returns&gt;
   public ILogger ConfigureConsoleLogger()
   {
         try
         {
             return new LoggerConfiguration()
               .WriteTo.Console(outputTemplate: _outputTemplate)
               .Enrich.WithProperty("ApplicationName", _applicationName)
               .Enrich.With(new UuidEnricher())
               .MinimumLevel.Verbose()
               .CreateLogger();
         }
         catch
         {
             // 若配置失败,创建基础控制台日志
             return new LoggerConfiguration()
               .WriteTo.Console()
               .CreateLogger();
         }
   }

   /// &lt;summary&gt;
   /// 配置文件日志记录器
   /// &lt;/summary&gt;
   /// &lt;returns&gt;文件日志记录器实例&lt;/returns&gt;
   public ILogger ConfigureFileLogger()
   {
         try
         {
             return new LoggerConfiguration()
               .WriteTo.File(
                      path: "logs\\defaultLogs.log",
                      rollingInterval: RollingInterval.Day,
                      retainedFileCountLimit: 30,   // 保留30天
                      fileSizeLimitBytes: 5_000_000, // 单文件最大5MB
                      outputTemplate: _outputTemplate
                  )
               .Enrich.WithProperty("ApplicationName", _applicationName)
               .Enrich.With(new UuidEnricher())
               .MinimumLevel.Verbose()
               .CreateLogger();
         }
         catch
         {
             // 若配置失败,创建控制台日志
             return ConfigureConsoleLogger();
         }
   }

   /// &lt;summary&gt;
   /// 获取默认日志记录器实例
   /// &lt;/summary&gt;
   /// &lt;returns&gt;Seq日志记录器实例&lt;/returns&gt;
   public ILogger GetLogger()
   {
         return _logger ?? ConfigureConsoleLogger();
   }
}
</code></pre>
</details>
<h3 id="四创建logger拓展类以及日志类型枚举类">四、创建Logger拓展类以及日志类型枚举类</h3>
<details>
<summary>点击查看代码</summary>
<pre><code>/// &lt;summary&gt;
/// Serilog 日志扩展方法
/// 提供带有日志类型和模块支持的扩展日志方法
/// &lt;/summary&gt;
public static class LoggerExtensions
{
    #region Debug 方法

    /// &lt;summary&gt;
    /// 记录调试级别的日志消息,包含指定的日志类型和模块
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Debug(this ILogger logger, LogType logType, string module, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Debug(message);
    }

    /// &lt;summary&gt;
    /// 记录调试级别的日志消息,包含指定的日志类型、模块和参数
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Debug(this ILogger logger, LogType logType, string module, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Debug(message, propertyValues);
    }

    #endregion

    #region Information 方法

    /// &lt;summary&gt;
    /// 记录信息级别的日志消息,包含指定的日志类型和模块
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Information(this ILogger logger, LogType logType, string module, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Information(message);
    }

    /// &lt;summary&gt;
    /// 记录信息级别的日志消息,包含指定的日志类型、模块和参数
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Information(this ILogger logger, LogType logType, string module, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Information(message, propertyValues);
    }

    #endregion

    #region Warning 方法

    /// &lt;summary&gt;
    /// 记录警告级别的日志消息,包含指定的日志类型和模块
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Warning(this ILogger logger, LogType logType, string module, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Warning(message);
    }

    /// &lt;summary&gt;
    /// 记录警告级别的日志消息,包含指定的日志类型、模块和参数
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Warning(this ILogger logger, LogType logType, string module, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Warning(message, propertyValues);
    }

    #endregion

    #region Error 方法

    /// &lt;summary&gt;
    /// 记录错误级别的日志消息,包含指定的日志类型和模块
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Error(this ILogger logger, LogType logType, string module, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Error(message);
    }

    /// &lt;summary&gt;
    /// 记录错误级别的日志消息,包含指定的日志类型、模块和参数
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Error(this ILogger logger, LogType logType, string module, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Error(message, propertyValues);
    }

    /// &lt;summary&gt;
    /// 记录错误级别的日志消息,包含指定的日志类型、模块和异常
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="exception"&gt;要记录的异常&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Error(this ILogger logger, LogType logType, string module, Exception exception, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Error(exception, message);
    }

    /// &lt;summary&gt;
    /// 记录错误级别的日志消息,包含指定的日志类型、模块、异常和参数
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="exception"&gt;要记录的异常&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Error(this ILogger logger, LogType logType, string module, Exception exception, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Error(exception, message, propertyValues);
    }

    #endregion

    #region Fatal 方法

    /// &lt;summary&gt;
    /// 记录致命级别的日志消息,包含指定的日志类型和模块
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Fatal(this ILogger logger, LogType logType, string module, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Fatal(message);
    }

    /// &lt;summary&gt;
    /// 记录致命级别的日志消息,包含指定的日志类型、模块和参数
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Fatal(this ILogger logger, LogType logType, string module, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Fatal(message, propertyValues);
    }

    /// &lt;summary&gt;
    /// 记录致命级别的日志消息,包含指定的日志类型、模块和异常
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="exception"&gt;要记录的异常&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Fatal(this ILogger logger, LogType logType, string module, Exception exception, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Fatal(exception, message);
    }

    /// &lt;summary&gt;
    /// 记录致命级别的日志消息,包含指定的日志类型、模块、异常和参数
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="exception"&gt;要记录的异常&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Fatal(this ILogger logger, LogType logType, string module, Exception exception, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Fatal(exception, message, propertyValues);
    }

    #endregion

    #region Verbose 方法

    /// &lt;summary&gt;
    /// 记录详细级别的日志消息,包含指定的日志类型和模块
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Verbose(this ILogger logger, LogType logType, string module, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Verbose(message);
    }

    /// &lt;summary&gt;
    /// 记录详细级别的日志消息,包含指定的日志类型、模块和参数
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="module"&gt;日志来源的模块名称&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Verbose(this ILogger logger, LogType logType, string module, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", module ?? string.Empty)
            .Verbose(message, propertyValues);
    }

    #endregion

    #region 向后兼容方法

    /// &lt;summary&gt;
    /// 记录调试级别的日志消息,包含指定的日志类型(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Debug(this ILogger logger, LogType logType, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Debug(message);
    }

    /// &lt;summary&gt;
    /// 记录调试级别的日志消息,包含指定的日志类型和参数(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Debug(this ILogger logger, LogType logType, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Debug(message, propertyValues);
    }

    /// &lt;summary&gt;
    /// 记录信息级别的日志消息,包含指定的日志类型(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Information(this ILogger logger, LogType logType, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Information(message);
    }

    /// &lt;summary&gt;
    /// 记录信息级别的日志消息,包含指定的日志类型和参数(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Information(this ILogger logger, LogType logType, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Information(message, propertyValues);
    }

    /// &lt;summary&gt;
    /// 记录警告级别的日志消息,包含指定的日志类型(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Warning(this ILogger logger, LogType logType, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Warning(message);
    }

    /// &lt;summary&gt;
    /// 记录警告级别的日志消息,包含指定的日志类型和参数(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Warning(this ILogger logger, LogType logType, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Warning(message, propertyValues);
    }

    /// &lt;summary&gt;
    /// 记录错误级别的日志消息,包含指定的日志类型(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Error(this ILogger logger, LogType logType, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Error(message);
    }

    /// &lt;summary&gt;
    /// 记录错误级别的日志消息,包含指定的日志类型和参数(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Error(this ILogger logger, LogType logType, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Error(message, propertyValues);
    }

    /// &lt;summary&gt;
    /// 记录错误级别的日志消息,包含指定的日志类型和异常(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="exception"&gt;要记录的异常&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Error(this ILogger logger, LogType logType, Exception exception, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Error(exception, message);
    }

    /// &lt;summary&gt;
    /// 记录错误级别的日志消息,包含指定的日志类型、异常和参数(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="exception"&gt;要记录的异常&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Error(this ILogger logger, LogType logType, Exception exception, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Error(exception, message, propertyValues);
    }

    /// &lt;summary&gt;
    /// 记录致命级别的日志消息,包含指定的日志类型(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Fatal(this ILogger logger, LogType logType, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Fatal(message);
    }

    /// &lt;summary&gt;
    /// 记录致命级别的日志消息,包含指定的日志类型和参数(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Fatal(this ILogger logger, LogType logType, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Fatal(message, propertyValues);
    }

    /// &lt;summary&gt;
    /// 记录致命级别的日志消息,包含指定的日志类型和异常(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="exception"&gt;要记录的异常&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Fatal(this ILogger logger, LogType logType, Exception exception, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Fatal(exception, message);
    }

    /// &lt;summary&gt;
    /// 记录致命级别的日志消息,包含指定的日志类型、异常和参数(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="exception"&gt;要记录的异常&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Fatal(this ILogger logger, LogType logType, Exception exception, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Fatal(exception, message, propertyValues);
    }

    /// &lt;summary&gt;
    /// 记录详细级别的日志消息,包含指定的日志类型(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    public static void Verbose(this ILogger logger, LogType logType, string message)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Verbose(message);
    }

    /// &lt;summary&gt;
    /// 记录详细级别的日志消息,包含指定的日志类型和参数(模块将为空)
    /// &lt;/summary&gt;
    /// &lt;param name="logger"&gt;日志记录器实例&lt;/param&gt;
    /// &lt;param name="logType"&gt;日志条目类型&lt;/param&gt;
    /// &lt;param name="message"&gt;日志消息模板&lt;/param&gt;
    /// &lt;param name="propertyValues"&gt;消息模板的参数&lt;/param&gt;
    public static void Verbose(this ILogger logger, LogType logType, string message, params object[] propertyValues)
    {
      logger.ForContext("LogType", logType)
            .ForContext("Module", string.Empty)
            .Verbose(message, propertyValues);
    }

    #endregion
}
</code></pre>
</details>
<details>
<summary>点击查看代码</summary>
<pre><code>/// &lt;summary&gt;
/// 日志类型(可选或自定义)
/// &lt;/summary&gt;
public enum LogType
{
    /// &lt;summary&gt;
    /// 系统日志 - 系统启动、关闭、配置变更等系统级操作
    /// &lt;/summary&gt;
    System = 1,

    /// &lt;summary&gt;
    /// 操作日志 - 用户业务操作、业务流程记录
    /// &lt;/summary&gt;
    Operation = 2,

    /// &lt;summary&gt;
    /// 硬件日志 - 设备状态、硬件交互、传感器等
    /// &lt;/summary&gt;
    Hardware = 3,

    /// &lt;summary&gt;
    /// 安全日志 - 登录认证、权限变更、安全事件等
    /// &lt;/summary&gt;
    Security = 4,

}
</code></pre>
</details>
<h3 id="五注入prism容器">五、注入Prism容器</h3>
<blockquote>
<p>注:仅 WPF 项目执行此步骤,其余 .NET 项目按需自行调用。</p>
</blockquote>
<details>
<summary>点击查看代码</summary>
<pre><code>// protected override void RegisterTypes(IContainerRegistry containerRegistry) 方法
#region 注册单例:通过 Prism 容器管理 日志实例   
// 获取 Seq服务URL
string connectionString = ConnectionString["Sequrl"]?["ConnectionString"]?.ToString() ?? string.Empty;
// 注册时先初始化日志配置
var loggerInstance = new SerilogLogger(connectionString);
containerRegistry.RegisterSingleton&lt;ISerilogLogger&gt;(() =&gt; loggerInstance);
#endregion
</code></pre>
</details>
<details>
<summary>点击查看代码</summary>
<pre><code class="language-c#">// 示例:记录调试日志
// 从容器获取日志实例:GetLogger 输出方式,MainWindowViewModel调用上下文
ILogger logger = container.Resolve&lt;ISerilogLogger&gt;().GetLogger().ForContext&lt;MainWindowViewModel&gt;();
// 一、基本用法(等级 + 模块 + 记录文本)
logger.Debug(LogType.System, "Seq日志", "初始化日志模块成功。");
// 二、参数用法(等级 + 模块 + 消息模板 + 消息参数)
logger.Information(LogType.Operation, "订单模块", "购买{Product}成功!总计金额:{Amount}美元", "海康工业相机", "$6888.99");
</code></pre>
</details>
<h3 id="六seq日志分析平台">六、Seq日志分析平台</h3>
<p><img src="https://img2024.cnblogs.com/blog/3482611/202510/3482611-20251022222703257-1822038322.png"></p>
<p><img src="https://img2024.cnblogs.com/blog/3482611/202510/3482611-20251022223532176-445800985.png"></p>
<h3 id="七seq服务申请-api-keys授权">七、Seq服务申请 API Keys授权</h3>
<p><img src="https://img2024.cnblogs.com/blog/3482611/202510/3482611-20251028101805708-947023816.png"></p>
<h3 id="八基于-seqapi-实现自定义日志操作">八、基于 Seq.Api 实现自定义日志操作</h3>
<details>
<summary>点击查看代码</summary>
<pre><code>/// &lt;summary&gt;
/// Seq日志查询接口
/// &lt;/summary&gt;
public interface ISeqQueryService
{
    /// &lt;summary&gt;
    /// 按时间范围查询日志
    /// &lt;/summary&gt;
    /// &lt;param name="startTime"&gt;开始时间&lt;/param&gt;
    /// &lt;param name="endTime"&gt;结束时间&lt;/param&gt;
    /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
    /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
    Task&lt;List&lt;EventEntity&gt;&gt; QueryByTimeRangeAsync(DateTime startTime, DateTime endTime, int count = 1000);

    /// &lt;summary&gt;
    /// 按天数查询日志(查询最近N天的日志)
    /// &lt;/summary&gt;
    /// &lt;param name="days"&gt;天数&lt;/param&gt;
    /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
    /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
    Task&lt;List&lt;EventEntity&gt;&gt; QueryByDaysAsync(int days, int count = 1000);

    /// &lt;summary&gt;
    /// 按属性值查询日志
    /// &lt;/summary&gt;
    /// &lt;param name="propertyName"&gt;属性名&lt;/param&gt;
    /// &lt;param name="propertyValue"&gt;属性值&lt;/param&gt;
    /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
    /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
    Task&lt;List&lt;EventEntity&gt;&gt; QueryByPropertyAsync(string propertyName, string propertyValue, int count = 1000);

    /// &lt;summary&gt;
    /// 按日志等级查询
    /// &lt;/summary&gt;
    /// &lt;param name="level"&gt;日志等级&lt;/param&gt;
    /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
    /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
    Task&lt;List&lt;EventEntity&gt;&gt; QueryByLevelAsync(LogEventLevel level, int count = 1000);

    /// &lt;summary&gt;
    /// 组合查询(时间范围 + 日志等级 + 属性值)
    /// &lt;/summary&gt;
    /// &lt;param name="startTime"&gt;开始时间&lt;/param&gt;
    /// &lt;param name="endTime"&gt;结束时间&lt;/param&gt;
    /// &lt;param name="level"&gt;日志等级&lt;/param&gt;
    /// &lt;param name="propertyName"&gt;属性名&lt;/param&gt;
    /// &lt;param name="propertyValue"&gt;属性值&lt;/param&gt;
    /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
    /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
    Task&lt;List&lt;EventEntity&gt;&gt; QueryByTimeLevelAndPropertyAsync(DateTime startTime, DateTime endTime, LogEventLevel level, string propertyName, string propertyValue, int count = 1000);

    /// &lt;summary&gt;
    /// 组合查询(时间范围 + 属性值)
    /// &lt;/summary&gt;
    /// &lt;param name="startTime"&gt;开始时间&lt;/param&gt;
    /// &lt;param name="endTime"&gt;结束时间&lt;/param&gt;
    /// &lt;param name="propertyName"&gt;属性名&lt;/param&gt;
    /// &lt;param name="propertyValue"&gt;属性值&lt;/param&gt;
    /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
    /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
    Task&lt;List&lt;EventEntity&gt;&gt; QueryByTimeAndPropertyAsync(DateTime startTime, DateTime endTime, string propertyName, string propertyValue, int count = 1000);

    /// &lt;summary&gt;
    /// 组合查询(日志等级 + 属性值)
    /// &lt;/summary&gt;
    /// &lt;param name="level"&gt;日志等级&lt;/param&gt;
    /// &lt;param name="propertyName"&gt;属性名&lt;/param&gt;
    /// &lt;param name="propertyValue"&gt;属性值&lt;/param&gt;
    /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
    /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
    Task&lt;List&lt;EventEntity&gt;&gt; QueryByLevelAndPropertyAsync(LogEventLevel level, string propertyName, string propertyValue, int count = 1000);

    /// &lt;summary&gt;
    /// 基础查询方法(仅使用filter条件)
    /// &lt;/summary&gt;
    /// &lt;param name="filter"&gt;过滤条件&lt;/param&gt;
    /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
    /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
    Task&lt;List&lt;EventEntity&gt;&gt; QueryLogsAsync(string filter, int count);
}
</code></pre>
</details>
<details>
<summary>点击查看代码</summary>
<pre><code> /// &lt;summary&gt;
/// Seq 日志查询
/// 提供按时间、天数、属性值、日志等级、返回数据条数的查询功能
/// &lt;/summary&gt;
public class SeqQueryService : IDisposable, ISeqQueryService
{
   private readonly SeqConnection _connection;
   private bool _disposed = false;

   /// &lt;summary&gt;
   /// 初始化Seq查询服务
   /// &lt;/summary&gt;
   /// &lt;param name="serverUrl"&gt;Seq服务地址&lt;/param&gt;
   /// &lt;param name="apiKey"&gt;API密钥&lt;/param&gt;
   public SeqQueryService(string serverUrl, string apiKey)
   {
         _connection = new SeqConnection(serverUrl, apiKey);
   }

   /// &lt;summary&gt;
   /// 按时间范围查询日志
   /// &lt;/summary&gt;
   /// &lt;param name="startTime"&gt;开始时间&lt;/param&gt;
   /// &lt;param name="endTime"&gt;结束时间&lt;/param&gt;
   /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
   /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
   public async Task&lt;List&lt;EventEntity&gt;&gt; QueryByTimeRangeAsync(DateTime startTime, DateTime endTime, int count = 1000)
   {
         // 确保时间转换为UTC(Seq存储的是UTC时间)
         var fromTimeUtc = startTime.Kind == DateTimeKind.Utc ? startTime : startTime.ToUniversalTime();
         var toTimeUtc = endTime.Kind == DateTimeKind.Utc ? endTime : endTime.ToUniversalTime();

         // 使用Seq API专用的时间参数,避免filter拼接问题
         var resultSet = _connection.Events.EnumerateAsync(
             fromDateUtc: fromTimeUtc,// 专用的开始时间参数
             toDateUtc: toTimeUtc,      // 专用的结束时间参数
             count: count,
             render: true);

         var logs = new List&lt;EventEntity&gt;();
         await foreach (var logEvent in resultSet)
         {
             logs.Add(logEvent);
         }
         return logs;
   }

   /// &lt;summary&gt;
   /// 按天数查询日志(查询最近N天的日志)
   /// &lt;/summary&gt;
   /// &lt;param name="days"&gt;天数&lt;/param&gt;
   /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
   /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
   public async Task&lt;List&lt;EventEntity&gt;&gt; QueryByDaysAsync(int days, int count = 1000)
   {
         // 计算开始时间(当前时间往前推days天)
         var startTime = DateTime.Now.AddDays(-days);

         // 确保时间转换为UTC
         var fromTimeUtc = startTime.Kind == DateTimeKind.Utc ? startTime : startTime.ToUniversalTime();

         // 使用Seq API专用的时间参数
         var resultSet = _connection.Events.EnumerateAsync(
             fromDateUtc: fromTimeUtc,// 专用的开始时间参数
             count: count,
             render: true);

         var logs = new List&lt;EventEntity&gt;();
         await foreach (var logEvent in resultSet)
         {
             logs.Add(logEvent);
         }
         return logs;
   }

   /// &lt;summary&gt;
   /// 按属性值查询日志
   /// &lt;/summary&gt;
   /// &lt;param name="propertyName"&gt;属性名&lt;/param&gt;
   /// &lt;param name="propertyValue"&gt;属性值&lt;/param&gt;
   /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
   /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
   public async Task&lt;List&lt;EventEntity&gt;&gt; QueryByPropertyAsync(string propertyName, string propertyValue, int count = 1000)
   {
         var filter = $"{propertyName} = '{propertyValue}'";
         return await QueryLogsAsync(filter, count);
   }

   /// &lt;summary&gt;
   /// 按日志等级查询
   /// &lt;/summary&gt;
   /// &lt;param name="level"&gt;日志等级(如:Information、Error、Warning等)&lt;/param&gt;
   /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
   /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
   public async Task&lt;List&lt;EventEntity&gt;&gt; QueryByLevelAsync(LogEventLevel level, int count = 1000)
   {
         var filter = $"@Level = '{level}'";
         return await QueryLogsAsync(filter, count);
   }

   /// &lt;summary&gt;
   /// 组合查询(时间范围 + 日志等级 + 属性值)
   /// &lt;/summary&gt;
   /// &lt;param name="startTime"&gt;开始时间&lt;/param&gt;
   /// &lt;param name="endTime"&gt;结束时间&lt;/param&gt;
   /// &lt;param name="level"&gt;日志等级&lt;/param&gt;
   /// &lt;param name="propertyName"&gt;属性名&lt;/param&gt;
   /// &lt;param name="propertyValue"&gt;属性值&lt;/param&gt;
   /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
   /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
   public async Task&lt;List&lt;EventEntity&gt;&gt; QueryByTimeLevelAndPropertyAsync(DateTime startTime, DateTime endTime, LogEventLevel level, string propertyName, string propertyValue, int count = 1000)
   {
         // 确保时间转换为UTC
         var fromTimeUtc = startTime.Kind == DateTimeKind.Utc ? startTime : startTime.ToUniversalTime();
         var toTimeUtc = endTime.Kind == DateTimeKind.Utc ? endTime : endTime.ToUniversalTime();

         // 构建属性过滤条件
         var filter = $"@Level = '{level}' and {propertyName} = '{propertyValue}'";

         // 使用Seq API专用的时间参数和filter组合
         var resultSet = _connection.Events.EnumerateAsync(
             fromDateUtc: fromTimeUtc,
             toDateUtc: toTimeUtc,
             filter: filter,
             count: count,
             render: true);

         var logs = new List&lt;EventEntity&gt;();
         await foreach (var logEvent in resultSet)
         {
             logs.Add(logEvent);
         }
         return logs;
   }

   /// &lt;summary&gt;
   /// 组合查询(时间范围 + 属性值)
   /// &lt;/summary&gt;
   /// &lt;param name="startTime"&gt;开始时间&lt;/param&gt;
   /// &lt;param name="endTime"&gt;结束时间&lt;/param&gt;
   /// &lt;param name="propertyName"&gt;属性名&lt;/param&gt;
   /// &lt;param name="propertyValue"&gt;属性值&lt;/param&gt;
   /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
   /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
   public async Task&lt;List&lt;EventEntity&gt;&gt; QueryByTimeAndPropertyAsync(DateTime startTime, DateTime endTime, string propertyName, string propertyValue, int count = 1000)
   {
         // 确保时间转换为UTC
         var fromTimeUtc = startTime.Kind == DateTimeKind.Utc ? startTime : startTime.ToUniversalTime();
         var toTimeUtc = endTime.Kind == DateTimeKind.Utc ? endTime : endTime.ToUniversalTime();

         // 构建属性过滤条件
         var filter = $"{propertyName} = '{propertyValue}'";

         // 使用Seq API专用的时间参数和filter组合
         var resultSet = _connection.Events.EnumerateAsync(
             fromDateUtc: fromTimeUtc,
             toDateUtc: toTimeUtc,
             filter: filter,
             count: count,
             render: true);

         var logs = new List&lt;EventEntity&gt;();
         await foreach (var logEvent in resultSet)
         {
             logs.Add(logEvent);
         }
         return logs;
   }

   /// &lt;summary&gt;
   /// 组合查询(日志等级 + 属性值)
   /// &lt;/summary&gt;
   /// &lt;param name="level"&gt;日志等级&lt;/param&gt;
   /// &lt;param name="propertyName"&gt;属性名&lt;/param&gt;
   /// &lt;param name="propertyValue"&gt;属性值&lt;/param&gt;
   /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
   /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
   public async Task&lt;List&lt;EventEntity&gt;&gt; QueryByLevelAndPropertyAsync(LogEventLevel level, string propertyName, string propertyValue, int count = 1000)
   {
         var filter = $"@Level = '{level}' and {propertyName} = '{propertyValue}'";
         return await QueryLogsAsync(filter, count);
   }

   /// &lt;summary&gt;
   /// 基础查询方法(仅使用filter条件)
   /// &lt;/summary&gt;
   /// &lt;param name="filter"&gt;过滤条件,如:"PropertyName = 'Value'"&lt;/param&gt;
   /// &lt;param name="count"&gt;返回数据条数&lt;/param&gt;
   /// &lt;returns&gt;日志事件列表&lt;/returns&gt;
   public async Task&lt;List&lt;EventEntity&gt;&gt; QueryLogsAsync(string filter, int count)
   {
         var logs = new List&lt;EventEntity&gt;();
         var resultSet = _connection.Events.EnumerateAsync(
             render: true,
             count: count,
             filter: filter);

         await foreach (var logEvent in resultSet)
         {
             logs.Add(logEvent);
         }

         return logs;
   }

   /// &lt;summary&gt;
   /// 释放资源
   /// &lt;/summary&gt;
   public void Dispose()
   {
         if (!_disposed)
         {
             _connection?.Dispose();
             _disposed = true;
         }
   }
}
</code></pre>
</details>
<h3 id="九参考资料">九、参考资料</h3>
<blockquote>
<p>Seq官方文档:https://datalust.co/<br>
Seq.Api文档:https://github.com/datalust/seq-api</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/dosswy/p/19159138
頁: [1]
查看完整版本: Serilog基于Seq开源框架实现日志分析