protected override void Append(LoggingEvent loggingEvent)
        {
            try
            {
                var syslogMessage = new SysLogMessage
                {
                    Priority = GeneratePriority(Facility, GetSeverity(loggingEvent.Level)),
                    Header   = new SysLogHeader
                    {
                        TimeStamp = DateTime.Now,
                        HostName  = CalculateHostName(Identity, loggingEvent)
                    },
                    Body = CalculateBody(loggingEvent),
                };

                List <SysLogMessage> packets = SplitLongMessagesAsNeeded(syslogMessage);

                foreach (SysLogMessage packet in packets)
                {
                    string packetContents = packet.AsUdpString();
                    Byte[] buffer         = Encoding.GetBytes(packetContents.ToCharArray());
                    Client.Send(buffer, buffer.Length, RemoteEndPoint);
                }
            }
            catch (Exception e)
            {
                ErrorHandler.Error(
                    "Unable to send logging event to remote syslog " +
                    RemoteAddress +
                    " on port " +
                    RemotePort + ".",
                    e,
                    ErrorCode.WriteFailure);
            }
        }
        public static List <SysLogMessage> SplitLongMessagesAsNeeded(SysLogMessage message)
        {
            const int maxUdpLength = 1000;

            if (message.AsUdpString().Length < maxUdpLength)
            {
                return new List <SysLogMessage> {
                           message
                }
            }
            ;

            const string splitBodySuffix     = " [SplitMessageID {0} part {1:000} of {2:000}]";
            string       messageGuidAsString = Guid.NewGuid().ToString("B").ToUpperInvariant();


            string sampleSuffix         = String.Format(splitBodySuffix, messageGuidAsString, 0, 0);
            int    bodyLengthPerMessage = maxUdpLength - message.PriAndHeaderLength - sampleSuffix.Length;

            if (bodyLengthPerMessage < 0)
            {
                throw new ArgumentException("Cannot log message with splitting because header is longer than message length.");
            }
            var numberOfSplits = (int)Math.Ceiling((double)message.Body.Length / bodyLengthPerMessage);

            var messages = new List <SysLogMessage>();

            for (int i = 0; i < numberOfSplits; ++i)
            {
                int startingIndex = i * bodyLengthPerMessage;

                int lengthOfFragment = Math.Min(bodyLengthPerMessage, message.Body.Length - startingIndex);

                string pieceOfOriginalBody = message.Body.Substring(startingIndex, lengthOfFragment);
                string splitMessageMarker  = string.Format(splitBodySuffix, messageGuidAsString, i + 1, numberOfSplits);
                string bodyFragment        = String.Format("{0}{1}", pieceOfOriginalBody, splitMessageMarker);

                var messageFragment = new SysLogMessage(message)
                {
                    Body = bodyFragment
                };

                messages.Add(messageFragment);
            }

            return(messages);
        }
 public SysLogMessage(SysLogMessage message)
 {
     Body     = message.Body;
     Priority = message.Priority;
     Header   = message.Header;
 }