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
{
}
}
}
}
}