132 lines
3.4 KiB
C#
132 lines
3.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Kreta.Framework.Exceptions;
|
|
|
|
namespace Kreta.Framework.Logging
|
|
{
|
|
/// <summary>
|
|
/// Multicast-oló naplóvezető <see cref="ILogWriter"/> megvalósítás.
|
|
/// </summary>
|
|
public sealed class MulticastLogWriter : LogWriterBase
|
|
{
|
|
// <<Composite>>
|
|
|
|
readonly IList<ILogWriter> m_LogWriters = new List<ILogWriter>();
|
|
LogLevel m_LogLevel;
|
|
|
|
/// <summary>
|
|
/// Az osztály alapértelmezett konstruktora.
|
|
/// </summary>
|
|
public MulticastLogWriter()
|
|
: this(LogLevel.INFO)
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Az osztály konstruktora.
|
|
/// </summary>
|
|
/// <param name="logLevel">Naplózási szint</param>
|
|
public MulticastLogWriter(LogLevel logLevel)
|
|
{
|
|
m_LogLevel = logLevel;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Ggyerek naplóvezetőt vesz fel a listába.
|
|
/// </summary>
|
|
/// <param name="writer">A gyerek naplóvezető</param>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Naplózási szint.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Egy üzenet akkor kerül naplózásra, ha a szintje nagyobb, vagy
|
|
/// egyenlő, mint ennek a tulajdonságnak az értéke.
|
|
/// </remarks>
|
|
public LogLevel Level
|
|
{
|
|
get
|
|
{
|
|
return m_LogLevel;
|
|
}
|
|
set
|
|
{
|
|
m_LogLevel = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// A gyerek naplóvezetők listája.
|
|
/// </summary>
|
|
public IEnumerable<ILogWriter> LogWriters
|
|
{
|
|
get
|
|
{
|
|
return m_LogWriters;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Naplóba vezeti az üzenetet.
|
|
/// </summary>
|
|
/// <param name="message">A naplóba vezetendő üzenet</param>
|
|
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
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|