我对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)方法调用时都会实例化一次?
感谢。
答案 0 :(得分:3)
每个客户端使用相同的代码库。唯一改变的是 基于客户端的连接字符串值。
对我而言,这并非100%明确,我将此视为2种可能的情况,因此根据您的配置提供了2种可能的解决方案。
确实没有必要使用自定义代码,因为您的部署应该知道它正在处理/使用的数据库。基于此,您只需在初始化时配置一次AdoNetAppender。我认为这不是那么简单,因为你提到你在评论中有这个工作。
您可以为所有客户进行单一部署,代码会根据请求的来源确定目标数据库。
ResolveConnectionString
,您可以根据执行或请求上下文解析连接字符串。 感谢@stuartd获取ResolveConnectionString上的指针。 AdoNetAppender
自定义版本。唯一的另一个移动部分是基于上下文分配它,因为你没有提到你如何确定这个(或者这个上下文甚至是什么,如果它是一个web应用程序,可能是一个URL?)。 创建appender后,只需将其添加到.config
文件中(如果您不想使用配置文件,则以编程方式配置它)。
答案 1 :(得分:0)
感谢Igor建议解决连接字符串的几种方法。
但是,我正在做这样的事情。
6546263252026003359 192.168.1.1