using System; using System.Diagnostics; using System.IO; using System.Text; using BepInEx.Bootstrap; using BepInEx.ConsoleUtil; namespace BepInEx.Logging { /// /// A log writer specific to the . /// /// public class PreloaderLogWriter : BaseLogger { /// /// The which contains all logged entries, so it may be passed onto another log writer. /// public StringBuilder StringBuilder { get; protected set; } = new StringBuilder(); /// /// Whether or not the log writer is redirecting console output, so it can be logged. /// public bool IsRedirectingConsole { get; protected set; } protected TextWriter stdout; protected LoggerTraceListener traceListener; private bool _enabled = false; /// /// Whether or not the log writer is writing and/or redirecting. /// public bool Enabled { get => _enabled; set { if (value) Enable(); else Disable(); } } /// Whether or not to redirect the console standard output. public PreloaderLogWriter(bool redirectConsole) { IsRedirectingConsole = redirectConsole; stdout = Console.Out; traceListener = new LoggerTraceListener(this); } /// /// Enables the log writer. /// public void Enable() { if (_enabled) return; if (IsRedirectingConsole) Console.SetOut(this); else Console.SetOut(TextWriter.Null); Trace.Listeners.Add(traceListener); _enabled = true; } /// /// Disables the log writer. /// public void Disable() { if (!_enabled) return; Console.SetOut(stdout); Trace.Listeners.Remove(traceListener); _enabled = false; } /// /// Logs an entry to the Logger instance. /// /// The level of the entry. /// The textual value of the entry. public override void Log(LogLevel level, object entry) { Kon.ForegroundColor = level.GetConsoleColor(); base.Log(level, entry); Kon.ForegroundColor = ConsoleColor.Gray; } public override void Write(char value) { StringBuilder.Append(value); stdout.Write(value); } public override void Write(string value) { StringBuilder.Append(value); stdout.Write(value); } protected override void Dispose(bool disposing) { Disable(); StringBuilder.Length = 0; traceListener?.Dispose(); traceListener = null; } public override string ToString() { return StringBuilder.ToString().Trim(); } } }