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