using System; using System.Collections.Generic; using System.Linq; using Kreta.Framework.Exceptions; namespace Kreta.Framework.Logging { /// /// Multicast-oló naplóvezető megvalósítás. /// public sealed class MulticastLogWriter : LogWriterBase { // <> readonly IList m_LogWriters = new List(); LogLevel m_LogLevel; /// /// Az osztály alapértelmezett konstruktora. /// public MulticastLogWriter() : this(LogLevel.INFO) { } /// /// Az osztály konstruktora. /// /// Naplózási szint public MulticastLogWriter(LogLevel logLevel) { m_LogLevel = logLevel; } /// /// Ggyerek naplóvezetőt vesz fel a listába. /// /// A gyerek naplóvezető public void Add(ILogWriter writer) { if (writer == null) { throw new ArgumentNullException(nameof(writer)); } if (m_LogWriters.Contains(writer)) { throw new InvalidOperationException("The writer is already added."); } m_LogWriters.Add(writer); } /// /// Naplózási szint. /// /// /// Egy üzenet akkor kerül naplózásra, ha a szintje nagyobb, vagy /// egyenlő, mint ennek a tulajdonságnak az értéke. /// public LogLevel Level { get { return m_LogLevel; } set { m_LogLevel = value; } } /// /// A gyerek naplóvezetők listája. /// public IEnumerable LogWriters { get { return m_LogWriters; } } /// /// Naplóba vezeti az üzenetet. /// /// A naplóba vezetendő üzenet protected override Guid? DoLog(ILogMessage message) { var logId = Guid.NewGuid(); MultiLog(message, logId); return logId; } protected override void DoLog(ILogMessage message, Guid logId) { MultiLog(message, logId); } private void MultiLog(ILogMessage message, Guid logId) { if (message == null) { return; } if (message.Level < m_LogLevel) { return; } try { foreach (ILogWriter writer in m_LogWriters.ToArray()) { writer.Log(message, logId); } } catch (Exception exception) { try { ConsoleLogWriter.WriteLine("Child logwriter threw an exception:", LogLevel.ERROR); ConsoleLogWriter.WriteLine(ExceptionUtil.ExceptionToString(exception), LogLevel.ERROR); } catch { } } } } }