summaryrefslogtreecommitdiff
path: root/StardewModdingAPI/Log.cs
blob: 2784b70936a682a02a793b860c077a525b425841 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
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)");
        }

    }
}