[backend/logging] Display log level in text form in systemd logs
This commit is contained in:
parent
98ea655d3f
commit
8732f30563
3 changed files with 74 additions and 15 deletions
|
@ -5,11 +5,23 @@ namespace Iceshrimp.Backend.Core.Extensions;
|
|||
|
||||
public static class ConsoleLoggerExtensions
|
||||
{
|
||||
public static ILoggingBuilder AddCustomConsoleFormatter(this ILoggingBuilder builder) =>
|
||||
public static ILoggingBuilder AddCustomConsoleFormatter(this ILoggingBuilder builder)
|
||||
{
|
||||
if (Environment.GetEnvironmentVariable("INVOCATION_ID") is null)
|
||||
{
|
||||
builder.AddConsole(options => options.FormatterName = "systemd-custom")
|
||||
.AddConsoleFormatter<CustomSystemdConsoleFormatter, ConsoleFormatterOptions>();
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.AddConsole(options => options.FormatterName = "custom")
|
||||
.AddConsoleFormatter<CustomFormatter, ConsoleFormatterOptions>();
|
||||
}
|
||||
|
||||
return builder;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a slightly modified version of Microsoft's SimpleConsoleFormatter.
|
||||
* Changes mainly concern handling of line breaks.
|
||||
|
@ -249,4 +261,62 @@ file sealed class CustomFormatter() : ConsoleFormatter("custom")
|
|||
}
|
||||
}
|
||||
|
||||
file sealed class CustomSystemdConsoleFormatter() : ConsoleFormatter("systemd-custom")
|
||||
{
|
||||
public override void Write<TState>(
|
||||
in LogEntry<TState> logEntry,
|
||||
IExternalScopeProvider? scopeProvider,
|
||||
TextWriter textWriter
|
||||
)
|
||||
{
|
||||
var message = logEntry.Formatter(logEntry.State, logEntry.Exception);
|
||||
// ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
|
||||
if (logEntry.Exception == null && message == null) return;
|
||||
var logLevel = logEntry.LogLevel;
|
||||
var category = logEntry.Category;
|
||||
var id = logEntry.EventId.Id;
|
||||
var exception = logEntry.Exception;
|
||||
var syslogSeverityString = GetSyslogSeverityString(logLevel);
|
||||
textWriter.Write(syslogSeverityString);
|
||||
|
||||
textWriter.Write(category);
|
||||
textWriter.Write('[');
|
||||
textWriter.Write(id);
|
||||
textWriter.Write(']');
|
||||
if (!string.IsNullOrEmpty(message))
|
||||
{
|
||||
textWriter.Write(' ');
|
||||
WriteReplacingNewLine(textWriter, message);
|
||||
}
|
||||
|
||||
if (exception != null)
|
||||
{
|
||||
textWriter.Write(' ');
|
||||
WriteReplacingNewLine(textWriter, exception.ToString());
|
||||
}
|
||||
|
||||
textWriter.Write(Environment.NewLine);
|
||||
|
||||
static void WriteReplacingNewLine(TextWriter writer, string message)
|
||||
{
|
||||
var str = message.Replace(Environment.NewLine, " ");
|
||||
writer.Write(str);
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetSyslogSeverityString(LogLevel logLevel)
|
||||
{
|
||||
return logLevel switch
|
||||
{
|
||||
LogLevel.Trace => "<7>trce: ",
|
||||
LogLevel.Debug => "<7>dbug: ",
|
||||
LogLevel.Information => "<6>info: ",
|
||||
LogLevel.Warning => "<4>warn: ",
|
||||
LogLevel.Error => "<3>fail: ",
|
||||
LogLevel.Critical => "<2>crit: ",
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(logLevel))
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
|
@ -177,17 +177,6 @@ public static class ServiceExtensions
|
|||
services.TryAdd(new ServiceDescriptor(typeof(T), key, typeof(T), contextLifetime));
|
||||
}
|
||||
|
||||
public static void AddLoggingWithOptions(this IServiceCollection services)
|
||||
{
|
||||
services.AddLogging(logging =>
|
||||
{
|
||||
if (Environment.GetEnvironmentVariable("INVOCATION_ID") is not null)
|
||||
logging.AddSystemdConsole();
|
||||
else
|
||||
logging.AddCustomConsoleFormatter();
|
||||
});
|
||||
}
|
||||
|
||||
public static void AddSwaggerGenWithOptions(this IServiceCollection services)
|
||||
{
|
||||
services.AddEndpointsApiExplorer();
|
||||
|
|
|
@ -18,7 +18,7 @@ builder.Services.AddControllers()
|
|||
.AddApiBehaviorOptions();
|
||||
|
||||
builder.Services.AddSwaggerGenWithOptions();
|
||||
builder.Services.AddLoggingWithOptions();
|
||||
builder.Services.AddLogging(logging => logging.AddCustomConsoleFormatter());
|
||||
builder.Services.AddDatabaseContext(builder.Configuration);
|
||||
builder.Services.AddSlidingWindowRateLimiter();
|
||||
builder.Services.AddCorsPolicies();
|
||||
|
|
Loading…
Add table
Reference in a new issue