PreloaderLogWriter.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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.Core.Logging
  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 & ConsoleLogListener.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. }
  52. public class PreloaderConsoleSource : TextWriter, ILogSource
  53. {
  54. public override Encoding Encoding { get; } = Console.OutputEncoding;
  55. public string SourceName { get; } = "BepInEx Preloader";
  56. public event EventHandler<LogEventArgs> LogEvent;
  57. public override void Write(object value)
  58. => LogEvent?.Invoke(this, new LogEventArgs(value, LogLevel.Info, this));
  59. public override void Write(string value)
  60. => Write((object)value);
  61. public override void WriteLine() { }
  62. public override void WriteLine(object value)
  63. => Write(value);
  64. public override void WriteLine(string value)
  65. => Write(value);
  66. }
  67. }