178 lines
6.3 KiB
C#
178 lines
6.3 KiB
C#
using System;
|
|
using System.Globalization;
|
|
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
|
|
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="disableLogging">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 = $"[{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;
|
|
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)
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Gray;
|
|
PrintLog(message?.ToString(), false, values);
|
|
Console.ForegroundColor = ConsoleColor.Gray;
|
|
}
|
|
|
|
/// <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;
|
|
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)
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Gray;
|
|
PrintLog(message?.ToString(), true, values);
|
|
Console.ForegroundColor = ConsoleColor.Gray;
|
|
}
|
|
|
|
/// <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;
|
|
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_" + DateTime.UtcNow.Ticks + ".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)");
|
|
}
|
|
|
|
}
|
|
}
|