3

.net 3.5 アプリケーションで log4net のログを記録しています。ロギングがデータベースに挿入されています。私が抱えている問題の 1 つは、データを設定していないデータベースでは、データベース null の代わりに「NULL」が挿入されることです。私の設定は

 <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <immediateFlush value="true" />
    <bufferSize value="0" />
    <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
    <connectionString value="data source=localhost;initial catalog=logging_db;User ID=root;Password=" />
    <commandText value="INSERT INTO system_log(appname, action,context_id)
                 VALUES (@appname, @action, @context_id);" />
    <parameter>
      <parameterName value="appname" />
      <dbType value="String" />
      <size value="10" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="My Web Service" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="action" />
      <dbType value="String" />
      <size value="45" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%5c{1}.%M" />
      </layout>
    </parameter>
  <parameter>
      <parameterName value="context_id" />
      <dbType value="String" />
      <size value="48" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%X{context_id}" />
      </layout>
    </parameter>
    <filter type="log4net.Filter.LevelRangeFilter">
      <acceptOnMatch value="true" />
      <levelMin value="DEBUG" />
      <levelMax value="FATAL" />
    </filter>
  </appender>

一部のメソッドでは、メソッドで context_id を次のように設定しています

log4net.LogicalThreadContext.Properties["context_id"] = "My context";

私が提供した場所には問題なく挿入されていますが、設定していない場所には正しく挿入されていません。https://issues.apache.org/jira/browse/LOG4NET-28でも問題を確認しましたが、解決済みとしてマークされています

4

3 に答える 3

3

INSERT INTO ステートメントを変更して、「NULL」文字列をチェックし、それらを DB null に置き換えることができます。アイデアはここからです

したがって、次のようになります。

INSERT INTO system_log(appname, action,context_id) VALUES (@appname, @action, CASE WHEN @context_id = 'NULL' THEN NULL ELSE @context_id END );"

アップデート

代わりにストアド プロシージャを使用するには、ステートメントを次のように置き換えます。

exec YourStoredProcedure @appname, @action, @context_id
于 2015-04-08T11:19:09.437 に答える
1

この状況では、トリガーを使用することを好みます。ON INSERT または INSTEAD OF INSERT ( https://technet.microsoft.com/en-us/library/ms175089(v=sql.105).aspxを参照)

私は次のようなことをします:

CREATE TRIGGER dbo.log_onInsert 
   ON  system_log
   INSTEAD OF INSERT
 AS 
BEGIN
SET NOCOUNT ON;

INSERT INTO system_log(appname, action,context_id)
select 
    appname, action,
    case when inserted.context_id='(null)' then null else inserted.context_id end
from inserted

END
GO
于 2016-06-23T09:09:18.657 に答える