فهرست منبع

Fix log messages being duplicated

ghorsington 4 سال پیش
والد
کامیت
c49845446f
1فایلهای تغییر یافته به همراه29 افزوده شده و 21 حذف شده
  1. 29 21
      BepInEx/Bootstrap/Chainloader.cs

+ 29 - 21
BepInEx/Bootstrap/Chainloader.cs

@@ -57,8 +57,9 @@ namespace BepInEx.Bootstrap
 			if (_initialized)
 				return;
 
+			ReplayPreloaderLogs(preloaderLogEvents);
 			ThreadingHelper.Initialize();
-
+			
 			// Set vitals
 			if (gameExePath != null)
 			{
@@ -75,46 +76,53 @@ namespace BepInEx.Bootstrap
 			}
 
 			Logger.InitializeInternalLoggers();
-			Logger.Listeners.Add(new UnityLogListener());
 
 			if (ConfigDiskLogging.Value)
 				Logger.Listeners.Add(new DiskLogListener("LogOutput.log", ConfigDiskConsoleDisplayedLevel.Value, ConfigDiskAppend.Value, ConfigDiskWriteUnityLog.Value));
 
 			if (!TraceLogSource.IsListening)
 				Logger.Sources.Add(TraceLogSource.CreateSource());
-
+			
+			// Add Unity log source only after replaying to prevent duplication in console
 			if (ConfigUnityLogging.Value)
 				Logger.Sources.Add(new UnityLogSource());
 
+			if (Utility.CurrentOs == Platform.Linux)
+			{
+				Logger.LogInfo($"Detected Unity version: v{Application.unityVersion}");
+			}
 
-			// Temporarily disable the console log listener as we replay the preloader logs
-			var logListener = Logger.Listeners.FirstOrDefault(logger => logger is ConsoleLogListener);
+			Logger.LogMessage("Chainloader ready");
 
+			_initialized = true;
+		}
+		
+		private static void ReplayPreloaderLogs(ICollection<LogEventArgs> preloaderLogEvents)
+		{
+			if (preloaderLogEvents == null)
+				return;
+			
+			var unityLogger = new UnityLogListener();
+			Logger.Listeners.Add(unityLogger);
+			
+			// Temporarily disable the console log listener (if there is one from preloader) as we replay the preloader logs
+			var logListener = Logger.Listeners.FirstOrDefault(logger => logger is ConsoleLogListener);
+			
 			if (logListener != null)
 				Logger.Listeners.Remove(logListener);
 
 			// Write preloader log events if there are any, including the original log source name
-			if (preloaderLogEvents != null)
-			{
-				var preloaderLogSource = Logger.CreateLogSource("Preloader");
+			var preloaderLogSource = Logger.CreateLogSource("Preloader");
 
-				foreach (var preloaderLogEvent in preloaderLogEvents)
-					Logger.InternalLogEvent(preloaderLogSource, preloaderLogEvent);
+			foreach (var preloaderLogEvent in preloaderLogEvents)
+				Logger.InternalLogEvent(preloaderLogSource, preloaderLogEvent);
 
-				Logger.Sources.Remove(preloaderLogSource);	
-			}
+			Logger.Sources.Remove(preloaderLogSource);	
 
+			Logger.Listeners.Remove(unityLogger);
+			
 			if (logListener != null)
 				Logger.Listeners.Add(logListener);
-
-			if (Utility.CurrentOs == Platform.Linux)
-			{
-				Logger.LogInfo($"Detected Unity version: v{Application.unityVersion}");
-			}
-
-			Logger.LogMessage("Chainloader ready");
-
-			_initialized = true;
 		}
 
 		private static Regex allowedGuidRegex { get; } = new Regex(@"^[a-zA-Z0-9\._\-]+$");