kreta/Framework/Logging/MulticastLogWriter.cs
2024-03-13 00:33:46 +01:00

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