summaryrefslogtreecommitdiff
path: root/StardewModdingAPI/Log.cs
diff options
context:
space:
mode:
Diffstat (limited to 'StardewModdingAPI/Log.cs')
-rw-r--r--StardewModdingAPI/Log.cs172
1 files changed, 172 insertions, 0 deletions
diff --git a/StardewModdingAPI/Log.cs b/StardewModdingAPI/Log.cs
new file mode 100644
index 00000000..2784b709
--- /dev/null
+++ b/StardewModdingAPI/Log.cs
@@ -0,0 +1,172 @@
+using System;
+using System.IO;
+using System.Threading;
+
+namespace StardewModdingAPI
+{
+
+ /// <summary>
+ /// Class to organize logging calls.
+ /// </summary>
+ public class Log
+ {
+ private static StreamWriter _logStream;
+ private static string _logPath;
+
+ /// <summary>
+ /// Set up the logging stream
+ /// </summary>
+ /// <param name="logPath"></param>
+ public static void Initialize(string logPath)
+ {
+ _logPath = logPath;
+ var logFile = string.Format("{0}\\MODDED_ProgramLog.Log_LATEST.txt", logPath);
+ try
+ {
+ _logStream = new StreamWriter(logFile, false);
+ }
+ catch (Exception)
+ {
+ // TODO: not use general exception
+ Log.Error("Could not initialize LogStream - Logging is disabled");
+ }
+ }
+
+ /// <summary>
+ /// Print provided parameters to the console/file as applicable
+ /// </summary>
+ /// <param name="message">Desired message</param>
+ /// <param name="suppressMessage">When true, writes to ONLY console and not the log file.</param>
+ /// <param name="values">Additional params to be added to the message</param>
+ private static void PrintLog(object message, bool disableLogging, params object[] values)
+ {
+ string logOutput = string.Format("[{0}] {1}", System.DateTime.Now.ToLongTimeString(), String.Format(message.ToString(), values));
+ Console.WriteLine(logOutput);
+
+ if (_logStream != null && !disableLogging)
+ {
+ _logStream.WriteLine(logOutput);
+ _logStream.Flush();
+ }
+ }
+
+ /// <summary>
+ /// Successful message to display to console and logging.
+ /// </summary>
+ /// <param name="message"></param>
+ /// <param name="values"></param>
+ public static void Success(object message, params object[] values)
+ {
+ Console.ForegroundColor = ConsoleColor.Green;
+ Log.PrintLog(message?.ToString(), false, values);
+ Console.ForegroundColor = ConsoleColor.Gray;
+ }
+
+ /// <summary>
+ /// Generic comment to display to console and logging.
+ /// </summary>
+ /// <param name="message"></param>
+ /// <param name="values"></param>
+ public static void Verbose(object message, params object[] values)
+ {
+ Log.PrintLog(message?.ToString(), false, values);
+ }
+
+ /// <summary>
+ /// Additional comment to display to console and logging.
+ /// </summary>
+ /// <param name="message"></param>
+ /// <param name="values"></param>
+ public static void Comment(object message, params object[] values)
+ {
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Log.PrintLog(message?.ToString(), false, values);
+ Console.ForegroundColor = ConsoleColor.Gray;
+ }
+
+ /// <summary>
+ /// Message for only console. Does not appear in logging.
+ /// </summary>
+ /// <param name="message"></param>
+ /// <param name="values"></param>
+ public static void Info(object message, params object[] values)
+ {
+ Log.PrintLog(message.ToString(), true, values);
+ }
+
+ /// <summary>
+ /// Important message indicating an error.
+ /// </summary>
+ /// <param name="message"></param>
+ /// <param name="values"></param>
+ public static void Error(object message, params object[] values)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Log.PrintLog(message.ToString(), false, values);
+ Console.ForegroundColor = ConsoleColor.Gray;
+ }
+
+ /// <summary>
+ /// A message displayed only while in DEBUG mode
+ /// </summary>
+ /// <param name="message"></param>
+ /// <param name="values"></param>
+ public static void Debug(object message, params object[] values)
+ {
+#if DEBUG
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Log.PrintLog(message.ToString(), false, values);
+ Console.ForegroundColor = ConsoleColor.Gray;
+#endif
+ }
+
+ /// <summary>
+ /// Catch unhandled exception from the application
+ /// </summary>
+ /// <remarks>Should be moved out of here if we do more than just log the exception.</remarks>
+ public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
+ {
+ Console.WriteLine("An exception has been caught");
+ File.WriteAllText(_logPath + "\\MODDED_ErrorLog.Log_" + Extensions.Random.Next(100000000, 999999999) + ".txt", e.ExceptionObject.ToString());
+ }
+
+ /// <summary>
+ /// Catch thread exception from the application
+ /// </summary>
+ /// <remarks>Should be moved out of here if we do more than just log the exception.</remarks>
+ public static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
+ {
+ Console.WriteLine("A thread exception has been caught");
+ File.WriteAllText(_logPath + "\\MODDED_ErrorLog.Log_" + Extensions.Random.Next(100000000, 999999999) + ".txt", e.Exception.ToString());
+ }
+
+ // I'm including the following for now because they have a lot of references with different uses.
+ // They should be removed since they do not provide any insight into actual problems, and other log methods should be used.
+
+ public static void LogValueNotSpecified()
+ {
+ Error("<value> must be specified");
+ }
+
+ public static void LogObjectValueNotSpecified()
+ {
+ Error("<object> and <value> must be specified");
+ }
+
+ public static void LogValueInvalid()
+ {
+ Error("<value> is invalid");
+ }
+
+ public static void LogObjectInvalid()
+ {
+ Error("<object> is invalid");
+ }
+
+ public static void LogValueNotInt32()
+ {
+ Error("<value> must be a whole number (Int32)");
+ }
+
+ }
+}