Tutorial: Equilibrio de carga de mensajes syslog mediante extensiones de protocolo
El protocolo Syslog disponible en el dispositivo Citrix ADC solo funciona para los mensajes generados en el dispositivo Citrix ADC. No equilibra la carga los mensajes procedentes de nodos externos. Para equilibrar la carga de dichos mensajes, debe utilizar la función de extensiones de protocolo y escribir la lógica de análisis de mensajes syslog mediante el lenguaje de programación Lua 5.2.
Código para analizar el mensaje syslog
El código solo tiene definida la función de devolución de llamada de datos del cliente TCP: Client.on_data (). Para los datos del servidor, no agrega una función de devolución de llamada y el servidor al cliente toma la ruta nativa rápida. El código identifica el límite del mensaje en función del carácter final. Si el paquete TCP contiene más de un mensaje syslog, entonces dividimos el paquete en función del carácter final y el equilibrio de carga de cada mensaje.
--[[
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
<!--NeedCopy-->