Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将消息记录到不同的数据库_C#_.net_Log4net_Log4net Configuration_Log4net Appender - Fatal编程技术网

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

C# 将消息记录到不同的数据库,c#,.net,log4net,log4net-configuration,log4net-appender,C#,.net,Log4net,Log4net Configuration,Log4net Appender,我对Log4Net很陌生。请帮我理解一些概念 在我的应用程序中,我有一个记录器。我想根据一些条件逻辑将消息记录到不同的数据库 在应用程序配置文件中,我有一个日志程序路由到AdonNetAppender <log4net> <appender name="SQLAppender" type="log4net.Appender.AdoNetAppender"> <connectionType value="" /> <connectio

我对Log4Net很陌生。请帮我理解一些概念

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

在应用程序配置文件中,我有一个日志程序路由到AdonNetAppender

<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>

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

对我来说,这还不是100%清楚,我将其理解为两种可能的方案,以及基于您的配置的两种可能的解决方案

多重部署 不需要定制代码,因为您的部署应该知道它使用的是什么数据库。基于此,您只需在初始化时配置一次AdonNetAppender。我认为这并不是这么简单,因为你在评论中提到了这一点

多租户申请 您为所有客户进行了一次部署,代码根据请求的来源确定了目标数据库

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

    感谢Igor为解析连接字符串提供了一些方法

    然而,我正在做这样的事情

    var loggerRepo = LogManager.GetRepository();
    if (loggerRepo != null) {
    var appender = loggerRepo.GetAppenders().OfType < AdoNetAppender > ().First(a => a.Name == "YourAppenderName");
    
    appender.ConnectionString = ConfigurationManager.ConnectionStrings[""].ConnectionString;
    appender.ActivateOptions();
    }
    _log.Info("LogSOmeth9ng");
    
    var loggerRepo=LogManager.GetRepository();
    if(loggerRepo!=null){
    var appender=loggerRepo.GetAppenders(),其类型为();
    appender.ConnectionString=ConfigurationManager.ConnectionString[“”].ConnectionString;
    appender.ActivateOptions();
    }
    _log.Info(“LogSOmeth9ng”);
    
    是的,有一种方法..在这个
    c#log4net上进行谷歌搜索,以编程方式设置连接字符串
    还阅读了一些以前发布的解决方案@MethodMan,我尝试了谷歌搜索,发现我们可以以编程方式生成连接字符串。但我希望为每次调用ILog.Info(obj)方法动态生成一个连接字符串。我没有找到任何来源表明可以按照我想要的方式进行操作。为什么不能将不同的数据库连接字符串存储在web.config文件中,然后按照发送的链接的方式进行操作。。当你说你想动态生成它时,你用什么作为一种机制来决定连接到哪里。。?如果有多个客户端使用我们的应用程序,也可以这样做。每个客户端使用相同的代码库。唯一需要更改的是基于客户端的连接字符串值。根据发送请求的客户端,我需要在不同的数据库中记录信息,因此必须在运行时解析adonet appender的连接字符串值。应用程序中是否有客户端最初连接到应用程序的地方。。?如果是这样,那么根据他们的登录名或其他唯一标识符跟踪他们的连接字符串。这是一个web应用程序吗。。?如果是这样,您能否利用会话变量?我们有多个客户端,它们使用我维护的单个基本web应用程序,我根据用户身份获取它们的信息。如果我知道您最初是如何允许它们连接到您的应用程序的,我可能会推荐一个更好的解决方案显示它们的代码连接将AdoNetAppender子类化并重写就足够了。谢谢@stuartd,我已经相应地更新了我的答案。我认为它还需要与每个客户端一个日志程序策略结合使用,因此每个线程/请求/表单/等都有一个日志程序(注意OP有一个应用程序配置)