Skip to content

Custom Sinks

Synchronous sink

Implement ILogSink for simple, synchronous sinks:

using Logix.Abstractions;
using Logix.Enums;

public class TcpLogSink : ILogSink
{
    public void Send(LogLevel level, string formattedMessage, LogMessage logMessage)
    {
        // send somewhere
    }

    public void Dispose()
    {
        // cleanup
    }
}

Send receives the severity level, the already-formatted string, and the full LogMessage. Consider adding a MinLevel property to let users filter messages at the sink level.

Log.Container.AddSink(new TcpLogSink());

Implement IDisposable for cleanup. The Logger calls Dispose() when the container is disposed.

Async / remote sink

For sinks that make network calls, extend CloudLogSink instead:

using Logix.Sinks;

public class CustomCloudSink : CloudLogSink
{
    protected override async Task SendAsync(string formattedMessage,
        LogMessage logMessage, CancellationToken ct)
    {
        // HTTP call, WebSocket send, etc.
    }

    protected override void DisposeManaged()
    {
        // cleanup HttpClient, etc.
    }
}

CloudLogSink gives you: - Fire-and-forget async dispatch via Task.Run - Per-sink filtering (AddFilter, RemoveFilter, ClearFilters) - A pluggable IMessageFormatter? Formatter property - A MinLevel property to drop messages below a severity threshold - IDisposable with a DisposeManaged() hook