diff --git a/src/server/Logging/ServerLogger.cs b/src/server/Logging/ServerLogger.cs
index 5fb01921..9e91c5f7 100644
--- a/src/server/Logging/ServerLogger.cs
+++ b/src/server/Logging/ServerLogger.cs
@@ -41,6 +41,16 @@ public class ServerLoggerConfiguration
{
[LogLevel.Information] = ConsoleColor.Green
};
+
+ ///
+ /// The set of logging levels that are written to the log file on disk. This is
+ /// independent of LogLevels above (which gates both the dashboard's live entry list and
+ /// the file write) -- if this dictionary is non-empty, only levels present as keys here
+ /// are written to disk, while the dashboard continues to show everything permitted by
+ /// LogLevels. If this dictionary is empty (the default), file writing falls back to the
+ /// same set as LogLevels, preserving the original behaviour.
+ ///
+ public Dictionary FileLogLevels { get; set; } = new();
}
///
@@ -214,7 +224,7 @@ public void Log(LogLevel logLevel, EventId eventId, TState state,
category = category,
label = label,
exception = exception?.ToString() ?? string.Empty
- });
+ }, logLevel);
}
///
@@ -222,7 +232,10 @@ public void Log(LogLevel logLevel, EventId eventId, TState state,
/// "writes to file".
///
///
- private void StoreLogEntry(LogEntry entry)
+ /// The log level of this entry, used to independently gate whether
+ /// it's written to the file (see FileLogLevels on ServerLoggerConfiguration) separately
+ /// from whether it's added to the in-memory list the dashboard reads from.
+ private void StoreLogEntry(LogEntry entry, LogLevel logLevel)
{
// This used to be locked, but Lists are *so* fast that we're not going to be able to
// cause lock contention. Even if we do, it's non critical. Just move on.
@@ -240,7 +253,17 @@ private void StoreLogEntry(LogEntry entry)
}
catch { }
- StoreInFile(entry);
+ _config ??= _getCurrentConfig();
+
+ // Empty FileLogLevels means "not configured" -- fall back to the same set as
+ // LogLevels, preserving the original (pre-patch) behaviour of writing everything
+ // that's shown live to the file as well.
+ bool writeToFile = _config.FileLogLevels.Count == 0
+ ? _config.LogLevels.ContainsKey(logLevel)
+ : _config.FileLogLevels.ContainsKey(logLevel);
+
+ if (writeToFile)
+ StoreInFile(entry);
}
private void StoreInFile(LogEntry logEntry)
diff --git a/src/server/appsettings.json b/src/server/appsettings.json
index 8bd3450b..b23cbb06 100644
--- a/src/server/appsettings.json
+++ b/src/server/appsettings.json
@@ -5,7 +5,7 @@
// will be logged. The order of log levels is:
// Trace = 0, Debug = 1, Information = 2, Warning = 3, Error = 4, Critical = 5, and None = 6.
"LogLevel": {
- "Default": "Trace",
+ "Default": "Information",
"Microsoft": "Error",
"System": "Error"
},
@@ -16,12 +16,18 @@
"FileTemplate": "log-%Y-%m-%d.txt", // Template for daily logging file
"MaxLogsToStoreMB": 20, // Maximum amount of logs to store in MB. Once this is hit old log files get dumped (not trimmed, dumped)
"LogLevels": {
- "Debug": "Yellow",
- "Trace": "Gray",
"Information": "White",
"Warning": "Cyan",
"Error": "Red",
"Critical": "Magenta"
+ },
+ // Independent gate for what gets written to disk (see FileLogLevels on
+ // ServerLoggerConfiguration). If empty, falls back to LogLevels above. Colors here are
+ // unused for file output but kept as the dictionary value type for consistency.
+ "FileLogLevels": {
+ "Warning": "Cyan",
+ "Error": "Red",
+ "Critical": "Magenta"
}
}
},