4

いくつかの Web サービス呼び出しがあるライブラリがあります。現在、外部 Web サービスに対して行われたすべての要求をログに記録し、受信したすべての応答をログに記録する必要があります。これは後で内部監査用です。

私のSQLテーブルは次のようになります。

CREATE TABLE [dbo].[WebServiceLog](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [nvarchar](255) NOT NULL,
    [Level] [nvarchar](50) NOT NULL,
    [Logger] [nvarchar](255) NOT NULL,
    [Message] [ntext] NOT NULL,
    [SessionID] [nvarchar](50) NOT NULL,
    [SearchID] [nvarchar](25) NULL
)

Message フィールドは、Web サービスからの要求と応答が格納される場所であることに注意してください。応答は、90,000 文字を超えるオーダーの非常に大きい場合もあれば、それ以上になる場合もあります。(フライト/ホテルの空室検索 - 大量のデータが返される可能性があります)

私のアペンダー設定は次のとおりです。

<appender name="InfoAppender" type="log4net.Appender.AdoNetAppender">
        <bufferSize value="1"/>
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
        <connectionString value="Data Source=tcexpress;Initial Catalog=test;Persist Security Info=True;User ID=testUser;Password=**"/>
        <commandText value="INSERT INTO WebServiceLog ([Date],[Thread],[Level],[Logger],[Message],[SessionID], [SearchID]) VALUES (@log_date, @thread, @log_level, @logger, @message, @session_id, @search_id)"/>
        <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="454751"/>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%message"/>
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@session_id"/>
            <dbType value="String"/>
            <size value="50"/>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%X{sessionID}"/>
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@search_id"/>
            <dbType value="String"/>
            <size value="25"/>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%X{searchID}"/>
            </layout>
        </parameter>
    </appender>

アペンダーに、私のフィールドがnTextあり、任意の量のデータが与えられる可能性があることを伝える方法はありますか? 文字列のフィールド長に非常に高い値を設定しようとしましたが、常に 454751 の値で切り捨てられているよう
です。この問題に遭遇した人はいますか? または、log4net を使用して大きなメッセージをデータベースに記録するより良い方法はありますか? どんな助けでも大歓迎です。

4

1 に答える 1

6

たぶんそれはあなたの質問に正しく答えないでしょう、しかしあなたがnvarchar(max)その代わりに使うならnTextこれはあなたのためにうまくいくはずです:

<parameter>
  <parameterName value="@message"/>
  <dbType value="String"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%message" />
  </layout>
</parameter>

これは、(スタックトレースを使用して)例外をログに記録するために使用するものです。-1に設定すると、Dmitriyが提案したように機能するはずです。

于 2012-04-03T08:14:49.103 に答える