Log.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System.Diagnostics;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace OpenVIII
  8. {
  9. /// <summary>
  10. /// Attempt at a log class.
  11. /// </summary>
  12. public class Log : TextWriter
  13. {
  14. #region Fields
  15. private FileStream _fs;
  16. private StreamWriter _log;
  17. #endregion Fields
  18. #region Constructors
  19. public Log()
  20. {
  21. _fs = new FileStream("log.txt", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
  22. _log = new StreamWriter(_fs, System.Text.Encoding.UTF8)
  23. { AutoFlush = true };
  24. }
  25. #endregion Constructors
  26. #region Destructors
  27. ~Log()
  28. {
  29. Dispose(true);
  30. }
  31. #endregion Destructors
  32. #region Properties
  33. /// <summary>
  34. /// If Disabled the log.txt will be empty. and Async writes will be null.
  35. /// </summary>
  36. public bool Enabled { get; set; } = true;
  37. public override System.Text.Encoding Encoding => _log.Encoding;
  38. #endregion Properties
  39. #region Methods
  40. [ComVisible(false)]
  41. public override void Close() => _log.Close();
  42. [ComVisible(false)]
  43. public override void Flush() => _log.Flush();
  44. public override void Write(char value)
  45. {
  46. if (Enabled) _log.Write(value);
  47. else Debug.Write(value);
  48. }
  49. public override void Write(char[] buffer, int index, int count)
  50. {
  51. if (Enabled) _log.Write(buffer, index, count);
  52. else Debug.Write(new string(buffer.Skip(index).Take(count).ToArray()));
  53. }
  54. public override void Write(string value)
  55. {
  56. if (Enabled) _log.Write(value);
  57. else Debug.Write(value);
  58. }
  59. public override void Write(char[] buffer)
  60. {
  61. if (Enabled) _log.Write(buffer);
  62. else Debug.Write(buffer);
  63. }
  64. [ComVisible(false)]
  65. public override Task WriteAsync(char value) => !Enabled ? null : _log.WriteAsync(value);
  66. [ComVisible(false)]
  67. public override Task WriteAsync(string value) => !Enabled ? null : _log.WriteAsync(value);
  68. [ComVisible(false)]
  69. public override Task WriteAsync(char[] buffer, int index, int count) => !Enabled ? null : _log.WriteAsync(buffer, index, count);
  70. public override void WriteLine(string value) => base.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:{Task.CurrentId}:{value}");
  71. [ComVisible(false)]
  72. public override Task WriteLineAsync() => !Enabled ? null : _log.WriteLineAsync();
  73. [ComVisible(false)]
  74. public override Task WriteLineAsync(char value) => !Enabled ? null : _log.WriteLineAsync(value);
  75. [ComVisible(false)]
  76. public override Task WriteLineAsync(string value) => !Enabled ? null : _log.WriteLineAsync(value);
  77. [ComVisible(false)]
  78. public override Task WriteLineAsync(char[] buffer, int index, int count) => !Enabled ? null : _log.WriteLineAsync(buffer, index, count);
  79. protected override void Dispose(bool disposing)
  80. {
  81. base.Dispose(disposing);
  82. //log?.Close();
  83. //log?.Dispose();
  84. _log = null;
  85. _fs?.Close();
  86. _fs?.Dispose();
  87. _fs = null;
  88. }
  89. #endregion Methods
  90. }
  91. }