Ich habe mir RFC5424 angesehen , um den formal angegebenen Marker zu finden, der ein Syslog-Ereignis beendet.
Leider konnte ich es nicht finden. Wenn ich also einen kleinen Syslog-Server implementieren wollte, der auf bestimmte Nachrichten reagiert, was ist der Marker, der eine Nachricht beendet (ja, normalerweise ist ein Ereignis eine einzelne Zeile, aber ich konnte es in der Spezifikation einfach nicht finden).
Klarstellung :
Ich nenne es Ereignis, weil ich eine Nachricht einer einzelnen Zeile zuordne. Ein Ereignis könnte möglicherweise so etwas wie sein
Type: foo
Source: webservers
Eine Botschaft an mich lautet:
Type: foo Source: webservers
http://tools.ietf.org/html/rfc5424#section-6 definiert:
SYSLOG-MSG = HEADER SP STRUCTURED-DATA [SP MSG]
weder STRUCTURED-DATA
noch MSG
sagen Sie mir, wie diese Felder enden. Insbesondere MSG
wird definiert, MSG-ANY / MSG-UTF8
was sich auf praktisch alles ausdehnt. Es gibt nichts, was besagt, dass eine neue Zeile das Ende markiert (oder ein 8
oder ein a
für diese Angelegenheit). Anhand der Beispielnachrichten (Abschnitt 6.5):
Dies ist eine gültige Nachricht oder zwei gültige Nachrichten, je nachdem, ob Sie sagen, dass ein HEADER
Element in keinem MSG
Element vorkommen darf :
buchstäbliche Leerzeichen
<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 - <34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47
|
is this an end marker?
\t
steht für eine Registerkarte
<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 -\t<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47
|
is this an end marker?
\n
steht für eine Newline
<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47 -\n<34>1 2003-10-11T22:14:15.003Z mymachine.example.com su - ID47
|
is this an end marker?
Entweder habe ich den RFC falsch verstanden oder es wird einfach nichts erwähnt. Die im RFC angegebenen Größen geben nur an, mit welcher Mindestlänge ich arbeiten kann ...
ANTWORTEN? : Anscheinend habe ich den falschen RFC gelesen. Man muss die spezifischen Transport-RFCs gehen und sich daran halten http://tools.ietf.org/html/rfc5426#section-3.1 alles für den UDP-Transport sagt.
@joechip: Da Ihre Kommentare und Antworten dazu führen, dass ich tatsächlich ein bisschen mehr in den Transport-RFCs lese, werde ich Ihre Antwort gerne akzeptieren, wenn Sie sie ein bisschen in diese Richtung aktualisieren :)
]
aber ein\n
könnte innerhalbPARAM-VALUE
eines seinSD-ELEMENT
Antworten:
Was meinst du mit "Syslog-Ereignis"? Wenn Sie sich auf Syslog-Nachrichten beziehen, definiert RFC5424 die Syslog-Nachrichtensyntax in Abschnitt 6 eindeutig so, wie sie von einer Syslog-Anwendung zu einer anderen übertragen werden soll.
Wenn Sie sich darauf beziehen, wie sie von der empfangenden Syslog-Anwendung in den Protokolldateien gespeichert werden, trennen typische Syslog-Implementierungen einfach einen Datensatz mit Zeilenumbrüchen von einem anderen, und dies ist normalerweise kein konfigurierbares Verhalten. Darüber hinaus kann das Textfeld eines Syslog-Datensatzes auch Zeilenumbrüche enthalten, was die korrekte Analyse der Protokolldatei erschwert. Es kann normalerweise trotzdem analysiert werden, da jeder Syslog-Datensatz mit der üblichen Reihenfolge von Datum, Uhrzeit, Host und Tag beginnt, während auf Zeilenumbrüche in einem Syslog-Datensatz normalerweise kein ähnlicher Text folgt.
Ich denke, dass die Möglichkeit, das Syslog-Trennzeichen für gespeicherte Datensätze zu ändern, eine nützliche Funktion wäre, aber das Auftreten eines solchen Trennzeichens im Datensatz selbst sollte vermieden werden, damit dies nützlich ist. Das Hinzufügen von so viel Struktur zu einer Nur-Text-Datei ist ein Kompromiss. Wenn Sie sich für dieses Problem interessieren, sollten Sie möglicherweise das Schreiben in Protokolldateien in einem genau definierten Binärformat unterstützen (z. B. könnte SQLite hier hilfreich sein).
Bearbeiten: Eine genauere Untersuchung von RFC5424 Abschnitt 6 zeigt, dass eine Syslog-Nachricht zwei Formen haben kann:
oder
Durch Erweitern der ABNF-Spezifikation können wir leicht erkennen, dass die erste Form entweder mit "-" oder "]" endet. Vor diesem letzten Zeichen können andere "-" und "]" Zeichen stehen, sodass es nicht für einen Syslog-Nachrichtenterminator verwendet werden kann.
Das Ende der zweiten Form hängt davon ab, wie MSG endet. MSG kann entweder eine UTF-8-Zeichenfolge (wie in RFC 3629 angegeben, die keine Zeichenfolgenbeendigung enthält) oder ein beliebiger Oktettstrom sein, der mit einem beliebigen Wert endet. Offensichtlich ist auch für dieses Formular kein solches Beendigungssymbol angegeben.
Tatsache ist jedoch, dass kein Syslog-Nachrichtenterminator erforderlich ist, unabhängig davon, in welcher Form er vorliegt, da die Nachrichtenlänge von der Transportschicht außerhalb des Bandes übertragen wird. Wenn das UDP-Paket von der Anwendung gesendet wird, muss die Syslog-Nachricht bereits gemäß Spezifikation vorbereitet und in einem Puffer gespeichert sein. Dieser Puffer wird von der Anwendung an eine Funktion oder Methode übergeben, um ihn zu senden, und die Anzahl der zu sendenden Bytes wird ebenfalls übergeben. Zum Beispiel haben wir in C:
In diesem Beispiel ist len die Anzahl der Bytes, die aus dem Puffer-Puffer entnommen und an den Remote-Host gesendet werden sollen.
Ebenso wird auf dem Syslog-Server eine andere Funktion oder Methode aufgerufen, wie diese:
Diese Funktion gibt die Länge der im Puffer buf empfangenen UDP-Nutzdaten in Byte zurück . Wenn die Anwendung versucht, mehr als diese zurückgegebene Länge zu lesen, wird Müll (oder ein Segmentierungsfehler) ausgegeben. Um ein Überschreiten dieser Grenze zu vermeiden, wird normalerweise direkt nach dem Aufruf von siz = recvfrom (...) ein NULL-Wert an Position buf [siz] gesetzt . Auf diese Weise kann jeder spätere Funktionsaufruf, der buf verwendet als Zeichenfolge verwendet, ordnungsgemäß. Diese Nullterminierung gilt natürlich nur für Zeichenfolgen und nicht für Oktett-Streams. Und dieser Nullwert wird, wie gesagt, normalerweise nicht über das Netzwerk übertragen, sondern nur von der empfangenden Anwendung hinzugefügt.
Im Fall des Syslog-Servers als empfangende Anwendung fügen die meisten Syslog-Server diese Nullterminierung möglicherweise für ihre interne Behandlung der empfangenen Zeichenfolge hinzu (wenn sie diese überhaupt als Zeichenfolge behandeln). In jedem Fall bleibt dieser Nullwert jedoch erhalten out, wenn die Zeichenfolge an die Protokolldatei angehängt wird, um die Textverarbeitung der gesamten Protokolldatei nicht zu stören.
quelle
In Abschnitt 6.1 definieren sie eine Nachrichtenlänge. Ich würde mir vorstellen, dass wenn Sie die vollständige Nachricht erhalten, Sie den Header und die Daten haben und sich diese Länge summieren würde.
Darüber hinaus sehe ich dort keine Möglichkeit für mehrere Nachrichten. Ich würde mir also vorstellen, dass jede Nachricht ein Ereignis ist. Es gibt keine Mehrnachrichtenverfolgung jeglicher Art und keine spezifizierte Codierung für Start-, Mittel- und Endnachrichten. Syslog verfolgt protokollierte Nachrichten und verfügt nicht über ein übergeordnetes Ereigniskonzept.
quelle