2009-06-17 3 views
7

Je vais avoir du mal à trouver de la documentation sur les différents « dans la boîte » modèles commeY at-il un modèle de log4net pour machineName

%logger 
%level 
%timestamp 

Il y a bien sûr the example page mais je ne suis pas sûr que ce soit la pleine liste d'options.

Je sais également que les paramètres MDC peuvent sortir de l'application vers l'enregistreur, mais cela implique un changement de code qui est une bête différente d'une modification de configuration. Y at-il une option %machineName ou machineIP? Le problème est que nous avons tous nos serveurs dans le journal de ferme Web dans le même journal de base de données, et nous pensons maintenant qu'un nombre disproportionné de messages proviennent d'une machine.

Répondre

2

Découvrez le PatternString API, il semblerait que vous ayez besoin d'utiliser% property dans votre modèle. Jetez également un coup d'oeil à this article, vous devrez peut-être injecter le nom de la machine dans le contexte global au démarrage de l'application.

+0

@AgileJon - cet article était exactement ce que je cherchais! Je vous remercie!!! –

10
%property{log4net:HostName} 
11

Ce que je ne tombe sur tout est

<layout type="log4net.Layout.PatternLayout" value="${COMPUTERNAME}"/> 

et qui semble fonctionner --- se demander quelle est la différence entre ce dernier et les autres options proposées. comme %property{log4net:HostName}

+1

$ {...} dépend des variables d'environnement. –

+1

qui fonctionne sur toutes les machines Windows sur lesquelles j'ai essayé. Très utile! –

+0

Je l'aime, pourquoi prendre une dépendance sur une classe personnalisée si vous n'avez pas à le faire? –

3

Créer une classe qui obtient le nom de la machine:

using System; 
using System.IO; 
using log4net.Layout.Pattern; 

namespace YourNameSpace.Converters 
{ 
    public class MachinePatternConverter : PatternLayoutConverter 
    { 
     protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent) 
     { 
      writer.Write(Environment.MachineName);    
     } 
    } 
} 

puis définissez votre log4net configuration comme ceci:

<layout type="log4net.Layout.PatternLayout"> 
    <converter> 
     <name value="machine" /> 
     <type value="YourNameSpace.MachinePatternConverter" /> 
    </converter> 
    <conversionPattern value="%date [%thread] %level %logger %machine" /> 
</layout> 

J'aime cette approche car elle peut être réutilisée et je peux gérer l'information comment je veux . Si vous voulez enregistrer l'adresse IP par exemple, faire la même chose et créer le convertisseur comme ceci:

public class IPPatternConverter : PatternLayoutConverter 
{ 
    protected override void Convert(TextWriter writer, log4net.Core.LoggingEvent loggingEvent) 
    { 
     if (HttpContext.Current == null) 
      return; 

     writer.Write(HttpContext.Current.Request.UserHostAddress); 
    } 
} 

Plus d'informations sur le lien: http://devstuffs.wordpress.com/2012/01/12/creating-your-own-pattern-layout-converter-for-log4net/

2

En utilisant cette réponse https://stackoverflow.com/a/2096452/1224858 sur l'ajout de propriétés GlobalContext, je était capable de faire fonctionner cela.

j'ai ajouté le code suivant dans mon fichier de classe:

log4net.GlobalContext.Properties["hostname"] = Environment.MachineName; 

Et puis dans le fichier de configuration que je peux faire référence à nom d'hôte et il apparaîtra

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

Hope this helps.

Questions connexes