带注入的定制 Serilog 水槽?

2024-01-03

我创建了一个简单的 Serilog 接收器项目,如下所示:

namespace MyApp.Cloud.Serilog.MQSink
{
    public class MessageQueueSink: ILogEventSink
    {
        private readonly IMQProducer _MQProducerService;
        public MessageQueueSink(IMQProducer mQProducerService)
        {
            _MQProducerService = mQProducerService;
        }
        public void Emit(LogEvent logEvent)
        {
            _MQProducerService.Produce<SendLog>(new SendLog() { LogEventJson = JsonConvert.SerializeObject(logEvent)});
        }
    }
}

消费微服务的启动方式如下:

        var configurationBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
        var appSettings = configurationBuilder.Get<AppSettings>();

        configurationBuilder = new ConfigurationBuilder().AddJsonFile("ExtendedSettings.json").Build();

            Host.CreateDefaultBuilder(args)
                .UseMyAppCloudMQ(context => context.UseSettings(appSettings.MQSettings))
                .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration))
                .ConfigureServices((hostContext, services) =>
                {
                    services
                        .AddHostedService<ExtendedProgService>()
                        .Configure<MQSettings>(configurationBuilder.GetSection("MQSettings"))
                })
                .Build().Run();

appsettings.json 的 serilog 部分如下所示:

  "serilog": {
    "Using": [ "Serilog.Sinks.File", "Serilog.Sinks.Console", "MyApp.Cloud.Serilog.MQSink" ],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId" ],
    "WriteTo": [
      {
        "Name": "MessageQueueSink",
        "Args": {}
        }
    ]
  }

MQSink 项目被添加为微服务项目的引用,我可以看到 MQSink dll 最终位于 bin 文件夹中。

问题是,当在微服务中执行 _logger.LogInformation(...) 时,永远不会触发 Emit,但是如果我添加控制台接收器,它会输出数据吗?我也怀疑注入的MQ不能正常工作?

怎么解决这个问题呢?

EDIT :

打开Serilog内部日志可以看到找不到MessageQueueSink这个方法。我没有找到任何方法让它与 appsetings.json 一起工作,所以我开始研究如何在代码中绑定它。

为了让它工作,必须创建一个扩展:

public static class MySinkExtensions
    {
        public static LoggerConfiguration MessageQueueSink(
                  this Serilog.Configuration.LoggerSinkConfiguration loggerConfiguration,
                  MyApp.Cloud.MQ.Interface.IMQProducer mQProducer = null)
        {
            return loggerConfiguration.Sink(new MyApp.Cloud.Serilog.MQSink.MessageQueueSink(mQProducer));
        }
    }

这使得添加自定义接收器成为可能,如下所示:

Host.CreateDefaultBuilder(args)
                    .UseMyAppCloudMQ(context => context.UseSettings(appSettings.MQSettings))
                     .ConfigureServices((hostContext, services) =>
                    {
                        services
                            .Configure<MQSettings>(configurationBuilder.GetSection("MQSettings"))
                    })
                    .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration).WriteTo.MessageQueueSink())
                    .Build().Run();

自定义接收器已加载并触发 Emit,但我仍然不知道如何将 MQ 注入到接收器中?如果我可以在 appsettings.json 文件中完成 Serilog 和接收器的所有配置,那就更好了。


如果您参考提供水槽 https://github.com/serilog/serilog/wiki/Provided-Sinks列出并检查其中一些的源代码,您会注意到模式通常是:

  1. 构造接收器配置(通常从IConfiguration、内联或两者的组合)
  2. 将配置传递给接收器注册。

然后接收器实现实例化所需的服务来推送日志。

我建议的另一种方法是注册不带任何参数的 Serilog (UseSerilog()),然后配置静态Serilog.Log使用构建的类IServiceProvider:

var host = Host.CreateDefaultBuilder(args)
    // Register your services as usual
    .UseSerilog()
    .Build()
    
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(host.Services.GetRequiredService<IConfiguration>())
    .WriteTo.MessageQueueSink(host.Services.GetRequiredService<IMQProducer>())
    .CreateLogger();

host.Run();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带注入的定制 Serilog 水槽? 的相关文章

  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过

随机推荐

  • Android Studio 重复文件

    我的源代码中出现重复的文件 这种情况在 Android Studio 中经常发生 并且所有类型的文件都会发生这种情况 而不仅仅是 gradle 文件 当我签出新分支或切换分支时 通常会发生这种情况 造成这种情况的原因是什么以及如何预防 请注
  • 如何将字符串转换为 JavaScript 函数调用? [复制]

    这个问题在这里已经有答案了 我得到一个像这样的字符串 settings functionName t parentNode id 我想将其转换为函数调用 如下所示 clickedOnItem IdofParent 当然 这必须在 JavaS
  • 如何为 RestController 启用 GZIP? [复制]

    这个问题在这里已经有答案了 我有一个简单的REST控制器使用spring 返回的GZIP响应如何application xml流是否启用 RestController public class MyRest RequestMapping m
  • foreach my $var (@list) -- $var 是一个引用?

    所以 我从来不知道这一点 我想得到一些澄清 我知道如果你这样做 foreach list 如果您在该循环中更改 它将影响实际数据 但是 我不知道如果你这样做 foreach my var1 list 如果您在循环中更改 var1 它将更改实
  • 在 smarty 模板中创建数组? [复制]

    这个问题在这里已经有答案了 我需要从 smarty 模板中的其他一维数组创建一个新数组 那么 在模板文件中创建数组的最佳可能性是什么 谢谢 萨钦 Smarty3 让您 var foo gt bar sub gt 1 2 3 and var
  • Ruby 中 $$ 的含义是什么?

    irb main 002 0 gt gt 5052 是什么意思 在 Ruby 中以及如何 在哪里使用它 is the 进程号 http www opengroup org onlinepubs 9699919799 functions ge
  • HeapTaskDaemon 线程阻塞的 ANR

    我的 Android 应用程序出现 ANR 错误 跟踪显示只有一个线程处于阻塞状态 所有其他线程都处于等待 睡眠 本机状态 因此它似乎并未处于死锁状态 我手动 直接 启动了两个线程 因此我大致知道 ANR 发生在应用程序的哪个部分 不幸的是
  • 从Python文件中读取单个字符?

    我的问题是 除了下面之外 是否还有其他方法可以一次一个字符地遍历文件 with open filename as f while True c f read 1 if not c print End of file break print
  • 使 tkinter 文本小部件适合窗口

    我正在制作一个文本编辑器 其主要小部件是一个文本小部件 供用户实际输入文本 当用户调整窗格大小时 我需要使文本小部件适合窗口 我通过使小部件变大来有点作弊 但这只是一个临时解决方案 让我在寻找解决方案时可以处理其他部分 如何使文本小部件自动
  • 如何在 Rails 2.3.5 中安装/使用 Devise?

    我尝试从 Github 上 Devise 的 v 1 2 oauth 分支进行安装 但仍然出现错误 如何在 Rails 2 3 5 应用程序上安装 devise gem 我特别想要一个可以与omniauth一起使用的 gem install
  • Mac App Store:放弃 32 位支持转而支持 ARC,32 位版本的现有用户会看到更新消息吗?

    我正在考虑放弃 32 位支持 转而支持自动引用计数 仅支持 64 位二进制文 件 我想在 Mac App Store 中避免出现这两种情况 For a 旧 32 位 Mac 用户 谁购买了支持 32 位的先前版本 他们会在 Mac App
  • Python 中是否有用于纯文本文件的本机模板系统?

    我正在寻找用于将输出格式化为简单文本的 Python 技术或模板系统 我需要的是它将能够迭代多个列表或字典 如果我能够将模板定义到单独的文件 如output templ 中而不是将其硬编码到源代码中 那就太好了 作为我想要实现的简单示例 我
  • 如何从9GAG获取数据json

    也许你认为这是一个愚蠢的问题 但我希望你能给我一些建议 我的问题 当我查看 9gag com 的源代码时 我意识到他们有一些行代码来加载更多内容 div class loading a class btn badge load more p
  • PyYAML 中的数组没有缩进或空格

    在下面的代码中我创建了net plan dict变量字典并将其转换为YAML格式文件 在字典里我有一个叫做addresses这是一个由三个元素组成的数组 创建YAML文件后 这三个数组元素没有放置在addresses field impor
  • JPA针对不同数据库的不同列类型

    是否可以根据使用的数据库使用 JPA 定义不同的列类型 我需要将 id 存储为 uuid 并且它必须是可移植的 那就是问题所在 PostgreSQL有 uuid MSSQL有 uniqueidentifier 而Oracle什么都没有 我想
  • android中textview的圆角

    我有一个文本视图 希望它的角是圆形的 我已经知道可以使用android background drawable somefile 就我而言 该标签已包含在内 因此无法再次使用 例如android background drawable my
  • Rails 更改 form_for 中提交的路由

    我有一个模型 文章 和一个嵌套在文章中的模型 评级 文章 123 评级 我想更改 ratings form html erb 中 f submit 的路由 现在是这样 按提交后 我的申请路由到 评分 111 但我想将其路由到 文章 123
  • WCF 服务应该返回 EntityObject 还是 POCO/DTO 类?

    我一直在查看很多使用 EntityFramework 的 WCF 示例 其中大多数似乎都会向客户端返回某种 POCO 或 DTO 类 我想知道为什么这是默认的EntityObject包括 DataContract 属性和工具INotifyP
  • Angula2 Karma 无法加载“webpack”!

    我已经在 Angular2 项目 Webpack Karma 上工作了几个月 该项目基于此入门程序的稍旧版本 https github com preboot angular2 webpack https github com preboo
  • 带注入的定制 Serilog 水槽?

    我创建了一个简单的 Serilog 接收器项目 如下所示 namespace MyApp Cloud Serilog MQSink public class MessageQueueSink ILogEventSink private re