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

时间:2016-02-15 16:22:21

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

我对Log4Net很新。请帮助我理解一些概念。

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

在app配置文件中,我有一个记录器路由到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>

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

我的记录器类设计为单例。我想知道appender是如何实例化的。它们是否每个logger实例创建一次,或者每次调用ILog.Info(obj)方法调用时都会实例化一次?

感谢。

2 个答案:

答案 0 :(得分:3)

  

每个客户端使用相同的代码库。唯一改变的是   基于客户端的连接字符串值。

对我而言,这并非100%明确,我将此视为2种可能的情况,因此根据您的配置提供了2种可能的解决方案。

多个部署

确实没有必要使用自定义代码,因为您的部署应该知道它正在处理/使用的数据库。基于此,您只需在初始化时配置一次AdoNetAppender。我认为这不是那么简单,因为你提到你在评论中有这个工作。

多租户申请

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

  1. 我认为最简单的方法是创建自定义log4net appender。现有的AdoNetAppender未被密封,因此您可以继承并覆盖它。然后,您需要使用自己的代码覆盖受保护的方法ResolveConnectionString,您可以根据执行或请求上下文解析连接字符串。 感谢@stuartd获取ResolveConnectionString上的指针。
  2. 您可以创建自己的具有动态数据库连接字符串的AdoNetAppender自定义版本。唯一的另一个移动部分是基于上下文分配它,因为你没有提到你如何确定这个(或者这个上下文甚至是什么,如果它是一个web应用程序,可能是一个URL?)。
  3. 创建appender后,只需将其添加到.config文件中(如果您不想使用配置文件,则以编程方式配置它)。

答案 1 :(得分:0)

感谢Igor建议解决连接字符串的几种方法。

但是,我正在做这样的事情。

6546263252026003359  192.168.1.1