2012-04-03 11 views
3

Ich habe eine Bibliothek, die ein paar Web-Service-Anrufe hat. Jetzt müssen alle an externe Webdienste gerichteten Anfragen protokolliert und alle erhaltenen Antworten protokolliert werden. Dies ist für interne Audits später.Logging große Nachrichten mit Log4Net AdoNetAppender

Meine SQL-Tabelle sieht so aus.

Beachten Sie, dass im Feld Nachricht die Anfrage und die Antworten des Webdienstes gespeichert sind. Die Antworten sind manchmal sehr groß in der Größenordnung von mehr als 90.000 Zeichen, manchmal sogar mehr. (Flug-/Hotelverfügbarkeitssuche - könnte viele Daten zurückgeben)

Meine Appender-Konfiguration ist wie folgt.

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

Gibt es trotzdem die appender zu sagen, dass mein Feld nText ist und jede Menge Daten, die ihm gegeben haben könnte? Ich habe versucht, einen sehr hohen Wert für die Feldlänge mit Zeichenfolge festlegen, aber es scheint immer bei einem Wert von 454751 abgeschnitten.
Hat jemand auf dieses Problem gestoßen? Oder gibt es eine bessere Möglichkeit, große Nachrichten mit log4net in der Datenbank zu protokollieren? Jede Hilfe wird sehr geschätzt.

+4

Haben Sie versucht, Größe = -1? Auch 454751 scheint eine große Zahl (400K?). Sie sollten die Daten wahrscheinlich besser komprimieren, bevor Sie sie in die Datenbank einfügen. –

+0

Es ist mir nicht gelungen, die Größe auf -1 zu setzen. Wenn dies der Fall ist, werden Protokollnachrichten nicht in der Datenbank angezeigt (vermutlich aufgrund eines internen Fehlers). – stefann

+0

Einstellung auf -1 funktioniert nicht für mich. Meine Nachrichten sind auf 42k abgeschnitten. – Jacques

Antwort

4

Vielleicht ist das nicht Ihre Frage richtig beantwortet, aber wenn Sie nvarchar(max) statt nText verwenden dann sollte dies für Sie funktionieren:

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

Dies ist, was ich Ausnahmen einzuloggen (mit dem Stack-Trace) . Die Einstellung auf -1 sollte auch funktionieren, wie Dmitriy vorgeschlagen hat.

+3

Das Ändern auf nvarchar (max) funktionierte nicht für mich. Größe = -1 wirkte jedoch wie ein Zauber. (mit sql Server 2012 Backend) – batkuip

+0

'ntext' und' nvarchar (max) 'sind Synonyme. Das Ändern des Spaltentyps hat keine Auswirkungen. Diese Antwort funktioniert, weil sie keine Größe angibt, nicht wegen 'nvarchar (max)' –

+0

Sind diese Antworten noch gültig? Ich habe keinen Größenknoten und Größe Wert = -1 versucht, aber meine Spalte wird immer noch abgeschnitten. – Clint

Verwandte Themen