diff --git a/Ryujinx.Core/Logging.cs b/Ryujinx.Core/Logging.cs index 89064ccbc8..b4cd5349b7 100644 --- a/Ryujinx.Core/Logging.cs +++ b/Ryujinx.Core/Logging.cs @@ -2,6 +2,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Runtime.CompilerServices; using System.Text; namespace Ryujinx.Core @@ -12,15 +13,25 @@ namespace Ryujinx.Core private const string LogFileName = "Ryujinx.log"; - private static bool EnableInfo = Config.LoggingEnableInfo; - private static bool EnableTrace = Config.LoggingEnableTrace; - private static bool EnableDebug = Config.LoggingEnableDebug; - private static bool EnableWarn = Config.LoggingEnableWarn; - private static bool EnableError = Config.LoggingEnableError; - private static bool EnableFatal = Config.LoggingEnableFatal; - private static bool EnableIpc = Config.LoggingEnableIpc; + private static bool EnableInfo = Config.LoggingEnableInfo; + private static bool EnableTrace = Config.LoggingEnableTrace; + private static bool EnableDebug = Config.LoggingEnableDebug; + private static bool EnableWarn = Config.LoggingEnableWarn; + private static bool EnableError = Config.LoggingEnableError; + private static bool EnableFatal = Config.LoggingEnableFatal; + private static bool EnableIpc = Config.LoggingEnableIpc; private static bool EnableLogFile = Config.LoggingEnableLogFile; + private enum LogLevel + { + Debug = 1, + Error = 2, + Fatal = 3, + Info = 4, + Trace = 5, + Warn = 6 + } + static Logging() { if (File.Exists(LogFileName)) File.Delete(LogFileName); @@ -30,14 +41,42 @@ namespace Ryujinx.Core ExecutionTime.Start(); } - public static string GetExecutionTime() - { - return ExecutionTime.ElapsedMilliseconds.ToString().PadLeft(8, '0') + "ms"; - } + public static string GetExecutionTime() => ExecutionTime.ElapsedMilliseconds.ToString().PadLeft(8, '0') + "ms"; - private static string WhoCalledMe() + private static void LogMessage(LogEntry LogEntry) { - return new StackTrace().GetFrame(2).GetMethod().Name; + ConsoleColor consoleColor = ConsoleColor.White; + + switch (LogEntry.LogLevel) + { + case LogLevel.Debug: + consoleColor = ConsoleColor.Gray; + break; + case LogLevel.Error: + consoleColor = ConsoleColor.Red; + break; + case LogLevel.Fatal: + consoleColor = ConsoleColor.Magenta; + break; + case LogLevel.Info: + consoleColor = ConsoleColor.White; + break; + case LogLevel.Trace: + consoleColor = ConsoleColor.DarkGray; + break; + case LogLevel.Warn: + consoleColor = ConsoleColor.Yellow; + break; + } + + string Text = $"{LogEntry.ExecutionTime} | {LogEntry.LogLevel.ToString()} > " + + $"{LogEntry.CallingMember}:{LogEntry.CallingLineNumber} > {LogEntry.Message}"; + + Console.ForegroundColor = consoleColor; + Console.WriteLine(Text.PadLeft(Text.Length + 1, ' ')); + Console.ResetColor(); + + LogFile(Text); } private static void LogFile(string Message) @@ -51,87 +90,105 @@ namespace Ryujinx.Core } } - public static void Info(string Message) + public static void Info(string Message, + [CallerMemberName] string CallingMember = "", + [CallerLineNumber] int CallingLineNumber = 0) { if (EnableInfo) { - string Text = $"{GetExecutionTime()} | INFO > {Message}"; - - Console.ForegroundColor = ConsoleColor.White; - Console.WriteLine(Text.PadLeft(Text.Length + 1, ' ')); - Console.ResetColor(); - - LogFile(Text); + LogMessage(new LogEntry + { + CallingLineNumber = CallingLineNumber, + CallingMember = CallingMember, + LogLevel = LogLevel.Info, + Message = Message, + ExecutionTime = GetExecutionTime() + }); } } - - public static void Trace(string Message) + + public static void Trace(string Message, + [CallerMemberName] string CallingMember = "", + [CallerLineNumber] int CallingLineNumber = 0) { if (EnableTrace) { - string Text = $"{GetExecutionTime()} | TRACE > {WhoCalledMe()} - {Message}"; - - Console.ForegroundColor = ConsoleColor.DarkGray; - Console.WriteLine(Text.PadLeft(Text.Length + 1, ' ')); - Console.ResetColor(); - - LogFile(Text); + LogMessage(new LogEntry + { + CallingLineNumber = CallingLineNumber, + CallingMember = CallingMember, + LogLevel = LogLevel.Trace, + Message = Message, + ExecutionTime = GetExecutionTime() + }); } } - public static void Debug(string Message) + public static void Debug(string Message, + [CallerMemberName] string CallingMember = "", + [CallerLineNumber] int CallingLineNumber = 0) { if (EnableDebug) { - string Text = $"{GetExecutionTime()} | DEBUG > {WhoCalledMe()} - {Message}"; - - Console.ForegroundColor = ConsoleColor.Gray; - Console.WriteLine(Text.PadLeft(Text.Length + 1, ' ')); - Console.ResetColor(); - - LogFile(Text); + LogMessage(new LogEntry + { + CallingLineNumber = CallingLineNumber, + CallingMember = CallingMember, + LogLevel = LogLevel.Debug, + Message = Message, + ExecutionTime = GetExecutionTime() + }); } } - public static void Warn(string Message) + public static void Warn(string Message, + [CallerMemberName] string CallingMember = "", + [CallerLineNumber] int CallingLineNumber = 0) { if (EnableWarn) { - string Text = $"{GetExecutionTime()} | WARN > {WhoCalledMe()} - {Message}"; - - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine(Text.PadLeft(Text.Length + 1, ' ')); - Console.ResetColor(); - - LogFile(Text); + LogMessage(new LogEntry + { + CallingLineNumber = CallingLineNumber, + CallingMember = CallingMember, + LogLevel = LogLevel.Warn, + Message = Message, + ExecutionTime = GetExecutionTime() + }); } } - public static void Error(string Message) + public static void Error(string Message, + [CallerMemberName] string CallingMember = "", + [CallerLineNumber] int CallingLineNumber = 0) { if (EnableError) { - string Text = $"{GetExecutionTime()} | ERROR > {WhoCalledMe()} - {Message}"; - - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine(Text.PadLeft(Text.Length + 1, ' ')); - Console.ResetColor(); - - LogFile(Text); + LogMessage(new LogEntry + { + CallingLineNumber = CallingLineNumber, + CallingMember = CallingMember, + LogLevel = LogLevel.Error, + Message = Message, + ExecutionTime = GetExecutionTime() + }); } } - public static void Fatal(string Message) + public static void Fatal(string Message, + [CallerMemberName] string CallingMember = "", + [CallerLineNumber] int CallingLineNumber = 0) { if (EnableFatal) { - string Text = $"{GetExecutionTime()} | FATAL > {WhoCalledMe()} - {Message}"; - - Console.ForegroundColor = ConsoleColor.Magenta; - Console.WriteLine(Text.PadLeft(Text.Length + 1, ' ')); - Console.ResetColor(); - - LogFile(Text); + LogMessage(new LogEntry + { + CallingLineNumber = CallingLineNumber, + CallingMember = CallingMember, + LogLevel = LogLevel.Fatal, + Message = Message, + ExecutionTime = GetExecutionTime() + }); } } @@ -208,5 +265,14 @@ namespace Ryujinx.Core } return result.ToString(); } - } + + private struct LogEntry + { + public string CallingMember; + public string ExecutionTime; + public string Message; + public int CallingLineNumber; + public LogLevel LogLevel; + } + } } diff --git a/Ryujinx.Core/OsHle/Svc/SvcSystem.cs b/Ryujinx.Core/OsHle/Svc/SvcSystem.cs index 0b5c97e30f..68eebc888c 100644 --- a/Ryujinx.Core/OsHle/Svc/SvcSystem.cs +++ b/Ryujinx.Core/OsHle/Svc/SvcSystem.cs @@ -221,7 +221,7 @@ namespace Ryujinx.Core.OsHle.Svc string Str = AMemoryHelper.ReadAsciiString(Memory, Position, Size); - Logging.Info($"SvcOutputDebugString: {Str}"); + Logging.Info(Str); ThreadState.X0 = 0; }