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);
}
}
}