標籤:
這兩天遇到log4net寫日誌到mysql資料庫中,有時候在A項目中可以,有時候B項目就有問題,有時候測試環境沒問題,到正式部署環境又出問題,經過兩天的煎熬,終於理清楚了其中的頭緒。
1.配置現狀
config檔案中log4net配置節:
<!--以下是log4net配置-->
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="AdoNetAppender" />
</root>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.8.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
<connectionString value="server=192.168.10;2database=userlogs;Uid=****;Pwd=****;" />
<commandText value="INSERT INTO logs(log_datetime,log_thread,log_level,log_logger,log_message,Exception) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
</log4net>
項目引用的MySql.Data的版本號碼是:5.1.5.0
本機安裝過:C:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3
各位看官,在這種不堪的環境下,調用log4net寫日誌到mysql,不成功是理所當然的事兒!!!
2.原因分析:
項目啟動後,根據配置節connectionType中指定的MySql.Data.dll的版本號碼,先在bin目錄下尋找6.8.5.0的MySql.Data.dll,結果發現bin下沒有,就去mysql安裝驅動的地方C:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3尋找,同樣也沒找到。
最後無法載入該版本的MySql.Data.dll,於是就出現了在調用寫日誌的時候,就寫不成功了。怎樣修改日誌才能寫入成功呢?
3.解決辦法:
方法一:
修改<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.8.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
為:<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=5.1.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
那麼,系統在載入MySql.Data.dll時,先在bin下尋找版本號碼為5.1.5.0的MySql.Data.dll。載入成功,故可以成功寫入。
方法二:
修改<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.8.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
為:<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
那麼,系統在載入MySql.Data.dll時,先在bin下尋找版本號碼為6.8.3.0的MySql.Data.dll,沒有找到,那麼去系統的安裝目錄下找,結果找到,載入成功,故可以成功寫入。
方法三:
找到版本為6.8.5.0的MySql.Data.dll,然後項目直接引用版本號碼為6.8.5.0的MySql.Data.dll。也可以成功。
綜合以上三種方法,最推薦的是項目引用的Dll版本和config檔案中log4net的connectionType 節指定的版本一致,就算部署環境變化,log4net寫日誌到mysql資料庫也能正常的工作。
同時注意:
項目的版本最好和mysql.data.dll的運行時版本一致,都是基於2.0,3.5或者都是4.0,4.5。
log4net引用了Mysql.Data.dll,但是就是不能寫到mysql資料庫的解決辦法