More .NET libraries
-
Rebex Total Pack
All Rebex .NET libraries together
Back to feature list...
Syslog server
On this page:
Launching syslog server
Launching a syslog server consists of these steps:
- Bind the server to an endpoint.
- Register
MessageReceived
event to get notified about received messages. - Register
ErrorOccurred
event to get notified about errors. - Start the server.
// create a SyslogServer instance var server = new SyslogServer(); // bind endpoints server.Bind(SyslogServer.DefaultPort, SyslogTransportProtocol.Udp); server.Bind(SyslogServer.DefaultPort, SyslogTransportProtocol.Tcp); // register an event handler for received messages server.MessageReceived += (s, e) => { Console.WriteLine("Message from {0}: {1}", e.RemoteEndPoint, e.Message.Text); }; // register an event handler for errors server.ErrorOccurred += (s, e) => { Console.WriteLine("Error occurred ({0}): {1}", e.RemoteEndPoint, e.Error); }; // start the server server.Start();
' create a SyslogServer instance Dim server = New SyslogServer() ' bind endpoints server.Bind(SyslogServer.DefaultPort, SyslogTransportProtocol.Udp) server.Bind(SyslogServer.DefaultPort, SyslogTransportProtocol.Tcp) ' register an event handler for received messages AddHandler server.MessageReceived, Sub(s, e) Console.WriteLine("Message from {0}: {1}", e.RemoteEndPoint, e.Message.Text) ' register an event handler for errors AddHandler server.ErrorOccurred, Sub(s, e) Console.WriteLine("Error occurred ({0}): {1}", e.RemoteEndPoint, e.Error) ' start the server server.Start()
Processing received messages
The MessageReceived
event is not raised asynchronously and blocks the receiver, which means
that it must process received messages as fast as possible.
Delaying the MessageReceived
handler for too long can lead to a loss of messages transmitted over UDP
and slow down TCP and TLS connections.
MessageReceived
events can occur simultaneously
when messages are received from multiple connections.
The following code shows how to use System.Collections.Concurrent.BlockingCollection
class to safely offload received messages for further processing:
// initialize new System.Collections.Concurrent.BlockingCollection var messageQueue = new BlockingCollection<SyslogMessageReceivedEventArgs>(); // process received messages as fast as possible server.MessageReceived += (s, e) => { // put message into queue for further processing messageQueue.Add(e); };
' initialize new System.Collections.Concurrent.BlockingCollection Dim messageQueue = New BlockingCollection(Of SyslogMessageReceivedEventArgs)() ' process received messages as fast as possible AddHandler server.MessageReceived, Sub(s, e) ' put message into queue for further processing messageQueue.Add(e) End Sub
A corresponding message processing loop might look like this:
// process received messages foreach (var args in messageQueue.GetConsumingEnumerable()) { Console.WriteLine("Message from {0}: {1}", args.RemoteEndPoint, args.Message.Text); }
' process received messages For Each args In messageQueue.GetConsumingEnumerable() Console.WriteLine("Message from {0}: {1}", args.RemoteEndPoint, args.Message.Text) Next
Connection options
Server bindings offer various options for customization.
For example, the default UDP receive buffer size (1 MB) can be increased:
// create UDP binding var binding = new SyslogBinding(SyslogServer.DefaultPort, SyslogTransportProtocol.Udp); // set UDP buffer size to 10 MB binding.UdpBufferSize = 10 * 1024 * 1024; // use the binding server.Bind(binding);
' create UDP binding Dim binding = New SyslogBinding(SyslogServer.DefaultPort, SyslogTransportProtocol.Udp) ' set UDP buffer size to 10 MB binding.UdpBufferSize = 10 * 1024 * 1024 ' use the binding server.Bind(binding)
Setting TLS for syslog server
Transmitting unecrypted syslog message over the Internet is usually not a good idea.
To configure the syslog server to use TLS, use Settings.TlsParameters
property.
At least the server certificate needs to be specified.
// create a SyslogServer instance, register events // ... // bind endpoint for TLS server.Bind(SyslogServer.DefaultTlsPort, SyslogTransportProtocol.Tls); // load a server certificate (must have private key associated) var certificate = CertificateChain.LoadPfx(serverCertPath, serverCertPassword); // specify the server certificate server.Settings.TlsParameters.Certificate = certificate; // start the server server.Start();
' create a SyslogServer instance, register events ' ... ' bind endpoint for TLS server.Bind(SyslogServer.DefaultTlsPort, SyslogTransportProtocol.Tls) ' load a server certificate (must have private key associated) Dim certificate = CertificateChain.LoadPfx(serverCertPath, serverCertPassword) ' specify the server certificate server.Settings.TlsParameters.Certificate = certificate ' start the server server.Start()
Back to feature list...