PreloaderLogWriter.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Text;
  5. using BepInEx.Bootstrap;
  6. using BepInEx.ConsoleUtil;
  7. namespace BepInEx.Logging
  8. {
  9. /// <summary>
  10. /// A log writer specific to the <see cref="Preloader"/>.
  11. /// </summary>
  12. /// <inheritdoc cref="BaseLogger"/>
  13. public class PreloaderLogWriter : BaseLogger
  14. {
  15. /// <summary>
  16. /// The <see cref="System.Text.StringBuilder"/> which contains all logged entries, so it may be passed onto another log writer.
  17. /// </summary>
  18. public StringBuilder StringBuilder { get; protected set; } = new StringBuilder();
  19. /// <summary>
  20. /// Whether or not the log writer is redirecting console output, so it can be logged.
  21. /// </summary>
  22. public bool IsRedirectingConsole { get; protected set; }
  23. protected TextWriter stdout;
  24. protected LoggerTraceListener traceListener;
  25. private bool _enabled = false;
  26. /// <summary>
  27. /// Whether or not the log writer is writing and/or redirecting.
  28. /// </summary>
  29. public bool Enabled
  30. {
  31. get => _enabled;
  32. set
  33. {
  34. if (value)
  35. Enable();
  36. else
  37. Disable();
  38. }
  39. }
  40. /// <param name="redirectConsole">Whether or not to redirect the console standard output.</param>
  41. public PreloaderLogWriter(bool redirectConsole)
  42. {
  43. IsRedirectingConsole = redirectConsole;
  44. stdout = Console.Out;
  45. traceListener = new LoggerTraceListener(this);
  46. }
  47. /// <summary>
  48. /// Enables the log writer.
  49. /// </summary>
  50. public void Enable()
  51. {
  52. if (_enabled)
  53. return;
  54. if (IsRedirectingConsole)
  55. Console.SetOut(this);
  56. else
  57. Console.SetOut(Null);
  58. Trace.Listeners.Add(traceListener);
  59. _enabled = true;
  60. }
  61. /// <summary>
  62. /// Disables the log writer.
  63. /// </summary>
  64. public void Disable()
  65. {
  66. if (!_enabled)
  67. return;
  68. Console.SetOut(stdout);
  69. Trace.Listeners.Remove(traceListener);
  70. _enabled = false;
  71. }
  72. /// <summary>
  73. /// Logs an entry to the Logger instance.
  74. /// </summary>
  75. /// <param name="level">The level of the entry.</param>
  76. /// <param name="entry">The textual value of the entry.</param>
  77. public override void Log(LogLevel level, object entry)
  78. {
  79. Kon.ForegroundColor = level.GetConsoleColor();
  80. base.Log(level, entry);
  81. Kon.ForegroundColor = ConsoleColor.Gray;
  82. }
  83. public override void Write(char value)
  84. {
  85. StringBuilder.Append(value);
  86. stdout.Write(value);
  87. }
  88. public override void Write(string value)
  89. {
  90. StringBuilder.Append(value);
  91. stdout.Write(value);
  92. }
  93. protected override void Dispose(bool disposing)
  94. {
  95. Disable();
  96. StringBuilder.Length = 0;
  97. traceListener?.Dispose();
  98. traceListener = null;
  99. }
  100. public override string ToString()
  101. {
  102. return StringBuilder.ToString().Trim();
  103. }
  104. }
  105. }