我有一个.NET Core 2.0应用程序,可以在其中成功使用Serilog进行日志记录。现在,我想将一些数据库性能统计信息记录到一个单独的接收器中(它们不是用于调试的,这基本上是应用程序中所有其他记录的目的,因此我想将它们分开),并认为可以完成此操作 通过使用Log.ForContext()创建数据库统计记录器。

我不知道如何使用我的appsettings.json配置Serilog以将"调试日志"记录到一个接收器,而将数据库统计信息记录到另一个接收器?我希望可以做类似的事情:

"Serilog": {
 "WriteTo": [
    {
     "Name":"RollingFile",
     "pathFormat":"logs/Log-{Date}.log",
     "Filter": {
       "ByExcluding":"FromSource(MyClass)"
      }
    },
    {
     "Name":"RollingFile",
     "pathFormat":"logs/DBStat-{Date}.log",
     "Filter": {
         "ByIncludingOnly":"FromSource(MyClass)"
      }
    }
  ]
}

对我而言,配置的"Filter"部分纯属猜测。是否可以使用我的配置文件管理器执行此操作,还是需要在我的Startup.cs文件中的代码中执行此操作?

编辑:我已经使用C#API使它工作,但仍然想使用JSON配置来弄清楚它:

Log.Logger = new LoggerConfiguration()
            .WriteTo.Logger(lc => lc
                .Filter.ByExcluding(Matching.FromSource<MyClass>())
                .WriteTo.LiterateConsole())
            .WriteTo.Logger(lc => lc
                .Filter.ByExcluding(Matching.FromSource<MyClass>())
                .WriteTo.RollingFile("logs/DebugLog-{Date}.log"))
            .WriteTo.Logger(lc => lc
                .Filter.ByIncludingOnly(Matching.FromSource<MyClass>())
                .WriteTo.RollingFile("logs/DBStats-{Date}.log", outputTemplate:"{Message}{NewLine}"))
            .CreateLogger();

相关讨论

我今天完成了这项工作,并认为我会提供一个正确的答案,因为我花了很多篇文章,问题和其他页面来解决问题。

拥有所有日志非常有用,但是我还想单独记录我的API代码,并省略Microsoft.命名空间日志。进行此操作的JSON配置如下所示:

"Serilog": {
   "Using": ["Serilog.Sinks.File" ],
   "MinimumLevel":"Debug",
   "WriteTo": [
      {
       "Name":"File",
       "Args": {
         "path":"/var/logs/system.log",
          ... //other unrelated file config
        }
      },
      {
       "Name":"Logger",
       "Args": {
         "configureLogger": {
           "WriteTo": [
              {
               "Name":"File",
               "Args": {
                 "path":"/var/logs/api.log",
                  ... //other unrelated file config
                }
              }
            ],
           "Filter": [
              {
               "Name":"ByExcluding",
               "Args": {
                 "expression":"StartsWith(SourceContext, 'Microsoft.')"
                }
              }
            ]
          }
        }
      }
    ],
   "Enrich": ["FromLogContext","WithMachineName","WithThreadId" ]
    ... //Destructure and other config
  }

顶级WriteTo是第一个简单的全局接收器。所有日志事件都将写入此内容。如果在与此相同的级别上添加Filter部分,它将影响所有已配置的WriteTo元素。

然后,我将另一个WriteTo配置为Logger(不是File),但是Args看上去与此不同,并且具有一个configureLogger元素,其作用与顶层的Serilog相同,即也就是说,它是子记录器的顶层。这意味着您可以轻松地将此配置拆分为一个单独的文件,并将其另外添加到配置构建器中(请参阅底部)。

从这里开始,此子记录器的工作方式相同:您可以配置多个WriteTo,并且此级别上的Filter元素将仅影响此子记录器。

只需将更多"Name":"Logger"元素添加到顶层WriteTo部分,并分别为每个元素设置过滤器。

注意
同样重要的是要注意,即使您在config中完成所有这些操作,并且没有在代码中引用Serilog.Filters.Expressions包的任何一点,您仍然必须向该包添加NuGet引用。没有软件包参考,它将无法正常工作。

关于拆分配置:

如果必须添加更多的记录器,为了清楚起见,我一定会将不同的记录器分成单独的文件,例如

appsettings.json:

"Serilog": {
   "Using": ["Serilog.Sinks.File" ],
   "MinimumLevel":"Error",
   "WriteTo": [
      {
       "Name":"File",
       "Args": {
         "path":"/var/logs/system.log",
          ...
        }
      },
      {
       "Name":"Logger",
       "Args": {
         "configureLogger": {} // leave this empty
        }
      }
    ],
   "Enrich": ["FromLogContext","WithMachineName","WithThreadId" ],
    ...

apilogger.json:

{
 "Serilog:WriteTo:1:Args:configureLogger": {   //notice this key
   "WriteTo": [
      {
       "Name":"File",
       "Args": {
         "path":"/var/logs/api_separateFile.log",
          ...
        }
      }
    ],
   "Filter": [
      {
       "Name":"ByExcluding",
       "Args": {
         "expression":"StartsWith(SourceContext, 'Microsoft.')"
        }
      }
    ]
  }
}

然后调整我的IWebHost构建器以包括其他配置:

WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddJsonFile("apilogger.json", optional: false, reloadOnChange: false);
        })
        .UseStartup<Startup>();

这样,更易于理解,阅读和维护。

关于c#:Filter Serilog日志取决于上下文源到不同的接收器?相关推荐

  1. java日志模块_Java源码初探_logging日志模块实现

    一.用途 程序中记录日志,打印到控制台.文件等方式,记录过程可根据日志级别做筛选,日志格式可以自定义. 大概结构如下所示: 简要说明各个模块: (1) LogManager:管理LoggerConte ...

  2. linux中如何查看文件上下文,linux通过grep根据关键字查找日志文件上下文

    linux通过grep根据关键字查找日志文件上下文 1.在标准unix/linux下的grep命令中,通过以下参数控制上下文的显示: grep -C 10 keyword catalina.out 显 ...

  3. Blink SQL之创建日志服务SLS源表

    创建日志服务SLS源表 仅适用于Blink 1.4.5及以上版本. 什么是日志服务 日志服务SLS是针对日志类数据的一站式服务,对于日志服务而言,数据格式类似JSON,示例如下. {"a&q ...

  4. vue filter对象_学习vue源码(3) 手写Vue.directive、Vue.filter、Vue.component方法

    一.Vue.directive Vue.directive(id,[definition]); 1)参数 { string } id{ Function | Object } [ definition ...

  5. SpringSecurity自定义Filter的ignoring()失效问题源码分析

    目录 问题 分析问题 服务器的Filter实现原理 注册Filter Filter过滤流程 Security Filter原理 代理类生成​​​​​​​ 配置的注入 Filter注册为bean的问题 ...

  6. java 日志输出 上下文_java – 使用ServletContextListener和SLF4J在contextDestroyed上没有日志输出...

    我正在尝试向记录器写一条消息(Vaadin)servlet已停止,这使用SLF4J和Log4j2. 为此,我使用的是ServletContextListener,它在应用程序启动时记录消息.但是在co ...

  7. Serilog 日志框架如何自动删除超过 N 天的日志 ?

    咨询区 JohnB: 我的程序使用的日志框架是 Serilog,我是按天分割日志文件的,由于每日文件都比较大,我经常手工删除,但这样做很傻,请问日志框架有没有自动帮我删除 N 天之间的日志呢? 回答区 ...

  8. Flask 上下文源码解析

    简单来说,上下文包括request_ctx(封装了request和session),app_request(封装了app和g),两个ctx都储存在一个叫做Local的数据结构中,这个结构的作用就是会自 ...

  9. 日志 note_深入源码解析日志框架Log4j2(二)

    异步 AsyncAppender ​ log4j2突出于其他日志的优势,异步日志实现.我们先从日志打印看进去.找到Logger,随便找一个log日志的方法. public void debug(fin ...

最新文章

  1. Spark 分布式计算原理
  2. Linux多线程矩阵,操作系统实验——多线程计算矩阵相乘
  3. Qt + VS 【如何添加图片资源】
  4. 运行ant脚本(转载)
  5. 关系与普通表的术语比较
  6. 虚拟化精华问答 | 如何为虚拟机分配任务?
  7. python3安装包是说解压数据出错怎么办_无法修复“zipimport.zipimporter错误:无法解压缩数据;键入python3.6时zlib不可用获取pip.py...
  8. js 运行中断停止_javascript 终止函数执行操作
  9. Linux下rpm安装lrzsz
  10. 分布式压缩感知 matlab程序,BCS_CODE 贝叶斯压缩感知以及分布式 的算法实现,很好的范例 matlab 238万源代码下载- www.pudn.com...
  11. hbase由于一台regionserver和datanode挂死导致hlog split问题
  12. dosbox运行C语言,DOSBox-DOS模拟器-DOSBox下载 v0.74官方版-完美下载
  13. 数据库开发常见面试题
  14. 杭电OJ 1720 进制处理
  15. 基于BS模型与基于二叉树模型的欧式期权定价与希腊字母结果对比
  16. QQ能上网浏览器无法上网
  17. 简述https的几种加密方式
  18. 10分钟教你搭建nexus,并把自己项目中的依赖上传到私服
  19. GD32篇 一、GD32程序设置读保护,防止程序被读取
  20. MATLAB初阶绘图

热门文章

  1. WinhexV13.2汉化版
  2. Ruby 学习笔记3
  3. C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅
  4. Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS and Latin1_General_100...
  5. 计算机答辩答不上来怎么回答,答辩答不上来怎么办
  6. html广告条效果,css3炫酷网站banner广告动画特效
  7. Mac OS使用技巧之十:Finder的详细使用方法
  8. html走马观花效果,走马观花台湾行 用EF-S 10-18来记录风景
  9. Optaplanner规划引擎的工作原理及简单示例(1)
  10. SpringBoot获取ApplicationContext