#nullable enable
|
|
using System;
|
|
|
|
namespace IPA.Logging
|
|
{
|
|
/// <summary>
|
|
/// The logger base class. Provides the format for console logs.
|
|
/// </summary>
|
|
public abstract class Logger
|
|
{
|
|
private static Logger? _log;
|
|
|
|
internal static Logger Default
|
|
{
|
|
get
|
|
{
|
|
if (_log == null)
|
|
_log = new StandardLogger("IPA");
|
|
return _log;
|
|
}
|
|
}
|
|
|
|
private static StandardLogger? _stdout;
|
|
|
|
internal static StandardLogger stdout
|
|
{
|
|
get
|
|
{
|
|
if (_stdout == null)
|
|
_stdout = new StandardLogger("_");
|
|
return _stdout;
|
|
}
|
|
}
|
|
|
|
private static StandardLogger? lazyHarmony;
|
|
internal static StandardLogger Harmony => lazyHarmony ??= new StandardLogger("Harmony");
|
|
|
|
internal static Logger AntiMalware => Default.GetChildLogger("AntiMalware");
|
|
internal static Logger Updater => Default.GetChildLogger("Updater");
|
|
internal static Logger LibLoader => Default.GetChildLogger("LibraryLoader");
|
|
internal static Logger Injector => Default.GetChildLogger("Injector");
|
|
internal static Logger Loader => Default.GetChildLogger("Loader");
|
|
internal static Logger Features => Loader.GetChildLogger("Features");
|
|
internal static Logger Config => Default.GetChildLogger("Config");
|
|
internal static bool LogCreated => _log != null;
|
|
|
|
/// <summary>
|
|
/// The standard format for log messages.
|
|
/// </summary>
|
|
/// <value>the format for the standard loggers to print in</value>
|
|
public static string LogFormat { get; protected internal set; } = "[{3} @ {2:HH:mm:ss} | {1}] {0}";
|
|
|
|
/// <summary>
|
|
/// An enum specifying the level of the message. Resembles Syslog.
|
|
/// </summary>
|
|
public enum Level : byte
|
|
{
|
|
/// <summary>
|
|
/// No associated level. These never get shown.
|
|
/// </summary>
|
|
None = 0,
|
|
|
|
/// <summary>
|
|
/// A trace message. These are ignored <i>incredibly</i> early.
|
|
/// </summary>
|
|
Trace = 64,
|
|
|
|
/// <summary>
|
|
/// A debug message.
|
|
/// </summary>
|
|
Debug = 1,
|
|
|
|
/// <summary>
|
|
/// An informational message.
|
|
/// </summary>
|
|
Info = 2,
|
|
|
|
/// <summary>
|
|
/// A notice. More significant than Info, but less than a warning.
|
|
/// </summary>
|
|
Notice = 32,
|
|
|
|
/// <summary>
|
|
/// A warning message.
|
|
/// </summary>
|
|
Warning = 4,
|
|
|
|
/// <summary>
|
|
/// An error message.
|
|
/// </summary>
|
|
Error = 8,
|
|
|
|
/// <summary>
|
|
/// A critical error message.
|
|
/// </summary>
|
|
Critical = 16
|
|
}
|
|
|
|
/// <summary>
|
|
/// An enum providing log level filters.
|
|
/// </summary>
|
|
[Flags]
|
|
public enum LogLevel : byte
|
|
{
|
|
/// <summary>
|
|
/// Allow no messages through.
|
|
/// </summary>
|
|
None = Level.None,
|
|
|
|
/// <summary>
|
|
/// Only shows Trace messages.
|
|
/// </summary>
|
|
TraceOnly = Level.Trace,
|
|
|
|
/// <summary>
|
|
/// Only shows Debug messages.
|
|
/// </summary>
|
|
DebugOnly = Level.Debug,
|
|
|
|
/// <summary>
|
|
/// Only shows info messages.
|
|
/// </summary>
|
|
InfoOnly = Level.Info,
|
|
|
|
/// <summary>
|
|
/// Only shows notice messages.
|
|
/// </summary>
|
|
NoticeOnly = Level.Notice,
|
|
|
|
/// <summary>
|
|
/// Only shows Warning messages.
|
|
/// </summary>
|
|
WarningOnly = Level.Warning,
|
|
|
|
/// <summary>
|
|
/// Only shows Error messages.
|
|
/// </summary>
|
|
ErrorOnly = Level.Error,
|
|
|
|
/// <summary>
|
|
/// Only shows Critical messages.
|
|
/// </summary>
|
|
CriticalOnly = Level.Critical,
|
|
|
|
/// <summary>
|
|
/// Shows all messages error and up.
|
|
/// </summary>
|
|
ErrorUp = ErrorOnly | CriticalOnly,
|
|
|
|
/// <summary>
|
|
/// Shows all messages warning and up.
|
|
/// </summary>
|
|
WarningUp = WarningOnly | ErrorUp,
|
|
|
|
/// <summary>
|
|
/// Shows all messages Notice and up.
|
|
/// </summary>
|
|
NoticeUp = WarningUp | NoticeOnly,
|
|
|
|
/// <summary>
|
|
/// Shows all messages info and up.
|
|
/// </summary>
|
|
InfoUp = InfoOnly | NoticeUp,
|
|
|
|
/// <summary>
|
|
/// Shows all messages debug and up.
|
|
/// </summary>
|
|
DebugUp = DebugOnly | InfoUp,
|
|
|
|
/// <summary>
|
|
/// Shows all messages.
|
|
/// </summary>
|
|
All = TraceOnly | DebugUp,
|
|
|
|
/// <summary>
|
|
/// Used for when the level is undefined.
|
|
/// </summary>
|
|
Undefined = byte.MaxValue
|
|
}
|
|
|
|
/// <summary>
|
|
/// A basic log function.
|
|
/// </summary>
|
|
/// <param name="level">the level of the message</param>
|
|
/// <param name="message">the message to log</param>
|
|
public abstract void Log(Level level, string message);
|
|
|
|
/// <summary>
|
|
/// A basic log function taking an exception to log.
|
|
/// </summary>
|
|
/// <param name="level">the level of the message</param>
|
|
/// <param name="e">the exception to log</param>
|
|
public virtual void Log(Level level, Exception e) => Log(level, e.ToString());
|
|
|
|
/// <summary>
|
|
/// Sends a trace message.
|
|
/// Equivalent to <c>Log(Level.Trace, message);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, string)"/>
|
|
/// <param name="message">the message to log</param>
|
|
public virtual void Trace(string message) => Log(Level.Trace, message);
|
|
|
|
/// <summary>
|
|
/// Sends an exception as a trace message.
|
|
/// Equivalent to <c>Log(Level.Trace, e);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, Exception)"/>
|
|
/// <param name="e">the exception to log</param>
|
|
public virtual void Trace(Exception e) => Log(Level.Trace, e);
|
|
|
|
/// <summary>
|
|
/// Sends a debug message.
|
|
/// Equivalent to <c>Log(Level.Debug, message);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, string)"/>
|
|
/// <param name="message">the message to log</param>
|
|
public virtual void Debug(string message) => Log(Level.Debug, message);
|
|
|
|
/// <summary>
|
|
/// Sends an exception as a debug message.
|
|
/// Equivalent to <c>Log(Level.Debug, e);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, Exception)"/>
|
|
/// <param name="e">the exception to log</param>
|
|
public virtual void Debug(Exception e) => Log(Level.Debug, e);
|
|
|
|
/// <summary>
|
|
/// Sends an info message.
|
|
/// Equivalent to <c>Log(Level.Info, message);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, string)"/>
|
|
/// <param name="message">the message to log</param>
|
|
public virtual void Info(string message) => Log(Level.Info, message);
|
|
|
|
/// <summary>
|
|
/// Sends an exception as an info message.
|
|
/// Equivalent to <c>Log(Level.Info, e);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, Exception)"/>
|
|
/// <param name="e">the exception to log</param>
|
|
public virtual void Info(Exception e) => Log(Level.Info, e);
|
|
|
|
/// <summary>
|
|
/// Sends a notice message.
|
|
/// Equivalent to <c>Log(Level.Notice, message);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, string)"/>
|
|
/// <param name="message">the message to log</param>
|
|
public virtual void Notice(string message) => Log(Level.Notice, message);
|
|
|
|
/// <summary>
|
|
/// Sends an exception as a notice message.
|
|
/// Equivalent to <c>Log(Level.Notice, e);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, Exception)"/>
|
|
/// <param name="e">the exception to log</param>
|
|
public virtual void Notice(Exception e) => Log(Level.Notice, e);
|
|
|
|
/// <summary>
|
|
/// Sends a warning message.
|
|
/// Equivalent to <c>Log(Level.Warning, message);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, string)"/>
|
|
/// <param name="message">the message to log</param>
|
|
public virtual void Warn(string message) => Log(Level.Warning, message);
|
|
|
|
/// <summary>
|
|
/// Sends an exception as a warning message.
|
|
/// Equivalent to <c>Log(Level.Warning, e);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, Exception)"/>
|
|
/// <param name="e">the exception to log</param>
|
|
public virtual void Warn(Exception e) => Log(Level.Warning, e);
|
|
|
|
/// <summary>
|
|
/// Sends an error message.
|
|
/// Equivalent to <c>Log(Level.Error, message);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, string)"/>
|
|
/// <param name="message">the message to log</param>
|
|
public virtual void Error(string message) => Log(Level.Error, message);
|
|
|
|
/// <summary>
|
|
/// Sends an exception as an error message.
|
|
/// Equivalent to <c>Log(Level.Error, e);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, Exception)"/>
|
|
/// <param name="e">the exception to log</param>
|
|
public virtual void Error(Exception e) => Log(Level.Error, e);
|
|
|
|
/// <summary>
|
|
/// Sends a critical message.
|
|
/// Equivalent to <c>Log(Level.Critical, message);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, string)"/>
|
|
/// <param name="message">the message to log</param>
|
|
public virtual void Critical(string message) => Log(Level.Critical, message);
|
|
|
|
/// <summary>
|
|
/// Sends an exception as a critical message.
|
|
/// Equivalent to <c>Log(Level.Critical, e);</c>
|
|
/// </summary>
|
|
/// <seealso cref="Log(Level, Exception)"/>
|
|
/// <param name="e">the exception to log</param>
|
|
public virtual void Critical(Exception e) => Log(Level.Critical, e);
|
|
}
|
|
}
|