diff --git a/Source/GrasscutterTools/Forms/FormMain.cs b/Source/GrasscutterTools/Forms/FormMain.cs
index 12ad448..e853f32 100644
--- a/Source/GrasscutterTools/Forms/FormMain.cs
+++ b/Source/GrasscutterTools/Forms/FormMain.cs
@@ -34,9 +34,11 @@ namespace GrasscutterTools.Forms
{
#region - 初始化 Init -
+ private const string TAG = "FormMain";
+
public FormMain()
{
- Console.WriteLine("FormMain ctor enter");
+ Logger.I(TAG, "FormMain ctor enter");
InitializeComponent();
Icon = Resources.IconGrasscutter;
@@ -49,14 +51,14 @@ namespace GrasscutterTools.Forms
{
StartPosition = FormStartPosition.Manual;
Location = Settings.Default.MainFormLocation;
- Console.WriteLine("Restore window location: " + Location.ToString());
+ Logger.I(TAG, "Restore window location: " + Location.ToString());
}
// 还原窗体大小
if (Settings.Default.MainFormSize != default)
{
Size = Settings.Default.MainFormSize;
- Console.WriteLine("Restore window size: " + Size.ToString());
+ Logger.I(TAG, "Restore window size: " + Size.ToString());
}
// 初始化页面
@@ -66,9 +68,10 @@ namespace GrasscutterTools.Forms
}
catch (Exception ex)
{
+ Logger.E(TAG, "Loading settings error", ex);
MessageBox.Show(Resources.SettingLoadError + ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
- Console.WriteLine("FormMain ctor completed");
+ Logger.I(TAG, "FormMain ctor completed");
}
///
@@ -76,7 +79,7 @@ namespace GrasscutterTools.Forms
///
private void InitPages()
{
- Console.WriteLine("InitPages enter");
+ Logger.I(TAG, "InitPages enter");
TCMain.SuspendLayout();
var ph = CreatePage();
ph.OnLanguageChanged = () => FormMain_Load(this, EventArgs.Empty);
@@ -96,7 +99,7 @@ namespace GrasscutterTools.Forms
TPScene.Controls.Add(CreatePage());
TPAbout.Controls.Add(CreatePage());
TCMain.ResumeLayout();
- Console.WriteLine("InitPages completed");
+ Logger.I(TAG, "InitPages completed");
}
///
@@ -112,7 +115,7 @@ namespace GrasscutterTools.Forms
RunCommands = RunCommands,
GetCommand = () => CmbCommand.Text,
Dock = DockStyle.Fill,
- Name = nameof(T)
+ Name = typeof(T).Name,
};
return page;
}
@@ -122,7 +125,7 @@ namespace GrasscutterTools.Forms
///
private void FormMain_Load(object sender, EventArgs e)
{
- Console.WriteLine("FormMain_Load enter");
+ Logger.I(TAG, "FormMain_Load enter");
Text += " - by jie65535 - v" + Common.AppVersion.ToString(3);
#if DEBUG
Text += "-debug";
@@ -137,12 +140,12 @@ namespace GrasscutterTools.Forms
{
if (tp.Controls.Count > 0 && tp.Controls[0] is BasePage page)
{
- Console.WriteLine($"{page.Name} OnLoad enter");
+ Logger.I(TAG, $"{page.Name} OnLoad enter");
page.OnLoad();
- Console.WriteLine($"{page.Name} OnLoad completed");
+ Logger.I(TAG, $"{page.Name} OnLoad completed");
}
}
- Console.WriteLine("FormMain_Load completed");
+ Logger.I(TAG, "FormMain_Load completed");
}
///
@@ -150,7 +153,7 @@ namespace GrasscutterTools.Forms
///
private void FormMain_FormClosed(object sender, FormClosedEventArgs e)
{
- Console.WriteLine("FormMain FormClosed enter");
+ Logger.I(TAG, "FormMain FormClosed enter");
// 遍历每一个页面,通知关闭
foreach (TabPage tp in TCMain.Controls)
{
@@ -160,7 +163,7 @@ namespace GrasscutterTools.Forms
// 保存当前设置
SaveSettings();
- Console.WriteLine("FormMain FormClosed completed");
+ Logger.I(TAG, "FormMain FormClosed completed");
}
///
@@ -198,7 +201,7 @@ namespace GrasscutterTools.Forms
/// 命令
private void SetCommand(string command)
{
- Console.WriteLine($"SetCommand(\"{command}\")");
+ Logger.I(TAG, $"SetCommand(\"{command}\")");
var oldCommand = CmbCommand.Text;
CmbCommand.Text = (ModifierKeys == Keys.Shift) ? $"{oldCommand} | {command}" : command;
if (ChkAutoCopy.Checked)
@@ -337,14 +340,14 @@ namespace GrasscutterTools.Forms
var cmd = command.TrimStart('/');
try
{
- Console.WriteLine("RunCommand:" + cmd);
+ Logger.I(TAG, "RunCommand:" + cmd);
var msg = await Common.OC.Invoke(cmd);
TxtCommandRunLog.AppendText(string.IsNullOrEmpty(msg) ? "OK" : msg);
TxtCommandRunLog.AppendText(Environment.NewLine);
}
catch (Exception ex)
{
- Console.WriteLine("RunCommand Error:" + ex.ToString());
+ Logger.W(TAG, "RunCommand Error:", ex);
TxtCommandRunLog.AppendText("Error: ");
TxtCommandRunLog.AppendText(ex.Message);
TxtCommandRunLog.AppendText(Environment.NewLine);
diff --git a/Source/GrasscutterTools/GrasscutterTools.csproj b/Source/GrasscutterTools/GrasscutterTools.csproj
index bf61c7f..7205a88 100644
--- a/Source/GrasscutterTools/GrasscutterTools.csproj
+++ b/Source/GrasscutterTools/GrasscutterTools.csproj
@@ -248,6 +248,7 @@
+
diff --git a/Source/GrasscutterTools/Program.cs b/Source/GrasscutterTools/Program.cs
index 732224d..3ad8e2d 100644
--- a/Source/GrasscutterTools/Program.cs
+++ b/Source/GrasscutterTools/Program.cs
@@ -24,11 +24,14 @@ using System.Threading;
using System.Windows.Forms;
using GrasscutterTools.Properties;
+using GrasscutterTools.Utils;
namespace GrasscutterTools
{
internal static class Program
{
+ private const string TAG = "Program";
+
static Program()
{
AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
@@ -72,12 +75,22 @@ namespace GrasscutterTools
//处理非UI线程异常
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
- // 初始化语言环境
- if (!string.IsNullOrEmpty(Settings.Default.DefaultLanguage))
- MultiLanguage.SetDefaultLanguage(Settings.Default.DefaultLanguage);
+ Logger.I(TAG, "Program startup");
+
+ try
+ {
+ // 初始化语言环境
+ if (!string.IsNullOrEmpty(Settings.Default.DefaultLanguage))
+ MultiLanguage.SetDefaultLanguage(Settings.Default.DefaultLanguage);
+ }
+ catch (Exception ex)
+ {
+ Logger.W(TAG, "Loading language error", ex);
+ MessageBox.Show(Resources.SettingLoadError + ex.ToString(), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
Application.Run(new Forms.FormMain());
- Console.WriteLine("Program end.");
+ Logger.I(TAG, "Program end.");
}
#region - 全局异常处理 -
@@ -85,16 +98,16 @@ namespace GrasscutterTools
private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
string str = GetExceptionMsg(e.Exception, e.ToString());
- Console.WriteLine("Application_ThreadException");
- Console.WriteLine(str);
+ Logger.E(TAG, "Application_ThreadException");
+ Logger.E(TAG, str);
MessageBox.Show(str, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
- Console.WriteLine("CurrentDomain_UnhandledException");
- Console.WriteLine(str);
+ Logger.E(TAG, "CurrentDomain_UnhandledException");
+ Logger.E(TAG, str);
MessageBox.Show(str, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
diff --git a/Source/GrasscutterTools/Utils/Logger.cs b/Source/GrasscutterTools/Utils/Logger.cs
new file mode 100644
index 0000000..9c73e51
--- /dev/null
+++ b/Source/GrasscutterTools/Utils/Logger.cs
@@ -0,0 +1,52 @@
+/**
+ * Grasscutter Tools
+ * Copyright (C) 2022 jie65535
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ **/
+
+using System;
+using System.IO;
+using System.Windows.Forms;
+
+namespace GrasscutterTools.Utils
+{
+ public static class Logger
+ {
+ private static readonly string LogPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), $"GcTools-{DateTime.Now:MMdd}.log");
+
+ private static void Write(string message)
+ {
+#if DEBUG
+ Console.WriteLine($"{DateTime.Now:mm:ss.fff} {message}");
+#else
+ // Test log
+ //File.AppendAllText(LogPath, $"{DateTime.Now:mm:ss.fff} {message}{Environment.NewLine}");
+#endif
+ }
+
+ private static void Write(string level, string tag, string message) => Write($"<{level}:{tag}> {message}");
+
+ public static void I(string tag, string info) => Write("INFO", tag, info);
+
+ public static void W(string tag, string message) => Write("WARR", tag, message);
+
+ public static void W(string tag, string message, Exception ex) => Write("WARR", tag, $"{message} {ex}");
+
+ public static void E(string tag, string message) => Write("ERROR", tag, message);
+
+ public static void E(string tag, string message, Exception ex) => Write("ERROR", tag, $"{message} {ex}");
+ }
+}
\ No newline at end of file