我是 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 应用
您为所有客户进行单一部署,代码根据请求的来源确定目标数据库。
- 我认为实现此目的最简单的方法是创建自定义 log4net appender .现有AdoNetAppender未密封,因此您可以继承并覆盖它。然后,您需要使用自己的代码覆盖 protected 方法
ResolveConnectionString
,您可以在其中根据执行或请求上下文解析连接字符串。 感谢@stuartd 对 ResolveConnectionString 的指点。 - 您可以创建自己的
AdoNetAppender
自定义版本,它具有动态数据库连接字符串。唯一的其他移动部分是根据上下文分配它,因为您没有提到如何确定它(或者这个上下文甚至是什么,如果它是一个网络应用程序,可能是一个 URL?)。
一旦你创建了你的附加程序,只需将它添加到 .config
文件(或者如果你不想使用配置文件,则以编程方式配置它)。
关于c# - 将消息记录到不同的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35414212/