CCCPaste

Logging

using System;
using System.IO;

namespace Logging
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("--- Pathfinder в файл ---");
ILogger fileLogger = new FileLogWritter("pathfinder_general.log");
var pathfinderToFile = new Pathfinder(fileLogger);
pathfinderToFile.Find("Древний свиток");
Console.WriteLine("\n------------------\n");

Console.WriteLine("--- Pathfinder в консоль ---");
ILogger consoleLogger = new ConsoleLogWritter();
var pathfinderToConsole = new Pathfinder(consoleLogger);
pathfinderToConsole.Find("Скрытое сокровище");
Console.WriteLine("\n------------------\n");

Console.WriteLine("--- Pathfinder в файл по пятницам ---");
ILogger secureFileLogger = new SecureFileLogWritter("pathfinder_friday.log");
var pathfinderToFileOnFriday = new Pathfinder(secureFileLogger);
pathfinderToFileOnFriday.Find("Часть потерянной карты");
Console.WriteLine("\n------------------\n");

Console.WriteLine("--- Pathfinder в консоль по пятницам ---");
ILogger secureConsoleLogger = new SecureConsoleLogWritter();
var pathfinderToConsoleOnFriday = new Pathfinder(secureConsoleLogger);
pathfinderToConsoleOnFriday.Find("Секретный артефакт");
Console.WriteLine("\n------------------\n");

Console.WriteLine("--- Pathfinder в консоль И в файл по пятницам ---");
ILogger consoleAndFileLoggerOnFriday = new ConsoleAndFileLoggerOnFriday("pathfinder_friday_and_console.log");
var pathfinderToConsoleAndFileOnFriday = new Pathfinder(consoleAndFileLoggerOnFriday);
pathfinderToConsoleAndFileOnFriday.Find("Легендарный меч");

Console.WriteLine("\n--- Конец симуляции. Нажмите любую клавишу для выхода. ---");
Console.ReadKey();
}
}

public interface ILogger
{
void WriteError(string message);
}

public class ConsoleLogWritter : ILogger
{
public virtual void WriteError(string message)
{
Console.WriteLine(message);
}
}

public class FileLogWritter : ILogger
{
private readonly string _filePath;

public FileLogWritter(string filePath = "log.txt")
{
_filePath = filePath;
}

public virtual void WriteError(string message)
{
File.AppendAllText(_filePath, $"{DateTime.Now}: {message}{Environment.NewLine}");
}
}

public class SecureConsoleLogWritter : ConsoleLogWritter
{
public override void WriteError(string message)
{
if (DateTime.Now.DayOfWeek == DayOfWeek.Friday)
{
base.WriteError(message);
}
}
}

public class SecureFileLogWritter : FileLogWritter
{
public SecureFileLogWritter(string filePath = "friday_log.txt") : base(filePath) { }

public override void WriteError(string message)
{
if (DateTime.Now.DayOfWeek == DayOfWeek.Friday)
{
base.WriteError(message);
}
}
}

public class Pathfinder
{
private readonly ILogger _logger;

public Pathfinder(ILogger logger)
{
_logger = logger ?? throw new ArgumentNullException("Логгер не может быть null.");
}

public void Find(string itemToFind)
{
Console.WriteLine($"Pathfinder осуществляет поиск: {itemToFind}");

_logger.WriteError($"Предмет '{itemToFind}' был найден.");
}
}

public class CombinedLogger : ILogger
{
private readonly ILogger[] _loggers;

public CombinedLogger(params ILogger[] loggers)
{
_loggers = loggers ?? throw new ArgumentNullException("Список логгеров не может быть null.");
}

public void WriteError(string message)
{
foreach (var logger in _loggers)
{
logger.WriteError(message);
}
}
}

public class ConsoleAndFileLoggerOnFriday : ILogger
{
private readonly ILogger _console;
private readonly ILogger _file;

public ConsoleAndFileLoggerOnFriday(string filePath = "combined_friday.log")
{
_console = new ConsoleLogWritter();
_file = new FileLogWritter(filePath);
}

public void WriteError(string message)
{
_console.WriteError(message);

if (DateTime.Now.DayOfWeek == DayOfWeek.Friday)
{
_file.WriteError(message);
}
}
}
}