Skip to content

Instantly share code, notes, and snippets.

@kokeiro001
Last active November 17, 2025 00:13
Show Gist options
  • Select an option

  • Save kokeiro001/d08e5112b03b74100cc266bab7135d06 to your computer and use it in GitHub Desktop.

Select an option

Save kokeiro001/d08e5112b03b74100cc266bab7135d06 to your computer and use it in GitHub Desktop.
[クラス名.メソッド名:行番号] 的なログ出すやつ検証。いろいろ制約あってDIとかMSのILogger使えなかったりするとき用。
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);
}
}
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
}
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.