server-master/srcs/PhoenixLib.Logging/SerilogLogger.cs
2026-02-10 18:21:30 +01:00

128 lines
No EOL
4 KiB
C#

// WingsEmu
//
// Developed by NosWings Team
using System;
using System.ComponentModel;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.SystemConsole.Themes;
namespace PhoenixLib.Logging
{
public class SerilogLogger : ILogger
{
private readonly Serilog.ILogger _logger;
public SerilogLogger() => _logger = CreateLogger(LogLevel.Information);
public void Debug(string msg)
{
_logger.Debug(msg);
}
public void Debug(string msg, Exception ex)
{
_logger.Debug(msg, ex);
}
public void DebugFormat(string msg, params object[] objs)
{
_logger.Debug(msg, objs);
}
public void Info(string msg)
{
_logger.Information(msg);
}
public void Info(string msg, Exception ex)
{
_logger.Information(msg, ex);
}
public void InfoFormat(string msg, params object[] objs)
{
_logger.Information(msg, objs);
}
public void Warn(string msg)
{
_logger.Warning(msg);
}
public void Warn(string msg, Exception ex)
{
_logger.Warning(msg, ex);
}
public void WarnFormat(string msg, params object[] objs)
{
_logger.Warning(msg, objs);
}
public void Error(string msg, Exception ex)
{
_logger.Error(ex, msg);
}
public void ErrorFormat(string msg, Exception ex, params object[] objs)
{
_logger.Error(ex, msg, objs);
}
public void Fatal(string msg, Exception ex)
{
_logger.Fatal(ex, msg);
}
internal static Serilog.ILogger CreateLogger(LogLevel logEventLevel = LogLevel.Debug)
{
LoggerConfiguration config = new LoggerConfiguration()
.Enrich.WithThreadId()
.Enrich.FromLogContext()
.WriteTo.Console(theme: AnsiConsoleTheme.Code,
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}][{Level:u4}][Thread:{ThreadId}] {Message:lj} {NewLine}{Exception}");
string? logLevel = Environment.GetEnvironmentVariable("PHOENIX_LOG_LEVEL");
if (!string.IsNullOrEmpty(logLevel))
{
config.MinimumLevel.Is(logLevel.ToUpper() switch
{
"DEBUG" => LogEventLevel.Debug,
"INFO" => LogEventLevel.Information,
"INFORMATION" => LogEventLevel.Information,
"WARN" => LogEventLevel.Warning,
"WARNING" => LogEventLevel.Warning,
"FATAL" => LogEventLevel.Fatal,
"ERROR" => LogEventLevel.Error,
_ => throw new InvalidEnumArgumentException("PHOENIX_LOG_LEVEL authorized : Debug / Info / Warning / Error / Fatal")
});
}
else
{
config.MinimumLevel.Is(logEventLevel switch
{
LogLevel.Trace => LogEventLevel.Verbose,
LogLevel.Debug => LogEventLevel.Debug,
LogLevel.Information => LogEventLevel.Information,
LogLevel.Warning => LogEventLevel.Warning,
LogLevel.Error => LogEventLevel.Error,
LogLevel.Critical => LogEventLevel.Error,
LogLevel.None => LogEventLevel.Error,
_ => throw new ArgumentOutOfRangeException(nameof(logEventLevel), logEventLevel, null)
});
}
return config.CreateLogger();
}
}
public static class EnvironmentExtensions
{
public static bool IsFeatureActivated(string envVarName, bool defaultActivationState = false) =>
bool.TryParse(Environment.GetEnvironmentVariable(envVarName) ?? defaultActivationState.ToString(), out bool isActivated) && isActivated;
}
}