using System; using System.IO; using System.Text; namespace BepInEx.Logging { /// /// The base implementation of a logging class. /// public abstract class BaseLogger : TextWriter { protected BaseLogger() { DisplayedLevels = GetDefaultLogLevel(); } /// /// The encoding that the underlying text writer should use. Defaults to UTF-8 BOM. /// public override Encoding Encoding { get; } = new UTF8Encoding(true); /// /// The handler for a entry logged event. /// /// The text element of the log itself. /// Whether or not it should be dislpayed to the user. public delegate void EntryLoggedEventHandler(LogLevel level, object entry); /// /// The listener event for an entry being logged. /// public event EntryLoggedEventHandler EntryLogged; /// /// Retrieves the default log level to use for this logger. /// /// The default log level to use. protected virtual LogLevel GetDefaultLogLevel() { LogLevel lowest; try { lowest = (LogLevel)Enum.Parse(typeof(LogLevel), Config.GetEntry("logger-displayed-levels", nameof(LogLevel.Info))); } catch { return LogLevel.All; } if (lowest == LogLevel.None) return LogLevel.None; LogLevel value = lowest; foreach (LogLevel e in Enum.GetValues(typeof(LogLevel))) { if (lowest > e) value |= e; } return value; } /// /// A filter which is used to specify which log levels are not ignored by the logger. /// public LogLevel DisplayedLevels { get; set; } private readonly object logLockObj = new object(); /// /// Logs an entry to the Logger instance. /// /// The level of the entry. /// The textual value of the entry. public virtual void Log(LogLevel level, object entry) { if ((DisplayedLevels & level) != LogLevel.None) { lock (logLockObj) { EntryLogged?.Invoke(level, entry); WriteLine($"[{level.GetHighestLevel()}] {entry}"); } } } /// /// Logs an entry to the Logger instance, with a of Message. /// /// The text value of this log entry. public virtual void Log(object entry) { Log(LogLevel.Message, entry); } } }