私はいくつかのWebサービスコールを持つライブラリを持っています。これで、外部Webサービスに対するすべての要求をログに記録し、受け取ったすべての応答を記録する必要があります。これは後で内部監査に使用されます。Log4Netで大きなメッセージを記録するAdoNetAppender
私の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
)
メッセージフィールドは、Webサービスからの要求と応答が格納される場所です。応答は90k文字以上のオーダーで時には非常に大きくなることがあります。 (フライト/ホテル空き状況の検索 - 多くのデータを返す可能性があります)
私のアペンダーの設定は以下の通りです。
<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を使って大きなメッセージをデータベースにログする良い方法はありますか?どんな助けでも大歓迎です。これは私が(スタックトレースとの)例外をログに記録するために使用するものです
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
:適切にあなたの質問に答えていませんが、あなたの代わりにnText
のnvarchar(max)
を使用する場合、これはあなたのため正常に動作する必要がありますたぶん
サイズ= -1を設定しましたか?また、454751は大きな数字(400K?)のようです。データをデータベースに挿入する前に、データを圧縮するほうがよいでしょう。 –
サイズを-1に設定できませんでした。私がそうすると、(おそらく内部エラーのために)ログメッセージがdbに表示されません。 – stefann
が-1に設定されていても動作しません。メッセージが42Kに切り捨てられました – Jacques