Last active
November 17, 2025 00:13
-
-
Save kokeiro001/d08e5112b03b74100cc266bab7135d06 to your computer and use it in GitHub Desktop.
[クラス名.メソッド名:行番号] 的なログ出すやつ検証。いろいろ制約あってDIとかMSのILogger使えなかったりするとき用。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using UnityEngine; | |
| public class NewMonoBehaviourScript : MonoBehaviour | |
| { | |
| class InternalClass | |
| { | |
| private static SandboxLogger _internalLogger = SandboxLogger.CreateLogger<InternalClass>(); | |
| public void Hello(GameObject obj) | |
| { | |
| SandboxLogger.Log<InternalClass>("Hello static Log"); | |
| SandboxLogger.Warning<InternalClass>("Hello static Warning"); | |
| SandboxLogger.Error<InternalClass>("Hello static Error"); | |
| SandboxLogger.Exception<InternalClass>(new Exception("InternalClass static Exception")); | |
| SandboxLogger.Log<InternalClass>("Hello static Info with context", obj); | |
| SandboxLogger.Warning<InternalClass>("Hello static Warning with context", obj); | |
| SandboxLogger.Error<InternalClass>("Hello static Error with context", obj); | |
| SandboxLogger.Exception<InternalClass>(new Exception("InternalClass static Exception with context"), obj); | |
| _internalLogger.Log("Hello _internalLogger Info"); | |
| _internalLogger.Warning("Hello _internalLogger Warning"); | |
| _internalLogger.Error("Hello _internalLogger Error"); | |
| _internalLogger.Exception(new Exception("InternalClass instance Exception")); | |
| _internalLogger.Log("Hello _internalLogger Info with context", obj); | |
| _internalLogger.Warning("Hello _internalLogger Warning with context", obj); | |
| _internalLogger.Error("Hello _internalLogger Error with context", obj); | |
| _internalLogger.Exception(new Exception("InternalClass instance Exception with context"), obj); | |
| } | |
| } | |
| private static SandboxLogger _logger = SandboxLogger.CreateLogger<NewMonoBehaviourScript>(); | |
| void Start() | |
| { | |
| // static メソッド呼び出し(context なし) | |
| SandboxLogger.Log<NewMonoBehaviourScript>("NewMonoBehaviourScriptのStartメソッドがstaticメソッド経由で実行されました"); | |
| SandboxLogger.Warning<NewMonoBehaviourScript>("NewMonoBehaviourScript static Warning"); | |
| SandboxLogger.Error<NewMonoBehaviourScript>("NewMonoBehaviourScript static Error"); | |
| SandboxLogger.Exception<NewMonoBehaviourScript>(new Exception("NewMonoBehaviourScript static Exception")); | |
| // static メソッド呼び出し(context あり) - this をコンテキストに渡す | |
| SandboxLogger.Log<NewMonoBehaviourScript>("NewMonoBehaviourScript static Info with context", this); | |
| SandboxLogger.Warning<NewMonoBehaviourScript>("NewMonoBehaviourScript static Warning with context", this); | |
| SandboxLogger.Error<NewMonoBehaviourScript>("NewMonoBehaviourScript static Error with context", this); | |
| SandboxLogger.Exception<NewMonoBehaviourScript>(new Exception("NewMonoBehaviourScript static Exception with context"), this); | |
| // インスタンスメソッド呼び出し(context なし) | |
| _logger.Log("NewMonoBehaviourScriptのStartメソッドが_logger経由で実行されました"); | |
| _logger.Warning("NewMonoBehaviourScriptのStartメソッドが_logger経由でWarning"); | |
| _logger.Error("NewMonoBehaviourScriptのStartメソッドが_logger経由でError"); | |
| _logger.Exception(new Exception("NewMonoBehaviourScript instance Exception")); | |
| // インスタンスメソッド呼び出し(context あり) | |
| _logger.Log("NewMonoBehaviourScriptのStartメソッドが_logger経由で実行されました(context)", this); | |
| _logger.Warning("NewMonoBehaviourScriptのStartメソッドが_logger経由でWarning(context)", this); | |
| _logger.Error("NewMonoBehaviourScriptのStartメソッドが_logger経由でError(context)", this); | |
| _logger.Exception(new Exception("NewMonoBehaviourScript instance Exception with context"), this); | |
| var internalClass = new InternalClass(); | |
| internalClass.Hello(gameObject); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using System.Runtime.CompilerServices; | |
| using UnityEngine; | |
| public class SandboxLogger | |
| { | |
| private static ILogger _logger; | |
| public static ILogger Logger | |
| { | |
| get | |
| { | |
| if (_logger == null) | |
| { | |
| _logger = Debug.unityLogger; | |
| } | |
| return _logger; | |
| } | |
| set => _logger = value; | |
| } | |
| public static SandboxLogger CreateLogger<T>() | |
| { | |
| return new SandboxLogger(typeof(T).PrettyName()); | |
| } | |
| private static string BuildLogMessage(string typeName, string member, int line, string message) | |
| { | |
| return $"[{typeName}.{member}:{line}] {message}"; | |
| } | |
| private static string BuildLogMessage<T>(string member, int line, string message) | |
| { | |
| var typeName = typeof(T).PrettyName(); | |
| return BuildLogMessage(typeName, member, line, message); | |
| } | |
| #region static log methods | |
| [HideInCallstack] | |
| public static void Log<T>(string message, | |
| [CallerMemberName] string callerName = "", | |
| [CallerLineNumber] int lineNumber = 0) | |
| { | |
| var logMessage = BuildLogMessage<T>(callerName, lineNumber, message); | |
| Logger.Log(LogType.Log, logMessage); | |
| } | |
| [HideInCallstack] | |
| public static void Log<T>(string message, UnityEngine.Object context, | |
| [CallerMemberName] string callerName = "", | |
| [CallerLineNumber] int lineNumber = 0) | |
| { | |
| var logMessage = BuildLogMessage<T>(callerName, lineNumber, message); | |
| Logger.Log(LogType.Log, (object)logMessage, context); | |
| } | |
| [HideInCallstack] | |
| public static void Warning<T>(string message, | |
| [CallerMemberName] string callerName = "", | |
| [CallerLineNumber] int lineNumber = 0) | |
| { | |
| var logMessage = BuildLogMessage<T>(callerName, lineNumber, message); | |
| Logger.Log(LogType.Warning, logMessage); | |
| } | |
| [HideInCallstack] | |
| public static void Warning<T>(string message, UnityEngine.Object context, | |
| [CallerMemberName] string callerName = "", | |
| [CallerLineNumber] int lineNumber = 0) | |
| { | |
| var logMessage = BuildLogMessage<T>(callerName, lineNumber, message); | |
| Logger.Log(LogType.Warning, (object)logMessage, context); | |
| } | |
| [HideInCallstack] | |
| public static void Error<T>(string message, | |
| [CallerMemberName] string callerName = "", | |
| [CallerLineNumber] int lineNumber = 0) | |
| { | |
| var logMessage = BuildLogMessage<T>(callerName, lineNumber, message); | |
| Logger.Log(LogType.Error, logMessage); | |
| } | |
| [HideInCallstack] | |
| public static void Error<T>(string message, UnityEngine.Object context, | |
| [CallerMemberName] string callerName = "", | |
| [CallerLineNumber] int lineNumber = 0) | |
| { | |
| var logMessage = BuildLogMessage<T>(callerName, lineNumber, message); | |
| Logger.Log(LogType.Error, (object)logMessage, context); | |
| } | |
| [HideInCallstack] | |
| public static void Exception<T>(Exception exception, | |
| [CallerMemberName] string callerName = "", | |
| [CallerLineNumber] int lineNumber = 0) | |
| { | |
| var logMessage = BuildLogMessage<T>(callerName, lineNumber, exception.Message); | |
| Logger.Log(LogType.Exception, logMessage); | |
| Logger.LogException(exception); | |
| } | |
| [HideInCallstack] | |
| public static void Exception<T>(Exception exception, UnityEngine.Object context, | |
| [CallerMemberName] string callerName = "", | |
| [CallerLineNumber] int lineNumber = 0) | |
| { | |
| var logMessage = BuildLogMessage<T>(callerName, lineNumber, exception.Message); | |
| Logger.Log(LogType.Exception, (object)logMessage, context); | |
| Logger.LogException(exception, context); | |
| } | |
| #endregion | |
| #region Instance | |
| private readonly string _typeName; | |
| private SandboxLogger(string typeName) | |
| { | |
| _typeName = typeName; | |
| } | |
| [HideInCallstack] | |
| public void Log( | |
| string message, | |
| [CallerMemberName] string member = "", | |
| [CallerLineNumber] int line = 0) | |
| { | |
| Logger.Log(LogType.Log, BuildLogMessage(_typeName, member, line, message)); | |
| } | |
| [HideInCallstack] | |
| public void Log( | |
| string message, | |
| UnityEngine.Object context, | |
| [CallerMemberName] string member = "", | |
| [CallerLineNumber] int line = 0) | |
| { | |
| Logger.Log(LogType.Log, (object)BuildLogMessage(_typeName, member, line, message), context); | |
| } | |
| [HideInCallstack] | |
| public void Warning( | |
| string message, | |
| [CallerMemberName] string member = "", | |
| [CallerLineNumber] int line = 0) | |
| { | |
| Logger.Log(LogType.Warning, BuildLogMessage(_typeName, member, line, message)); | |
| } | |
| [HideInCallstack] | |
| public void Warning( | |
| string message, | |
| UnityEngine.Object context, | |
| [CallerMemberName] string member = "", | |
| [CallerLineNumber] int line = 0) | |
| { | |
| Logger.Log(LogType.Warning, (object)BuildLogMessage(_typeName, member, line, message), context); | |
| } | |
| [HideInCallstack] | |
| public void Error( | |
| string message, | |
| [CallerMemberName] string member = "", | |
| [CallerLineNumber] int line = 0) | |
| { | |
| Logger.Log(LogType.Error, BuildLogMessage(_typeName, member, line, message)); | |
| } | |
| [HideInCallstack] | |
| public void Error( | |
| string message, | |
| UnityEngine.Object context, | |
| [CallerMemberName] string member = "", | |
| [CallerLineNumber] int line = 0) | |
| { | |
| Logger.Log(LogType.Error, (object)BuildLogMessage(_typeName, member, line, message), context); | |
| } | |
| [HideInCallstack] | |
| public void Exception( | |
| Exception exception, | |
| [CallerMemberName] string member = "", | |
| [CallerLineNumber] int line = 0) | |
| { | |
| Logger.Log(LogType.Exception, BuildLogMessage(_typeName, member, line, exception.Message)); | |
| Logger.LogException(exception); | |
| } | |
| [HideInCallstack] | |
| public void Exception( | |
| Exception exception, | |
| UnityEngine.Object context, | |
| [CallerMemberName] string member = "", | |
| [CallerLineNumber] int line = 0) | |
| { | |
| Logger.Log(LogType.Exception, (object)BuildLogMessage(_typeName, member, line, exception.Message), context); | |
| Logger.LogException(exception, context); | |
| } | |
| #endregion | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using System.Collections.Generic; | |
| using System.Linq; | |
| using System.Text; | |
| public static class TypeStringFormatter | |
| { | |
| static readonly Dictionary<Type, string> _prettyNameCache = new Dictionary<Type, string>(); | |
| public static string PrettyName(this Type type) | |
| { | |
| string prettyName; | |
| if (!_prettyNameCache.TryGetValue(type, out prettyName)) | |
| { | |
| prettyName = PrettyNameInternal(type); | |
| _prettyNameCache.Add(type, prettyName); | |
| } | |
| return prettyName; | |
| } | |
| static string PrettyNameInternal(Type type) | |
| { | |
| var sb = new StringBuilder(); | |
| if (type.IsNested) | |
| { | |
| sb.Append(type.DeclaringType.PrettyName()); | |
| sb.Append("."); | |
| } | |
| if (type.IsArray) | |
| { | |
| sb.Append(type.GetElementType().PrettyName()); | |
| sb.Append("[]"); | |
| } | |
| else | |
| { | |
| var name = GetCSharpTypeName(type.Name); | |
| if (type.IsGenericType) | |
| { | |
| var quoteIndex = name.IndexOf('`'); | |
| if (quoteIndex != -1) | |
| { | |
| sb.Append(name.Substring(0, name.IndexOf('`'))); | |
| } | |
| else | |
| { | |
| sb.Append(name); | |
| } | |
| sb.Append("<"); | |
| if (type.IsGenericTypeDefinition) | |
| { | |
| var numArgs = type.GetGenericArguments().Count(); | |
| if (numArgs > 0) | |
| { | |
| sb.Append(new String(',', numArgs - 1)); | |
| } | |
| } | |
| else | |
| { | |
| sb.Append(string.Join(", ", type.GetGenericArguments().Select(t => t.PrettyName()).ToArray())); | |
| } | |
| sb.Append(">"); | |
| } | |
| else | |
| { | |
| sb.Append(name); | |
| } | |
| } | |
| return sb.ToString(); | |
| } | |
| static string GetCSharpTypeName(string typeName) | |
| { | |
| switch (typeName) | |
| { | |
| case "String": | |
| case "Object": | |
| case "Void": | |
| case "Byte": | |
| case "Double": | |
| case "Decimal": | |
| return typeName.ToLower(); | |
| case "Int16": | |
| return "short"; | |
| case "Int32": | |
| return "int"; | |
| case "Int64": | |
| return "long"; | |
| case "Single": | |
| return "float"; | |
| case "Boolean": | |
| return "bool"; | |
| default: | |
| return typeName; | |
| } | |
| } | |
| } |
Comments are disabled for this gist.