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);
}
}
}
}