using System; using System.Diagnostics; using System.Runtime.CompilerServices; namespace Jovian.Logger { /// /// The recommended way to log messages in Jovian Logger. /// Create a new instance of this struct in the class you want to log messages. /// public struct Logger { private string caller; private LogCategory logCategory; public Logger(Type caller, LogCategory logCategory) : this() { this.logCategory = logCategory; this.caller = caller.Name; LoggerUtility.PreloadLoggerSettings(); } private string Caller { get { if(string.IsNullOrEmpty(caller)) { caller = "Unspecified"; } return caller; } } private LogCategory LogCategory { get { if(logCategory == LogCategory.None) { logCategory = LogCategory.General; } return logCategory; } } /// /// Logs messages that are meant to only be seen in the editor /// /// Log message /// Optional Log Category /// Implicit, do not provide [Conditional("UNITY_EDITOR")] [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogSpam(string msg, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogSpam($"{Caller}.{callerMethod}", msg, logCat); } /// /// Logs messages that are meant to only be seen in the editor with a context object /// /// Log message /// Object to focus on in scene/project window /// Optional Log Category /// Implicit, do not provide [Conditional("UNITY_EDITOR")] [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogSpam(string msg, UnityEngine.Object context, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogSpam($"{Caller}.{callerMethod}", msg, logCat, context); } /// /// Logs standard Info/Debug messages /// /// /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogInfo(string msg, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogInfo($"{Caller}.{callerMethod}", msg, logCat); } /// /// Logs standard Info/Debug messages with a context object /// /// /// Optional Log Category /// Object to focus on in scene/project window /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogInfo(string msg, UnityEngine.Object context, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogInfo($"{Caller}.{callerMethod}", msg, logCat, context); } /// /// Logs standard Warning messages /// /// /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogWarning(string msg, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogWarning($"{Caller}.{callerMethod}", msg, logCat); } /// /// Logs standard Warning messages with a context object /// /// /// Object to focus on in scene/project window /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogWarning(string msg, UnityEngine.Object context, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogWarning($"{Caller}.{callerMethod}", msg, logCat, context); } /// /// Logs standard Error messages /// /// /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogError(string msg, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogError($"{Caller}.{callerMethod}", msg, logCat); } /// /// Logs standard Error messages with a context object /// /// /// Object to focus on in scene/project window /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogError(string msg, UnityEngine.Object context, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogError($"{Caller}.{callerMethod}", msg, logCat, context); } /// /// Logs standard Assert messages /// /// /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogAssert(string msg, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogAssert($"{Caller}.{callerMethod}", msg, logCat); } /// /// Logs standard Assert messages with a context object /// /// /// Object to focus on in scene/project window /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogAssert(string msg, UnityEngine.Object context, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogAssert($"{Caller}.{callerMethod}", msg, logCat, context); } /// /// Logs string Exception messages /// /// /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogException(string msg, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogException($"{Caller}.{callerMethod}", msg, logCat); } /// /// Logs string Exception messages with a context object /// /// /// Object to focus on in scene/project window /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogException(string msg, UnityEngine.Object context, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogException($"{Caller}.{callerMethod}", msg, logCat, context); } /// /// Logs standard Exception messages /// /// /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogException(Exception e, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogException($"{Caller}.{callerMethod}", e.Message, logCat); } /// /// Logs standard Exception messages with a context object /// /// /// Object to focus on in scene/project window /// Optional Log Category /// Implicit, do not provide [MethodImpl(MethodImplOptions.AggressiveInlining)] public void LogException(Exception e, UnityEngine.Object context, LogCategory logCat = LogCategory.None, [CallerMemberName] string callerMethod = "") { if(logCat == LogCategory.None) { logCat = LogCategory; } InternalLogger.LogException($"{Caller}.{callerMethod}", e.Message, logCat, context); } /// /// Logs a watch variable that updates in place in the Custom Console instead of creating new entries. /// Ideal for values that change every frame (positions, FPS, state names, etc.). /// /// Unique identifier for this watch (e.g. "playerPos", "fps") /// The current value to display /// Optional Log Category [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Watch(string key, object value, LogCategory logCat = LogCategory.None) { if(logCat == LogCategory.None) { logCat = LogCategory; } LoggerUtility.WatchCallback?.Invoke((key, value?.ToString() ?? "null", logCat)); } /// /// Removes a watch variable from the Custom Console. /// /// The watch key to remove [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Unwatch(string key) { LoggerUtility.UnwatchCallback?.Invoke(key); } } }