2009-06-17 16 views
7

Mam trudności ze znalezieniem dokumentacji na różne „w polu” wzorców jakCzy istnieje wzór log4net dla MachineName

%logger 
%level 
%timestamp 

Istnieje oczywiście the example page ale nie jestem pewien, że jest pełny lista opcji.

Wiem również, że możliwe jest usunięcie parametrów MDC z aplikacji do rejestratora, ale wiąże się to ze zmianą kodu będącą inną bestią niż zmiana konfiguracji.

Czy dostępna jest opcja %machineName lub machineIP? Problem polega na tym, że wszystkie nasze serwery znajdują się w dzienniku farmy sieciowej w tym samym dzienniku bazy danych, a teraz myślimy, że nieproporcjonalnie duża liczba wiadomości pochodzi z jednego komputera.

Odpowiedz

2

Zapoznaj się z PatternString API, wygląda na to, że musisz użyć właściwości% we wzorcu. Spójrz również na numer this article, może być konieczne wprowadzenie nazwy komputera do globalnego kontekstu podczas uruchamiania aplikacji.

+0

@AgileJon - ten artykuł był dokładnie tym, czego szukałem! Dziękuję Ci!!! –

10
%property{log4net:HostName} 
11

co zrobiłem po prostu natknąć jest

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

i że wydaje się działać --- zastanawiać, jaka jest różnica między tym i innych opcji sugerowanych. jak %property{log4net:HostName}

+1

$ {...} zależy od zmiennych środowiskowych. –

+1

, który działa na wszystkich maszynach z systemem Windows, na których próbowałem. Bardzo pomocne! –

+0

Podoba mi się, dlaczego wziąć zależność od niestandardowej klasy, jeśli nie musisz? –

3

utworzyć klasę, która otrzyma nazwę maszyny:

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);    
     } 
    } 
} 

a następnie ustaw log4net konfiguracja taka jak ta:

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

Podoba mi się to podejście, ponieważ może być ponownie wykorzystane i mogę zarządzać informacjami, jak chcę . Jeśli chcesz się zalogować adres ip na przykład, po prostu zrobić to samo i stworzyć konwertera tak:

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); 
    } 
} 

Więcej informacji na link: http://devstuffs.wordpress.com/2012/01/12/creating-your-own-pattern-layout-converter-for-log4net/

2

Stosując tę ​​odpowiedź https://stackoverflow.com/a/2096452/1224858 o dodawaniu właściwości GlobalContext, ja udało się to uruchomić.

I dodaje następujący kod w moim pliku klasy:

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

A potem w pliku konfiguracyjnym można odwołać hosta i pojawi

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

nadzieję, że to pomaga.