2009-04-07 7 views
12

Ho un'applicazione C# multi-thread che utilizza log4net per le funzionalità di registrazione. Principalmente il RollingFileAppender.Best practice per visualizzatore log in tempo reale su schermo per log4net

Desidero offrire all'utente la possibilità di visualizzare l'attività dell'applicazione in una finestra "registro applicazioni". Questo consisterà in una listview (modalità dettagli), una griglia o qualcosa di simile.

Sto cercando i modi migliori per farlo. L'unica soluzione che ho finora è impostare un appender UDP e creare un thread speciale che ascolterà e sposterà tutti i messaggi nell'interfaccia utente.

Ho anche esaminato la possibilità di creare un "wrapper" che scrive sia sull'interfaccia utente, che registra il messaggio utilizzando log4net ... hum.

Grazie mille in anticipo per il vostro aiuto.

risposta

0

Che dire di scrivere il proprio appender che genererà un evento quando succede qualcosa? È possibile ottenere la sua istanza esaminando il repository log4net.

2

È necessario visualizzare i dati di registro persistenti in questa finestra? Se è così, ti consiglio di accedere a un database. Quindi log4net può funzionare indisturbato dal client che può leggere i dati del registro dal database in modo non bloccante.

È possibile utilizzare SQL Server Compact Edition se non si desidera/avere un server Express o completo.

La registrazione nel database viene eseguita con il log4net integrato AdoNetAdapter.

7

Se sei felice di affidarti a un altro programma, puoi utilizzare dbgview da Sysinternals. Questo mostrerà tutto ciò che viene registrato con il metodo Debug.WriteLine(). Penso che lo OutputDebugStringAppender farà questo, ma non ho usato Log4Net quindi non posso esserne sicuro.

+1

È inoltre possibile inviare log4net per tracciare l'output. – kenny

1

Sono d'accordo con Peter Lillevold. Ecco un semplice esempio di come accedere a un db da una console app impostando dinamicamente il livello di dettaglio della registrazione

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using log4net; 
using log4net.Config; 
using NUnit.Framework; 

namespace ExampleConsoleApplication 
{ 
    [TestFixture] 
    class TestClass 
    { 

    //private static readonly ILog logger = 
    //  LogManager.GetLogger (typeof (TestClass)); 

    private static readonly log4net.ILog logger = log4net.LogManager.GetLogger (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

     static void Main (string[] args) 
     { 

      Console.WriteLine (" START "); 
      #region LoggerUsage 
      DOMConfigurator.Configure(); //tis configures the logger 
      logger.Debug ("Here is a debug log."); 
      logger.Info ("... and an Info log."); 
      logger.Warn ("... and a warning."); 
      logger.Error ("... and an error."); 
      logger.Fatal ("... and a fatal error."); 

      #endregion LoggerUsage 
      TestClass objTestClass = new TestClass(); 
      objTestClass.TestMethodNameOK(); 
      objTestClass.TestMethodNameNOK(); 

      Console.WriteLine (" END HIT A KEY TO EXIT "); 
      Console.ReadLine(); 
      } //eof method 

     [SetUp] 
     protected void SetUp() 
     { 
      //Add Here the Initialization of the objects 
     } 
     [Test (Description = "Add here the description of this test method ")] 
     protected void TestMethodNameOK() 
     { 
      //build ok use case scenario here - e.g. no exception should be raced ' 
      //Vegetable newCarrot = pool.GetItemByPropertyValue<Vegetable> ("WriongByPurpose", "Orange"); 
      //Assert.IsInstanceOfType (typeof (Vegetable), newCarrot); 
      //Assert.AreSame (newCarrot, carrot); 
      //logger.Info (" I got the newCarrot which is " + newCarrot.Color); 

     } //eof method 

     [Test (Description = "Add here the description of this test method ")] 
     protected void TestMethodNameNOK()   //e.g. the one that should raze Exception 
     { 
      //build ok use case scenario here - e.g. no exception should be raced ' 
      //Vegetable newCarrot = pool.GetItemByPropertyValue<Vegetable> ("WriongByPurpose", "Orange"); 
      //Assert.IsInstanceOfType (typeof (Vegetable), newCarrot); 
      //Assert.AreSame (newCarrot, carrot); 
      //logger.Info (" I got the newCarrot which is " + newCarrot.Color); 

     } //eof method 

    } //eof class 

} //eof namespace 





#region TheAppConfig 
/* 
<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="log4net" 
       type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 

    <log4net> 
     <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
      <param name="File" value="Program.log" /> 
      <param name="AppendToFile" value="true" /> 
      <layout type="log4net.Layout.PatternLayout"> 
     <!--<param name="Header" value="======================================" /> 
     <param name="Footer" value="======================================" />--> 
     <param name="ConversionPattern" value="%d [%t] %-5p - %m%n" /> 
     </layout> 
     </appender> 

     <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 
     <mapping> 
     <level value="ERROR" /> 
     <foreColor value="Red" /> 
     </mapping> 
     <mapping> 
     <level value="DEBUG" /> 
     <foreColor value="HighIntensity" /> 
     </mapping> 
     <mapping> 
     <level value="INFO" /> 
     <foreColor value="Green" /> 
     </mapping> 
     <mapping> 
     <level value="WARN" /> 
     <foreColor value="Yellow" /> 
     </mapping> 
     <mapping> 
     <level value="FATAL" /> 
     <foreColor value="White" /> 
     <backColor value="Red" /> 
     </mapping> 

     <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
      </layout> 
     </appender> 


     <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.2.10.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
      <connectionString value="data source=ysg;initial catalog=DBGA_DEV;integrated security=true;persist security info=True;" /> 
      <commandText value="INSERT INTO [DBGA_DEV].[ga].[tb_Data_Log] ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" /> 

      <parameter> 
       <parameterName value="@log_date" /> 
       <dbType value="DateTime" /> 
       <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'.'MM'.'dd HH':'mm':'ss'.'fff}" /> 
      </parameter> 
      <parameter> 
       <parameterName value="@thread" /> 
       <dbType value="String" /> 
       <size value="255" /> 
       <layout type="log4net.Layout.PatternLayout" value="%thread" /> 
      </parameter> 
     <parameter> 
     <parameterName value="@domainName" /> 
     <dbType value="String" /> 
     <size value="255" /> 
     <layout type="log4net.Layout.PatternLayout" value="%user" /> 
     </parameter> 
      <parameter> 
       <parameterName value="@log_level" /> 
       <dbType value="String" /> 
       <size value="50" /> 
       <layout type="log4net.Layout.PatternLayout" value="%level" /> 
      </parameter> 
      <parameter> 
       <parameterName value="@logger" /> 
       <dbType value="String" /> 
       <size value="255" /> 
       <layout type="log4net.Layout.PatternLayout" value="%logger" /> 
      </parameter> 
      <parameter> 
       <parameterName value="@message" /> 
       <dbType value="String" /> 
       <size value="4000" /> 
       <layout type="log4net.Layout.PatternLayout" value="%message" /> 
      </parameter> 
     </appender> 
     <root> 
      <level value="ALL" /> 
      <appender-ref ref="LogFileAppender" /> 
      <appender-ref ref="AdoNetAppender" /> 
      <appender-ref ref="ColoredConsoleAppender" /> 
     </root> 
    </log4net> 
</configuration> 
*/ 
#endregion TheAppconfig 

//this is the xml added replace here your log4net and Nunit paths 
//<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL"> 
     // <SpecificVersion>False</SpecificVersion> 
     // <HintPath>..\..\..\Log4Net\log4net-1.2.10\bin\net\2.0\release\log4net.dll</HintPath> 
     //</Reference> 
     //<Reference Include="nunit.framework, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" /> 
Problemi correlati