[英]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。 我認為這不是那么簡單,因為你提到你在評論中有這個工作。
您為所有客戶進行了單一部署,代碼根據請求的來源計算出目標數據庫。
ResolveConnectionString
,您可以根據執行或請求上下文解析連接字符串。 感謝@stuartd獲取ResolveConnectionString上的指針。 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.