// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Threading.Tasks; using Microsoft.Extensions.Logging; namespace EpicGames.Horde.Logs { /// /// Interface for a log device /// public interface IServerLogger : ILogger, IAsyncDisposable { /// /// Flushes the logger with the server and stops the background work /// Task StopAsync(); } /// /// Extension methods for /// public static class ServerLoggerExtensions { sealed class ServerLoggerWithLeaseLogger : IServerLogger { readonly IServerLogger _serverLogger; readonly ILogger _localLogger; public ServerLoggerWithLeaseLogger(IServerLogger serverLogger, ILogger localLogger) { _serverLogger = serverLogger; _localLogger = localLogger; } /// public IDisposable? BeginScope(TState state) where TState : notnull => _localLogger.BeginScope(state); /// public ValueTask DisposeAsync() => _serverLogger.DisposeAsync(); /// public bool IsEnabled(LogLevel logLevel) => _serverLogger.IsEnabled(logLevel) || _localLogger.IsEnabled(logLevel); /// public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) { _serverLogger.Log(logLevel, eventId, state, exception, formatter); _localLogger.Log(logLevel, eventId, state, exception, formatter); } /// public Task StopAsync() => _serverLogger.StopAsync(); } /// /// Creates a logger which uploads data to the server /// /// Logger for the server /// Local log output device /// New logger instance public static IServerLogger WithLocalLogger(this IServerLogger serverLogger, ILogger localLogger) { return new ServerLoggerWithLeaseLogger(serverLogger, localLogger); } } }