簡體   English   中英

將消息記錄到不同的數據庫

[英]Logging messages to different databases

我對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)方法調用時都會實例化一次?

謝謝。

每個客戶端使用相同的代碼庫。 唯一改變的是基於客戶端的連接字符串值。

對我而言,這並非100%明確,我將其視為2種可能的情況,因此根據您的配置提供了2種可能的解決方案。

多個部署

實際上沒有必要使用自定義代碼,因為您的部署應該知道它正在處理/使用的數據庫。 基於此,您只需在初始化時配置一次AdoNetAppender。 我認為這不是那么簡單,因為你提到你在評論中有這個工作。

多租戶申請

您為所有客戶進行了單一部署,代碼根據請求的來源計算出目標數據庫。

  1. 我認為最簡單的方法是創建一個自定義的log4net appender 現有的AdoNetAppender沒有密封,因此您可以繼承並覆蓋它。 然后,您需要使用自己的代碼覆蓋受保護的方法ResolveConnectionString ,您可以根據執行或請求上下文解析連接字符串。 感謝@stuartd獲取ResolveConnectionString上的指針。
  2. 您可以創建自己的AdoNetAppender自定義版本,該版本具有動態數據庫連接字符串。 唯一的其他移動部分是基於上下文分配它,因為你沒有提到你如何確定這個(或者這個上下文甚至是什么,如果它是一個web應用程序,可能是一個URL?)。

一旦創建了appender,只需將其添加到.config文件中(或者如果您不想使用配置文件, .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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM