2009-04-24 13 views
2

Wie sollte ich am besten eine zentrale Protokollierung (oder vielleicht 2, jeweils exklusiv für Test oder Prod) Server einrichten:Wie richte ich einen zentralen Logging-Server ein und teile Logging-Ereignisse von Test und Produktion?

Ich muss mir keine Gedanken über den Code machen, der auf Bedingungen verweist, die versehentlich Prod Fehler in den Produktionsfehler log4j Bus. Mit anderen Worten, möchte ich nicht den Code haben, wie:

if (!production) 
    logWrapper.logTest(error); 
else 
    logWrapper.logProd(error); 

ich das nicht will, weil es eng Paare etwas wie den Servernamen, Referenzen, und jetzt kann der Code arbeiten nur auf einem der zwei Servernamen: prod und test. Ich kann dies auch nicht deklarativ in einer Konfiguration festlegen, da ein Entwickler dies wahrscheinlich nicht korrekt festlegt und die Logging-Repositories verschmutzt. Irgendwelche Vorschläge?

ein paar Details, einige gehen, um in nicht-Faktor, aber ich Liste sie trotzdem:

  • nur Web-Anwendungen, läuft auf Oracle Application Server 10.1.3.4 jetzt und in Zukunft Oracle WebLogic
  • wird wie in diesem Beispiel ein zentraler Protokollserver verwendet: http://timarcher.com/?q=node/10 ... AUSSER dass der zentrale Server Textdateien protokolliert und keine E-Mails versendet!
  • Wird log4j verwenden und vielleicht wird es über slf4j gewickelt werden (die slf4j Art respektlos ist es zu erwähnen, zum größten Teil so ignorieren ..)

Antwort

0

Verwenden Sie verschiedene Protokollierungskonfigurationsdateien für die Produktion und Inszenierung.

Man könnte dies ein paar verschiedene Möglichkeiten,

1) Halten Sie in Ihrer Anwendung zwei verschiedene Konfigurationsdateien (eine für Bühne und eine für die Produktion tun) und haben Ihre Anwendung haben einige Startup-Code, verwenden die Konfigurationsdatei weiß zu basierend auf dem Rechner, auf dem er installiert ist, oder einer Einstellung in der Anwendungskonfigurationsdatei, die eine Umgebungseinstellung festlegt.

2) Einfach eine Datei haben, aber beim Testen oder in der Produktion mit der entsprechenden Datei austauschen.

0

Ich glaube wirklich, dass Sie dies in einer Konfiguration einstellen müssen. Es ist eine richtige Entscheidung.

+0

Dann muss man vor Ort sein überprüfen und sicherstellen, dass die Config nie falsch eingestellt ... – Zombies

2

Ohne viele Details über Ihre Umgebung ist es schwierig, eine spezifische Antwort zu geben. Wenn ich jedoch die Protokollierung für die Verwaltung mehrerer Umgebungen eingerichtet habe, ist dies der Ansatz, den ich wählen würde.

1) Anwendungen sollten sich nicht um Protokollierung kümmern. Erstellen

logger.warn("message", error); 

2) ein log4j (oder was auch immer Logging-Framework) Konfiguration der Protokollierung zu konfigurieren: Zum Beispiel soll die folgende in allen Umgebungen arbeiten. Dies kann auf zwei Arten geschehen. Die erste Möglichkeit besteht darin, test_log4j. {Xml, properties}, prod_log4j. {Xml, properties} usw. pro Umgebung zu erstellen. Dies hält die Konfiguration für jede Umgebung sehr einfach und das Hinzufügen einer neuen Umgebung ist nur das Hinzufügen einer neuen Datei. Die Alternative besteht darin, ein log4j. {Xml, properties} zu erstellen und die ant style-Eigenschaftsersetzung zu verwenden, um die entsprechenden Werte pro Umgebung einzufügen. Die Eigenschaftswerte können aus umgebungsspezifischen Eigenschaftendateien oder aus an die JVM übergebenen -DKey = Wertargumenten abgerufen werden.Dies ist eher der DRY-Konfigurationsstil, wenn man annimmt, dass die Konfiguration für jede Umgebung ziemlich ähnlich ist. Als Beispiel eine Protokollebene zwischen den Umgebungen zu ändern:

<logger name="my.example"> 
    <level value="${my.example.level}"/> 
</logger> 

3) ein Startskript erstellen, das der Umwelt (wahrscheinlich auf der Maschine oder eine Datei auf der Maschine basierend bestimmt) und lädt dann die richtige Konfiguration. Dies kann entweder die richtige log4j-Konfiguration, korrekte Eigenschaftendateien oder korrekte -Dkey = value-Argumente sein.

1

Sie haben nicht erwähnt, welche RDBMS Sie verwenden. Wenn Sie Oracle verwenden, können Sie die Funktion SYS_CONTEXT() verwenden, um den Datenbanknamen abzurufen. Von dort aus können Sie feststellen, ob Sie in Produktion sind/dev/qa/test/etc.

Here's a nice article on sys_context()

+0

Dies ist ein guter Vorschlag zu sein scheint. – Zombies

1

Dieses besondere Problem wird in logFaces in der Tat angesprochen, es ist eines der wichtigsten Probleme, die es Design zu lösen war - zu zentralisieren und Lügen Überschwemmungen zu reduzieren. In Ihrer Anwendungskonfiguration Sie geben den Anwendungsnamen an, z. B. "Meine Produktionsanwendung". Alle Protokollanweisungen aus der Anwendung fließen dann in den zentralen Protokollserver ein und stehen im Speicher für Abfragen und in Echtzeit zur Verfügung. Sie ändern Ihren Code nicht, es ist nur eine Frage der Konfiguration. Normalerweise haben wir mehrere Instanzen der gleichen Anwendung in der Entwicklung und mehrere Versionen in QA, jeder Entwickler kann seinen Zuschauer einstellen, um zu holen, was auf anderen geschieht. Ich beobachte oft QA-Hosts und weiß, dass es ein Problem gibt, bevor sie es überhaupt bemerken. Ein anderes interessantes Szenario ist, wenn Sie sehen möchten, was in allen Anwendungen gleichzeitig vor sich geht, sondern nur auf Datenebene.

Offenlegung: Ich bin der Autor dieses Produkts.

+1

Was passiert, wenn ein Entwickler diese Datei nicht korrekt konfiguriert? Werden Sie dann nicht die Glaubwürdigkeit Ihrer Log-Dateien durcheinander bringen? IE: Ein Fehler scheint in der Produktion aufgetreten zu sein, aber es ist nicht sicher, ob es wirklich in Prod war oder nur eine falsch konfigurierte Test-Konfigurationsdatei, die auf die Prod-Protokolldateien zeigt. – Zombies

+0

Tatsächlich werden keine Protokolldateien gespeichert oder gespeichert. Protokolldateien können jederzeit von jedem erstellt werden, indem nur übereinstimmende Kriterien angegeben werden. Zum Beispiel können Sie eine Protokolldatei ziehen, die letzten Sonntag und bezogen auf den Anwendungsnamen "Meine Produktion" und nur geworfene Ausnahmen von der Datenschicht enthalten. Es ist möglich, aber relativ schwer, die Konfiguration zu vermasseln, da sie unglaublich einfach ist. Sie müssen der Instanz der Anwendung nur einen Namen geben, indem Sie den Protokollserver verwenden. Es ist eine ziemlich direkte Eigenschaft. – Dima

+0

Müssen Sie den App-Namen nicht von "Mein Test" zu "Mein Qa" und zu "Meine Produktion" für die gleiche App umkonfigurieren? – Zombies

0

mattkemp so ziemlich genagelt. Die eine Sache, die ich hinzufügen könnte, ist, dass der entscheidende Unterschied zwischen Produktion und Test darin besteht, dass die Test-Version wahrscheinlich Debug-Logging permanent aktiv hat, während man in Prod nur das Debug-Logging bei seltenen Gelegenheiten von merkwürdigem Verhalten aktiviert .

Ansonsten würde ich zumindest mit den gleichen Arten von Protokolleinträgen aus Test und Produktion rechnen, da alles, was während des Tests passieren kann, auch während der Produktion passieren kann (und wird).

Wenn es um die Server-Setup selbst geht, würde ich sagen, gehen Sie entweder für syslog oder Windows NT-Ereignisprotokoll mit dem entsprechenden log4j-Setup. Auf diese Weise können Sie auch andere Teile der Endsysteme auf demselben Protokollserver protokollieren. Ein gutes Logging-System würde dann anzeigen, auf welchem ​​Server das Ereignis generiert wurde, also sollte ziemlich klar sein, ob das Ereignis von Prod oder Testing kam.

Für einen guten Web-basierten syslog gui, können Sie http://www.phplogcon.org/