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; }