Configurer Log4net pour écrire dans plusieurs fichiers

130

Je voudrais écrire le journal dans 2 fichiers journaux différents du même processus.

est-ce possible de faire avec log4net?

J'aurai besoin d'écrire des messages séparés dans chaque fichier journal. comment puis-je écrire un message à un appender spécifique?

ofer
la source
3
Vous ne pouvez pas vous connecter à des appenders distincts - vous devez configurer différents enregistreurs et attacher l'appender approprié à chacun. Ensuite, enregistrez différents messages aux différents enregistreurs.
Vinay Sajip
Voici comment je l'ai fait avec le code en tant que configuration: stackoverflow.com/questions/27846157/…
Jay Sullivan

Réponses:

82

Oui, ajoutez simplement plusieurs FileAppenders à votre enregistreur. Par exemple:

<log4net>
    <appender name="File1Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-1.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>
    <appender name="File2Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-2.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="File1Appender" />
        <appender-ref ref="File2Appender" />
    </root>
</log4net>
Vinay Sajip
la source
5
Bien .. :) cependant, je devrai écrire des messages séparés dans chaque fichier journal. comment puis-je écrire un message à un appender spécifique? Merci. ofer
ofer le
2
@ ofer- voir ma réponse sur la façon de faire cela.
RichardOD
1
Que faire si vous voulez que File1Appender enregistre les erreurs DEBUG et File2Appender enregistre les erreurs ERROR?
JsonStatham
J'essaye de réaliser des choses similaires. Je serais heureux si vous pouviez répondre à ma question: stackoverflow.com/questions/24886364/…
Ashish Charan
202

Ces réponses ont été utiles, mais je voulais partager ma réponse avec la partie app.config et la partie code c #, donc il y a moins de devinettes pour la personne suivante.

<log4net>
  <appender name="SomeName" type="log4net.Appender.RollingFileAppender">
    <file value="c:/Console.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1MB" />
  </appender>
  <appender name="Summary" type="log4net.Appender.FileAppender">
    <file value="SummaryFile.log" />
    <appendToFile value="true" />
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="SomeName" />
  </root>
  <logger additivity="false" name="Summary">
    <level value="DEBUG"/>
    <appender-ref ref="Summary" />
  </logger>
</log4net>

Puis dans le code:

ILog Log = LogManager.GetLogger("SomeName");
ILog SummaryLog = LogManager.GetLogger("Summary");
Log.DebugFormat("Processing");
SummaryLog.DebugFormat("Processing2"));

Ici c: /Console.txt contiendra "Processing" ... et \ SummaryFile.log contiendra "Processing2"

Gary
la source
58
Je voulais juste attirer l'attention sur l'attribut additivity = "false" sur l'enregistreur qui empêche tout d'être connecté à la racine.
Jason Hernandez
1
Ceci est un excellent exemple de la puissance de log4net. Merci!
écraser
5
La configuration ci-dessus est manquante <layout> ... </layout>, sans elle, je n'ai vu aucun message dans le fichier journal.
CrnaStena
@CrnaStena Êtes-vous sûr que c'est le seul changement que vous avez effectué?
Gary
1
@Craig Voir cette question pour en savoir plus sur son utilisation: stackoverflow.com/questions/1999382/…
Gary
60

Vinay a raison. En réponse à votre commentaire dans sa réponse, une façon de le faire est la suivante:

<root>
    <level value="ALL" />
    <appender-ref ref="File1Appender" />
</root>
<logger name="SomeName">
    <level value="ALL" />
    <appender-ref ref="File1Appender2" />
</logger>

C'est ainsi que je l'ai fait dans le passé. Ensuite, quelque chose comme ceci pour l'autre journal:

private static readonly ILog otherLog = LogManager.GetLogger("SomeName");

Et vous pouvez obtenir votre enregistreur normal comme suit:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Lisez la section Loggers and Appenders de la documentation pour comprendre comment cela fonctionne.

RichardOD
la source
3
J'ai cette même configuration dans l'une de mes applications et cela ne fonctionne pas pour moi :(
Román
1
Cette discussion est très ancienne ... j'espère que vous pourrez répondre ... J'ai essayé votre approche mais les deux enregistreurs enregistrent les mêmes messages. Comme dans log.Info ("") et otherLog.Info ("") écrivent des messages dans les deux fichiers journaux simultanément.
SutharMonil
1
@daniel_aren Oui, ce que j'ai fait, c'est d'avoir utilisé le bloc appender pour créer deux appenders avec des chemins de fichiers séparés (tout comme celui ci-dessus) .... donc effectivement, nous avons deux blocs appender avec des noms: fileappender1 et fileappender2 ... .
SutharMonil
1
@SutharMonil ajoute simplement 'additivity = "false" au nœud de l'enregistreur, comme dans la réponse de Gary et mis en évidence par Jason Hernandez. Dans ce cas, il mettra toujours tous les messages à la racine, mais seuls les messages de otherLog.Info ("") apparaîtront dans File1Appender2
Freedomn-m
De loin la réponse la plus précise.
Fabricio
41

Je voulais enregistrer tous les messages dans l'enregistreur racine et avoir un journal séparé avec les erreurs, voici comment cela peut être fait:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="allMessages.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
    </appender>

    <appender name="ErrorsFileAppender" type="log4net.Appender.FileAppender">
        <file value="errorsLog.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="ERROR" />
            <levelMax value="FATAL" />
        </filter>
    </appender>

    <root>
        <level value="ALL" />
        <appender-ref ref="FileAppender" />
        <appender-ref ref="ErrorsFileAppender" />
    </root>
</log4net>

Notez l'utilisation d'un élément filtrant.

Valentin Kuzub
la source
0

Utilisez la configuration XML ci-dessous pour configurer les journaux dans deux fichiers ou plus,

<log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">           
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
     <appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log1.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">        
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
     <logger additivity="false" name="RollingLogFileAppender2">
    <level value="All"/>
    <appender-ref ref="RollingLogFileAppender2" />
    </logger>
  </log4net>

Au-dessus de la configuration XML se connecte dans deux fichiers différents.

Pour obtenir une instance spécifique de l'enregistreur par programme,

ILog logger = log4net.LogManager.GetLogger ("RollingLogFileAppender2");

Vous pouvez ajouter deux ou plusieurs éléments appender à l'intérieur de l'élément racine log4net pour vous connecter à plusieurs fichiers.

Plus d'informations sur la structure de configuration XML ci-dessus ou quel appender est le mieux pour votre application, lisez les détails du lien ci-dessous,

https://logging.apache.org/log4net/release/manual/configuration.html https://logging.apache.org/log4net/release/sdk/index.html

J'espère que cela aidera.

Rakesh Chaudhari
la source