using System.Net.Mime; using System.Text; namespace Logging; public class Logger : TextWriter { public override Encoding Encoding { get; } public enum LoggerType { FileLogger, ConsoleLogger } private FileLogger? _fileLogger; private FormattedConsoleLogger? _formattedConsoleLogger; private MemoryLogger _memoryLogger; private TextWriter? stdOut; public Logger(LoggerType[] enabledLoggers, TextWriter? stdOut, Encoding? encoding, string? logFilePath) { this.Encoding = encoding ?? Encoding.ASCII; this.stdOut = stdOut ?? null; if (enabledLoggers.Contains(LoggerType.FileLogger) && logFilePath is not null) _fileLogger = new FileLogger(logFilePath, null, encoding); else { _fileLogger = null; throw new ArgumentException($"logFilePath can not be null for LoggerType {LoggerType.FileLogger}"); } _formattedConsoleLogger = enabledLoggers.Contains(LoggerType.ConsoleLogger) ? new FormattedConsoleLogger(null, encoding) : null; _memoryLogger = new MemoryLogger(null, encoding); } public void WriteLine(string caller, string? value) { value = value is null ? Environment.NewLine : string.Concat(value, Environment.NewLine); Write(caller, value); } public void Write(string caller, string? value) { if (value is null) return; _fileLogger?.Write(caller, value); _formattedConsoleLogger?.Write(caller, value); _memoryLogger.Write(caller, value); stdOut?.Write(value); } public string[] Tail(uint? lines) { return _memoryLogger.Tail(lines); } public string[] GetNewLines() { return _memoryLogger.GetNewLines(); } }