c# - 将消息记录到不同的数据库

标签 c# .net log4net log4net-configuration log4net-appender

我是 Log4Net 的新手。请帮助我理解一些概念。

在我的应用程序中,我有一个记录器。我想根据某些条件逻辑将消息记录到不同的数据库。

在应用程序配置文件中,我有一个路由到 AdonetAppender 的记录器

<log4net>
<appender name="SQLAppender" type="log4net.Appender.AdoNetAppender">     
   <connectionType value="" />
   <connectionString value="" />
</appender
<logger name="AuditLogger">
  <level value="ALL" />
  <appender-ref ref="SQLAppender"/>
</logger>
</log4net>

有没有办法通过代码动态设置连接字符串?

我的记录器类被设计为单例。我想知道附加程序是如何实例化的。它们是在每个记录器实例创建时实例化一次,还是在每次调用 ILog.Info(obj) 方法调用时实例化一次?

谢谢。

最佳答案

Every client uses the same code base. The only thing that changes is the connection string value based on the client.

对我而言,这不是 100% 清楚,我将其解读为 2 种可能的情况,因此根据您的配置有 2 种可能的解决方案。

多次部署

真正不需要自定义代码,因为您的部署应该知道它正在处理/使用的数据库是什么。基于此,您只需在初始化时配置一次 AdoNetAppender。我认为这不是这么简单,因为您在评论中提到您已将其发挥作用。

Multi-Tenancy 应用

您为所有客户进行单一部署,代码根据请求的来源确定目标数据库。

  1. 我认为实现此目的最简单的方法是创建自定义 log4net appender .现有AdoNetAppender未密封,因此您可以继承并覆盖它。然后,您需要使用自己的代码覆盖 protected 方法 ResolveConnectionString,您可以在其中根据执行或请求上下文解析连接字符串。 感谢@stuartd 对 ResolveConnectionString 的指点。
  2. 您可以创建自己的 AdoNetAppender 自定义版本,它具有动态数据库连接字符串。唯一的其他移动部分是根据上下文分配它,因为您没有提到如何确定它(或者这个上下文甚至是什么,如果它是一个网络应用程序,可能是一个 URL?)。

一旦你创建了你的附加程序,只需将它添加到 .config 文件(或者如果你不想使用配置文件,则以编程方式配置它)。

关于c# - 将消息记录到不同的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35414212/

相关文章:

wpf - 多次报告 log4net NHibernate.Util.ADOExceptionReporter

asp.net - 使用 Loggly 时在 log4net 中指定应用程序名称

c# - Sql server 真实数据类型,C# 等价物是什么?

c# - 获取 Windows Phone 7.1 设备 ID

c# - Newtonsoft JsonConverter 将字符串或对象转换为对象

c# - C#阻止鼠标移动

c# - 当引用的程序集同时引用 mscorlib 2.0.5.0 和 4.0.0.0 时如何让 roslyn 进行编译

c# - Log4Net 数据库乐趣 - 连接字符串!

c# - 为什么要对 QueueBackgroundWorkItem 使用异步?

c# - Request.Cookies 和 Response.Cookies 的区别