Option to log debug console output to a file. Closes #318

This commit is contained in:
Joonas Rikkonen
2018-04-20 20:11:01 +03:00
parent 177f31d538
commit e61dc5ae5f
5 changed files with 90 additions and 11 deletions
@@ -67,7 +67,18 @@ namespace Barotrauma
{ {
while (queuedMessages.Count > 0) while (queuedMessages.Count > 0)
{ {
AddMessage(queuedMessages.Dequeue()); var newMsg = queuedMessages.Dequeue();
AddMessage(newMsg);
if (GameSettings.SaveDebugConsoleLogs)
{
unsavedMessages.Add(newMsg);
if (unsavedMessages.Count >= messagesPerFile)
{
SaveLogs();
unsavedMessages.Clear();
}
}
} }
} }
@@ -151,7 +162,10 @@ namespace Barotrauma
{ {
while (queuedMessages.Count > 0) while (queuedMessages.Count > 0)
{ {
AddMessage(queuedMessages.Dequeue()); var newMsg = queuedMessages.Dequeue();
AddMessage(newMsg);
if (GameSettings.SaveDebugConsoleLogs) unsavedMessages.Add(newMsg);
} }
} }
@@ -190,15 +190,16 @@ namespace Barotrauma
sb.AppendLine("Last debug messages:"); sb.AppendLine("Last debug messages:");
for (int i = DebugConsole.Messages.Count - 1; i > 0; i--) for (int i = DebugConsole.Messages.Count - 1; i > 0; i--)
{ {
sb.AppendLine(" " + DebugConsole.Messages[i].Time + " - " + DebugConsole.Messages[i].Text); sb.AppendLine("[" + DebugConsole.Messages[i].Time + "] " + DebugConsole.Messages[i].Text);
} }
sw.WriteLine(sb.ToString()); sw.WriteLine(sb.ToString());
sw.Close(); sw.Close();
CrashMessageBox( "A crash report (\"crashreport.txt\") was saved in the root folder of the game."+ if (GameSettings.SaveDebugConsoleLogs) DebugConsole.SaveLogs();
" If you'd like to help fix this bug, please post the report on the Undertow Games forums.");
CrashMessageBox( "A crash report (\"crashreport.log\") was saved in the root folder of the game."+
" If you'd like to help fix this bug, please post the report on Barotrauma's GitHub issue tracker: https://github.com/Regalis11/Barotrauma/issues/");
} }
} }
#endif #endif
@@ -128,6 +128,10 @@ namespace Barotrauma
//used for keeping track of the message entered when pressing up/down //used for keeping track of the message entered when pressing up/down
static int selectedIndex; static int selectedIndex;
private static List<ColoredText> unsavedMessages = new List<ColoredText>();
private static int messagesPerFile = 800;
public const string SavePath = "ConsoleLogs";
static DebugConsole() static DebugConsole()
{ {
commands.Add(new Command("help", "", (string[] args) => commands.Add(new Command("help", "", (string[] args) =>
@@ -987,6 +991,7 @@ namespace Barotrauma
commands.Add(new Command("togglekarma", "togglekarma: Toggles the karma system.", (string[] args) => commands.Add(new Command("togglekarma", "togglekarma: Toggles the karma system.", (string[] args) =>
{ {
throw new NotImplementedException();
if (GameMain.Server == null) return; if (GameMain.Server == null) return;
GameMain.Server.KarmaEnabled = !GameMain.Server.KarmaEnabled; GameMain.Server.KarmaEnabled = !GameMain.Server.KarmaEnabled;
})); }));
@@ -2170,18 +2175,28 @@ namespace Barotrauma
if (string.IsNullOrEmpty((msg))) return; if (string.IsNullOrEmpty((msg))) return;
#if SERVER #if SERVER
Messages.Add(new ColoredText(msg, color, isCommand)); var newMsg = new ColoredText(msg, color, isCommand);
Messages.Add(newMsg);
//TODO: REMOVE //TODO: REMOVE
Console.ForegroundColor = XnaToConsoleColor.Convert(color); Console.ForegroundColor = XnaToConsoleColor.Convert(color);
Console.WriteLine(msg); Console.WriteLine(msg);
Console.ForegroundColor = ConsoleColor.White; Console.ForegroundColor = ConsoleColor.White;
if (GameSettings.SaveDebugConsoleLogs)
{
unsavedMessages.Add(newMsg);
if (unsavedMessages.Count >= messagesPerFile)
{
SaveLogs();
unsavedMessages.Clear();
}
}
if (Messages.Count > MaxMessages) if (Messages.Count > MaxMessages)
{ {
Messages.RemoveRange(0, Messages.Count - MaxMessages); Messages.RemoveRange(0, Messages.Count - MaxMessages);
} }
#elif CLIENT #elif CLIENT
lock (queuedMessages) lock (queuedMessages)
{ {
@@ -2276,5 +2291,51 @@ namespace Barotrauma
isOpen = true; isOpen = true;
#endif #endif
} }
public static void SaveLogs()
{
if (unsavedMessages.Count == 0) return;
if (!Directory.Exists(SavePath))
{
try
{
Directory.CreateDirectory(SavePath);
}
catch (Exception e)
{
ThrowError("Failed to create a folder for debug console logs", e);
return;
}
}
string fileName = "DebugConsoleLog_" + DateTime.Now.ToShortDateString() + "_" + DateTime.Now.ToShortTimeString() + ".txt";
var invalidChars = Path.GetInvalidFileNameChars();
foreach (char invalidChar in invalidChars)
{
fileName = fileName.Replace(invalidChar.ToString(), "");
}
string filePath = Path.Combine(SavePath, fileName);
if (File.Exists(filePath))
{
int fileNum = 2;
while (File.Exists(filePath + " (" + fileNum + ")"))
{
fileNum++;
}
filePath = filePath + " (" + fileNum + ")";
}
try
{
File.WriteAllLines(filePath, unsavedMessages.Select(l => "[" + l.Time + "] " + l.Text));
}
catch (Exception e)
{
unsavedMessages.Clear();
ThrowError("Saving debug console log to " + filePath + " failed", e);
}
}
} }
} }
@@ -123,6 +123,7 @@ namespace Barotrauma
} }
public static bool VerboseLogging { get; set; } public static bool VerboseLogging { get; set; }
public static bool SaveDebugConsoleLogs { get; set; }
public GameSettings(string filePath) public GameSettings(string filePath)
{ {
@@ -141,6 +142,7 @@ namespace Barotrauma
WasGameUpdated = doc.Root.GetAttributeBool("wasgameupdated", false); WasGameUpdated = doc.Root.GetAttributeBool("wasgameupdated", false);
VerboseLogging = doc.Root.GetAttributeBool("verboselogging", false); VerboseLogging = doc.Root.GetAttributeBool("verboselogging", false);
SaveDebugConsoleLogs = doc.Root.GetAttributeBool("savedebugconsolelogs", false);
if (doc == null) if (doc == null)
{ {
@@ -284,6 +286,7 @@ namespace Barotrauma
new XAttribute("musicvolume", musicVolume), new XAttribute("musicvolume", musicVolume),
new XAttribute("soundvolume", soundVolume), new XAttribute("soundvolume", soundVolume),
new XAttribute("verboselogging", VerboseLogging), new XAttribute("verboselogging", VerboseLogging),
new XAttribute("savedebugconsolelogs", SaveDebugConsoleLogs),
new XAttribute("enablesplashscreen", EnableSplashScreen)); new XAttribute("enablesplashscreen", EnableSplashScreen));
if (WasGameUpdated) if (WasGameUpdated)
+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<config masterserverurl="http://www.undertowgames.com/baromaster" autocheckupdates="true" musicvolume="0.5" soundvolume="0.5" verboselogging="false"> <config masterserverurl="http://www.undertowgames.com/baromaster" autocheckupdates="true" musicvolume="0.5" soundvolume="0.5" verboselogging="false" savedebugconsolelogs="false">
<graphicsmode fullscreen="true" vsync="true" /> <graphicsmode fullscreen="true" vsync="true" />
<contentpackage path="Data/ContentPackages/Vanilla 0.8.xml" /> <contentpackage path="Data/ContentPackages/Vanilla 0.8.xml" />
<player name=""/> <player name=""/>