Logging large messages with Log4Net AdoNetAppender

I have a library that has a couple of web service calls. Now you need to log all requests made to external web services and log any responses received. This is for internal audits later.

My sql table looks like this.

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
)

      

Note that the Message field contains the request and responses of the web service. The answers are sometimes very large, in the order of over 90 thousand characters, sometimes even more. (Search for flight / hotel - may return a lot of data)

My appender config looks like this.

<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>

      

Does it make sense to tell the app what my field is nText

, and can any amount of data be provided? I tried to set a very high value for the length of the field with the string, but it always seems that it gets truncated at 454751.
Has anyone encountered this problem? Or is there a better way to log large messages to the database using log4net? Any help would be much appreciated.

+3


source to share


1 answer


This may not answer your question correctly, but if you use nvarchar(max)

instead nText

then this should work for you:

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

      



This is what I use to log exceptions (with a stack trace). Setting it to -1 should also work as Dmitry suggested.

+6


source







All Articles