Lernprogramm - Lastenausgleich von Syslog-Nachrichten mithilfe von Protokollerweiterungen
Das auf der Citrix ADC Appliance verfügbare Syslog-Protokoll funktioniert nur für die Nachrichten, die auf der Citrix ADC-Appliance generiert werden. Es wird kein Lastausgleich der Nachrichten, die von externen Knoten kommen. Um solche Meldungen zu laden, müssen Sie die Protokollerweiterungsfunktion verwenden und die Syslog-Message-Parsing-Logik schreiben, indem Sie die Lua 5.2 Programmiersprache verwenden.
Code zum Analysieren von Syslog-Nachricht
Der Code hat nur die TCP-Clientdaten-Callback-Funktion definiert - client.on_data (). Für Serverdaten wird keine Callback-Funktion hinzugefügt, und der Server zum Client nimmt den schnellen nativen Pfad. Der Code identifiziert die Nachrichtengrenze basierend auf dem nachfolgenden Zeichen. Wenn das TCP-Paket mehr als eine Syslog-Nachrichten enthält, teilen wir das Paket basierend auf dem nachfolgenden Zeichen und Lastverteilung jeder Nachricht.
--[[ Syslog event handler for TCP client data ctxt - TCP client side App processing context. data - TCP Data stream received. --]] function client.on_data(ctxt, payload) local message = nil local data_len local data = payload.data local trailing_character = "\n" ::split_message:: -- Get the offset of trailing character local new_line_character_offset = data:find(trailing_character) -- If trailing character is not found, then wait for more data. if (not new_line_character_offset) then goto need_more_data end -- Get the length of the current message data_len = data:len() -- Check whether we have more than one message -- by comparing trailing character offset and -- current data length if (data_len > new_line_character_offset) then -- If we have more than one message, then split -- the data into two parts such that first part -- will contain message upto trailing character -- offset and second part will contain -- remaining message. message, data = data:split(new_line_character_offset) else message = data data = nil end -- Send the data to the backend server. ns.send(ctxt.output, "EOM", {data = message}) goto done ::need_more_data:: -- Wait for more data ctxt:hold(data) data = nil goto done ::done:: -- If we have more data to parse, -- then do parsing again. if (data) then goto split_message end end