// Copyright (C)2021-2023, Philip Munts dba Munts Technologies. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. using System; namespace IO.Objects.SimpleIO.syslog { /// /// Encapsulates system logging services using libsimpleio. /// /// An instance of this class can be used either standalone or /// as a System.Diagnostics.TraceListener. The static methods /// Systems.Diagnostics.Trace.Write() and /// Systems.Diagnostics.Trace.WriteIf() most naturally fit the /// Linux syslog facility. /// /// /// var log = new IO.Objects.SimpleIO.syslog.Logger(); /// log.Note("Hello, Syslog!"); /// /// System.Diagnostics.Trace.Listeners.Clear(); /// System.Diagnostics.Trace.Listeners.Add(log); /// System.Diagnostics.Trace.Write("Hello, Trace!"); /// /// public class Logger : System.Diagnostics.TraceListener { private readonly int severity; // syslog options (can be added together): /// /// Open the connection to the syslog service immediately. /// Recommended. /// public const int LOG_NDELAY = IO.Bindings.libsimpleio.LOG_NDELAY; /// /// Do not open the connection to the syslog service before /// logging the first message. Not recommended. /// public const int LOG_ODELAY = IO.Bindings.libsimpleio.LOG_NDELAY; /// /// Write message to both syslog service AND stderr. /// public const int LOG_PERROR = IO.Bindings.libsimpleio.LOG_PERROR; /// /// Prepend the caller's process ID to the message. /// public const int LOG_PID = IO.Bindings.libsimpleio.LOG_PID; // syslog facilities: /// /// Authentication facility. /// public const int LOG_AUTH = IO.Bindings.libsimpleio.LOG_AUTH; /// /// System daemon/background process facility. /// public const int LOG_DAEMON = IO.Bindings.libsimpleio.LOG_DAEMON; /// /// Mail subsystem facility. /// public const int LOG_MAIL = IO.Bindings.libsimpleio.LOG_MAIL; /// /// User program facility. Use LOG_LOCALx instead. /// public const int LOG_USER = IO.Bindings.libsimpleio.LOG_USER; /// /// Locally defined facility. /// public const int LOG_LOCAL0 = IO.Bindings.libsimpleio.LOG_LOCAL0; /// /// Locally defined facility. /// public const int LOG_LOCAL1 = IO.Bindings.libsimpleio.LOG_LOCAL1; /// /// Locally defined facility. /// public const int LOG_LOCAL2 = IO.Bindings.libsimpleio.LOG_LOCAL2; /// /// Locally defined facility. /// public const int LOG_LOCAL3 = IO.Bindings.libsimpleio.LOG_LOCAL3; /// /// Locally defined facility. /// public const int LOG_LOCAL4 = IO.Bindings.libsimpleio.LOG_LOCAL4; /// /// Locally defined facility. /// public const int LOG_LOCAL5 = IO.Bindings.libsimpleio.LOG_LOCAL5; /// /// Locally defined facility. /// public const int LOG_LOCAL6 = IO.Bindings.libsimpleio.LOG_LOCAL6; /// /// Locally defined facility. /// public const int LOG_LOCAL7 = IO.Bindings.libsimpleio.LOG_LOCAL7; // syslog severity levels /// /// Emergency condition message. /// public const int LOG_EMERG = IO.Bindings.libsimpleio.LOG_EMERG; /// /// Alert condition message. /// public const int LOG_ALERT = IO.Bindings.libsimpleio.LOG_ALERT; /// /// Critical condition message. /// public const int LOG_CRIT = IO.Bindings.libsimpleio.LOG_CRIT; /// /// Error message. /// public const int LOG_ERR = IO.Bindings.libsimpleio.LOG_ERR; /// /// Warning message. /// public const int LOG_WARNING = IO.Bindings.libsimpleio.LOG_WARNING; /// /// Normal condition message. /// public const int LOG_NOTICE = IO.Bindings.libsimpleio.LOG_NOTICE; /// /// Informational message. /// public const int LOG_INFO = IO.Bindings.libsimpleio.LOG_INFO; /// /// Debug message. /// public const int LOG_DEBUG = IO.Bindings.libsimpleio.LOG_DEBUG; /// /// Constructor for a logging object that uses the Linux /// syslog service. /// /// Program identifier string. /// syslog facility. /// syslog options. /// syslog severity level. public Logger(string id = "@@APPNAME@@", int facility = LOG_LOCAL0, int options = LOG_NDELAY, int severity = LOG_INFO) { if (id == "@@APPNAME@@") { id = System.AppDomain.CurrentDomain.FriendlyName; } IO.Bindings.libsimpleio.LINUX_openlog(id, options, facility, out int error); this.severity = severity; } /// /// Log a notification message. /// /// Notification message. public void Note(string message) { IO.Bindings.libsimpleio.LINUX_syslog (IO.Bindings.libsimpleio.LOG_NOTICE, message, out int error); } /// /// Log a warning message. /// /// Warning message. public void Warning(string message) { IO.Bindings.libsimpleio.LINUX_syslog (IO.Bindings.libsimpleio.LOG_WARNING, message, out int error); } /// /// Log an error message. /// /// Error message. public void Error(string message) { IO.Bindings.libsimpleio.LINUX_syslog (IO.Bindings.libsimpleio.LOG_ERR, message, out int error); } /// /// Log an error message, including an errno error string. /// /// Error Message. /// errno error number. public void Error(string message, int errnum) { System.Text.StringBuilder errmsg = new System.Text.StringBuilder(256); IO.Bindings.libsimpleio.LINUX_strerror(errnum, errmsg, errmsg.Capacity); IO.Bindings.libsimpleio.LINUX_syslog (IO.Bindings.libsimpleio.LOG_ERR, message + ", " + errmsg, out int error); } /// /// Trace interface method for posting a message. /// /// Trace message. public override void Write(string message) { IO.Bindings.libsimpleio.LINUX_syslog(this.severity, message, out int error); } /// /// Trace interface method for posting a message. /// /// Trace message. /// /// This method implementation is identical to Write(), /// because syslog is not a line oriented service. /// public override void WriteLine(string message) { IO.Bindings.libsimpleio.LINUX_syslog(this.severity, message, out int error); } } }