PreloaderLogWriter.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using BepInEx.Configuration;
  6. using BepInEx.Logging;
  7. namespace BepInEx.Preloader
  8. {
  9. public class PreloaderConsoleListener : ILogListener
  10. {
  11. public static List<LogEventArgs> LogEvents { get; } = new List<LogEventArgs>();
  12. public static TextWriter StandardOut { get; set; }
  13. protected PreloaderConsoleSource LoggerSource { get; set; }
  14. public PreloaderConsoleListener(bool redirectConsole)
  15. {
  16. StandardOut = Console.Out;
  17. if (redirectConsole)
  18. {
  19. LoggerSource = new PreloaderConsoleSource();
  20. Logger.Sources.Add(LoggerSource);
  21. Console.SetOut(LoggerSource);
  22. }
  23. }
  24. public void LogEvent(object sender, LogEventArgs eventArgs)
  25. {
  26. if ((eventArgs.Level & ConfigConsoleDisplayedLevel.Value) == 0)
  27. return;
  28. LogEvents.Add(eventArgs);
  29. ConsoleManager.SetConsoleColor(eventArgs.Level.GetConsoleColor());
  30. ConsoleDirectWrite(eventArgs.ToStringLine());
  31. ConsoleManager.SetConsoleColor(ConsoleColor.Gray);
  32. }
  33. public void ConsoleDirectWrite(string value)
  34. {
  35. StandardOut.Write(value);
  36. }
  37. public void ConsoleDirectWriteLine(string value)
  38. {
  39. StandardOut.WriteLine(value);
  40. }
  41. public void Dispose()
  42. {
  43. if (LoggerSource != null)
  44. {
  45. Console.SetOut(StandardOut);
  46. Logger.Sources.Remove(LoggerSource);
  47. LoggerSource.Dispose();
  48. LoggerSource = null;
  49. }
  50. }
  51. private static readonly ConfigEntry<LogLevel> ConfigConsoleDisplayedLevel = ConfigFile.CoreConfig.Bind(
  52. "Logging.Console","LogLevels",
  53. LogLevel.Fatal | LogLevel.Error | LogLevel.Message | LogLevel.Info,
  54. "Which log levels to show in the console output.");
  55. }
  56. public class PreloaderConsoleSource : TextWriter, ILogSource
  57. {
  58. public override Encoding Encoding { get; } = Console.OutputEncoding;
  59. public string SourceName { get; } = "BepInEx Preloader";
  60. public event EventHandler<LogEventArgs> LogEvent;
  61. public override void Write(object value)
  62. => LogEvent?.Invoke(this, new LogEventArgs(value, LogLevel.Info, this));
  63. public override void Write(string value)
  64. => Write((object)value);
  65. public override void WriteLine() { }
  66. public override void WriteLine(object value)
  67. => Write(value);
  68. public override void WriteLine(string value)
  69. => Write(value);
  70. }
  71. }