2010-04-23 3 views
0

Je dois montrer les 10 événements précédents lorsqu'un déclencheur particulier est déclenché. Le but est de montrer quelles étapes précédentes sont survenues immédiatement avant la journalisation de NHibernate.SQL.Comment puis-je récupérer les événements précédemment enregistrés lorsqu'un déclencheur particulier est déclenché?

Actuellement, je suis en train de journaliser NHibernate sql dans un fichier séparé - cela fonctionne correctement.

<appender name="NHibernateSqlAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="Logs\NHibernate.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10000KB" /> 
    <staticLogFileName value="true" /> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d{dd/MM/yy HH:mm:ss,fff} [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 

<logger name="NHibernate.SQL" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="NHibernateSqlAppender"/> 
</logger> 
<logger name="NHibernate" additivity="false"> 
    <level value="WARN"/> 
    <appender-ref ref="NHibernateSqlAppender"/> 
</logger> 

Mais cela ne génère que du SQL, sans contexte. Je voudrais tous les journaux précédents dans un espace de noms spécifié pour être également connecté, mais seulement lorsque l'appender HNibernate.SQL est déclenché.

J'ai étudié l'utilisation de BufferingForwardingAppender comme moyen de collecter tous les événements, puis de les filtrer dans NHibernateSqlAppender, mais cela ne fonctionne pas. J'ai lu à propos de la classe LoggerMatchFilter, qui semble aider, mais je ne sais pas trop où l'écrire.

<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" > 
    <bufferSize value="10" /> 
    <lossy value="true" /> 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="ALL"/> 
    </evaluator> 
    <appender-ref ref="NHibernateSqlAppender" /> 
</appender> 

<appender name="NHibernateSqlAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="Logs\NHibernate.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10000KB" /> 
    <staticLogFileName value="true" /> 

    <filter type="log4net.Filter.LoggerMatchFilter"> 
     <loggerToMatch value="NHibernate.SQL" /> 
     <loggerToMatch value="Laan" /> 
    </filter> 
    <filter type="log4net.Filter.LoggerMatchFilter"> 
     <loggerToMatch value="NHibernate" /> 
     <acceptOnMatch value="false"/> 
    </filter> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d{dd/MM/yy HH:mm:ss,fff} [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 

<root> 
    <level value="ALL" /> 
    <appender-ref ref="BufferingForwardingAppender"/> 
</root> 

L'idée est que appender tampon enregistre tous les événements, mais le NHibernateSqlAppender ne videra quand un événement se déclenche NHibernate.SQL, , plus il videra le tampon (de 10 articles précédents, dans le spécifié niveau de l'enregistreur, qui dans cet exemple est Laan. *).

Répondre

1

Je mettrais en œuvre ITriggeringEventEvaluator qui renvoie true dans la méthode IsTriggeringEvent() lorsqu'un certain enregistreur (idéalement configurable) se déclenche. Jetez un oeil à la mise en œuvre de la classe LevelEvaluator, il devrait être assez facile. Le code ressemblerait à ceci:

public bool IsTriggeringEvent(LoggingEvent loggingEvent) 
{ 
    if (loggingEvent == null) 
    { 
     throw new ArgumentNullException("loggingEvent"); 
} 

    return (loggingEvent.LoggerName == triggeringLoggerName); 
} 

Avec cette nouvelle configuration évaluateur devrait fonctionner si vous devez supprimer les filtres (je suppose).

Questions connexes