public void Serialize(SysLog.Message message, Stream stream) { var priorityValue = CalculatePriorityValue(message.Facility, message.Severity); // Note: The .Net ISO 8601 "o" format string uses 7 decimal places for fractional second. Syslog spec only allows 6, hence the custom format string var timestamp = message.DateTimeOffset.HasValue ? message.DateTimeOffset.Value.ToString("yyyy-MM-ddTHH:mm:ss.ffffffK") : null; var messageBuilder = new StringBuilder(); messageBuilder.Append("<").Append(priorityValue).Append(">"); messageBuilder.Append(message.Version); messageBuilder.Append(" ").Append(timestamp.FormatSyslogField(NilValue)); messageBuilder.Append(" ").Append(message.HostName.FormatSyslogAsciiField(NilValue, 255, asciiCharsBuffer)); messageBuilder.Append(" ").Append(message.AppName.FormatSyslogAsciiField(NilValue, 48, asciiCharsBuffer)); messageBuilder.Append(" ").Append(message.ProcId.FormatSyslogAsciiField(NilValue, 128, asciiCharsBuffer)); messageBuilder.Append(" ").Append(message.MsgId.FormatSyslogAsciiField(NilValue, 32, asciiCharsBuffer)); writeStream(stream, Encoding.ASCII, messageBuilder.ToString()); // Structured data foreach(SysLog.StructuredDataElement sdElement in message.StructuredDataElements) { messageBuilder.Clear() .Append(" ") .Append("[") .Append(sdElement.SdId.FormatSyslogSdnameField(asciiCharsBuffer)); writeStream(stream, Encoding.ASCII, messageBuilder.ToString()); foreach(System.Collections.Generic.KeyValuePair<string, string> sdParam in sdElement.Parameters) { messageBuilder.Clear() .Append(" ") .Append(sdParam.Key.FormatSyslogSdnameField(asciiCharsBuffer)) .Append("=") .Append("\"") .Append( sdParam.Value != null ? sdParam.Value .Replace("\\", "\\\\") .Replace("\"", "\\\"") .Replace("]", "\\]") : String.Empty ) .Append("\""); writeStream(stream, Encoding.UTF8, messageBuilder.ToString()); } // ] stream.WriteByte(93); } if (!String.IsNullOrWhiteSpace(message.Data)) { // Space stream.WriteByte(32); stream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length); writeStream(stream, Encoding.UTF8, message.Data); } }
public void Send(SysLog.Message message, ISyslogMessageSerializer serializer) { byte[] datagramBytes = serializer.Serialize(message); udpClient.Send(datagramBytes, datagramBytes.Length); }
public void Serialize(SysLog.Message message, Stream stream) { var priorityValue = CalculatePriorityValue(message.Facility, message.Severity); string timestamp = null; if (message.DateTimeOffset.HasValue) { DateTimeOffset dt = message.DateTimeOffset.Value; timestamp = String.Format("{0} {1} {2}", Months[dt.Month-1], dt.Day < 10 ? " " + dt.Day : dt.Day.ToString(), dt.ToString("HH:mm:ss")); } var headerBuilder = new StringBuilder(); headerBuilder.Append("<").Append(priorityValue).Append(">"); headerBuilder.Append(timestamp).Append(" "); headerBuilder.Append(message.HostName).Append(" "); headerBuilder.Append(message.AppName).Append(": "); headerBuilder.Append(message.Data ?? ""); byte[] asciiBytes = Encoding.ASCII.GetBytes(headerBuilder.ToString()); stream.Write(asciiBytes, 0, asciiBytes.Length); }
public static byte[] Serialize(this ISyslogMessageSerializer serializer, SysLog.Message message) { byte[] datagramBytes; using (var stream = new MemoryStream()) { serializer.Serialize(message, stream); stream.Position = 0; datagramBytes = new byte[stream.Length]; stream.Read(datagramBytes, 0, (int)stream.Length); } return datagramBytes; }
protected static int CalculatePriorityValue(SysLog.Facility facility, SysLog.Severity severity) { return ((int)facility * 8) + (int)severity; }
public static void OpenSysLog(SysLog.Facility facility, string ServerAddr, int ServerPort = 514, bool useRfc5424 = false) { OpenSysLog(facility, null, ServerAddr, ServerPort, useRfc5424); }
public static void OpenSysLog(SysLog.Facility facility, string applicationName, string ServerAddr, int ServerPort = 514, bool useRfc5424 = false) { try { syslogFacility = facility; syslogMachineName = Environment.MachineName; if (String.IsNullOrEmpty(applicationName)) syslogApplicationName = System.AppDomain.CurrentDomain.FriendlyName; else syslogApplicationName = applicationName; syslogApplicationName += String.Format("[{0}]", Process.GetCurrentProcess().Id); if (useRfc5424) syslogSerializer = new SyslogRfc5424MessageSerializer(); else syslogSerializer = new SyslogRfc3164MessageSerializer(); syslogSender = new SyslogUdpSender(ServerAddr, ServerPort); } catch { } }