2010-01-16 13 views
24

Próbuję utworzyć rozwiązanie rejestrowania obejmujące wiele procesów na wielu komputerach. Planowałem użycie UDPAppendera do wysyłania wszystkich komunikatów dziennika na jeden komputer, który nimi zarządzał. Mam kilka pytań dotyczących wzorców paskowych i wzorcowych.informacje o identyfikatorze procesu log4net

Ponieważ muszę znać zarówno maszynę, jak i proces, z którego pochodzi wiadomość, chcę ją również uwzględnić w dzienniku. Znalazłem% property {log4net: HostName} dla nazwy hosta, a to działa świetnie. Jednak nie widzę niczego dla identyfikatora procesu w PatternLayouts. Oczywiście widzę coś takiego w PatternString. Z FAQ:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
    <file type="log4net.Util.PatternString" value="log-file-[%processid].txt" /> 

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

Ale nie jestem pewien, czy i jak łączyć ze sobą dwóch (lub nawet jeśli jest to kanoniczny sposób to zrobić).

Więc moje pytania to:

  1. Jaka jest różnica między PatternString i PatternLayout? Dlaczego oba?

  2. Widzę% processid w PatternString, jak uzyskać to samo w PatternLayout? Oto mój układ testowy:

    <layout type="log4net.Layout.PatternLayout"> 
        <conversionPattern value="%date [%thread] [%property{log4net:HostName}] %-5level %logger - %message%newline" /> 
    </layout> 
    
  3. Wreszcie, ma sens korzystania z układu XML dla appender UDP. Wygląda na to, że XmlLayoutSchemaLog4j dodaje już właściwość HostNameProperty do komunikatu XML. Jeśli nie chcę dodać tego nowego identyfikatora procesu (i być może nazwy procesu) do komunikatu XML, jaki jest najlepszy sposób na zrobienie tego? Czy powinienem po prostu skopiować plik src \ Layouts \ XmlLayoutSchemaLog4j.cs, zmodyfikować go i powiadomić log4net, że utworzyłem ten nowy układ (jak SampleLayoutsApp)?

Dzięki za pomoc

Odpowiedz

39

Możesz dodać dowolne właściwości do Globalnego Kontekstu.Używam tego kontekstu przechowywać identyfikator procesu, tak:

log4net.GlobalContext.Properties["pid"] = Process.GetCurrentProcess().Id; 

Następnie odwołać tę właściwość z appender stosując regularny wzór, jak to:

<layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date %property{pid} %level %logger - %message%newline" /> 
</layout> 

Można dodać dowolną liczbę właściwości jak chcesz, ale ze względu na jego globalny charakter, działa najlepiej w przypadku właściwości, które nie zmieniają się podczas wykonywania aplikacji.

+0

próbowałem wszystkiego% PID% ProcessID i wiele więcej, nic nie działało. Twoje rozwiązanie działa. Dzięki. – Nemo

3

Widocznie PatternString mogą być wykorzystywane wyłącznie do tworzenia nazw dziennika (czyli nazwy plików itd.), Natomiast układ pozwala formatować rzeczywiste wiadomość, że dostaje w dzienniku. Jeśli nie ma wbudowanego wzorca dla identyfikatora procesu w układzie procesu, możesz go łatwo dodać. To znacznie prostsze niż stworzenie całego układu.

Oto jak to zrobić:

Stwórz własną przetwornicę niestandardowy wzór (przykład poniżej próbuje uzyskać nazwę aplikacji, bez względu wygrać lub www):

internal sealed class ApplicationNamePatternConverter : PatternLayoutConverter 
{ 
    /// <summary> 
    /// Write the event application name to the output 
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) 
    { 
     string name = string.Empty; 
     if(System.Web.HttpContext.Current != null) 
     { 
      string[] applicationPath = System.Web.HttpContext.Current.Request.ApplicationPath.Split('/'); 
      name = applicationPath[applicationPath.Length - 1]; 
     } 
     else 
     { 
      if(System.Reflection.Assembly.GetEntryAssembly() != null) 
      { 
       name = System.Reflection.Assembly.GetEntryAssembly().GetName().Name; 
      } 
     } 
     writer.Write(name); 
    } 
} 

Dodaj wpis Twój konwerter do rejestru PatternLayout klasy

static PatternLayout() 
{ 
... 
    s_globalRulesRegistry.Add("ApplicationName", typeof(ApplicationNamePatternConverter)); 
} 

teraz można użyć %ApplicationName wartości PatternLayout aby uzyskać to, czego potrzebują.

Zalecam, aby nie używać układu XmlLayoutSchemaLog4j, ponieważ jest on bardzo ciężki i może obniżać wydajność aplikacji, jeśli jest często używany.

15

Można karmić PatternString w PatternLayout:

<layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern type="log4net.Util.PatternString" value="%processid" /> 
    </layout> 
+0

To faktycznie zadziałało. Dzięki. –

+3

Pamiętaj, aby unikać znaku procentu dla właściwości, które chcesz wyodrębnić ze zdarzenia, np. do włączenia identyfikatora procesu jako jednego z plików dziennika kolumny – Pelle

Powiązane problemy