UnityLogListener.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using BepInEx.Logging;
  2. using System;
  3. using System.Reflection;
  4. using System.Runtime.CompilerServices;
  5. using System.Text;
  6. using BepInEx.Configuration;
  7. namespace BepInEx.Unity.Logging
  8. {
  9. /// <summary>
  10. /// Logs entries using Unity specific outputs.
  11. /// </summary>
  12. public class UnityLogListener : ILogListener
  13. {
  14. internal static readonly Action<string> WriteStringToUnityLog;
  15. static UnityLogListener()
  16. {
  17. foreach (MethodInfo methodInfo in typeof(UnityEngine.UnityLogWriter).GetMethods(BindingFlags.Static | BindingFlags.Public))
  18. {
  19. try
  20. {
  21. methodInfo.Invoke(null, new object[] { "" });
  22. }
  23. catch
  24. {
  25. continue;
  26. }
  27. WriteStringToUnityLog = (Action<string>)Delegate.CreateDelegate(typeof(Action<string>), methodInfo);
  28. break;
  29. }
  30. if (WriteStringToUnityLog == null)
  31. Logger.LogError("Unable to start Unity log writer");
  32. }
  33. public void LogEvent(object sender, LogEventArgs eventArgs)
  34. {
  35. if (eventArgs.Source is UnityLogSource)
  36. return;
  37. // Special case: don't write console twice since Unity can already do that
  38. if (LogConsoleToUnity.Value || eventArgs.Source.SourceName != "Console")
  39. WriteStringToUnityLog?.Invoke(eventArgs.ToStringLine());
  40. }
  41. public void Dispose() { }
  42. private ConfigEntry<bool> LogConsoleToUnity = ConfigFile.CoreConfig.Bind("Logging",
  43. "LogConsoleToUnityLog", false,
  44. new StringBuilder()
  45. .AppendLine("If enabled, writes Standard Output messages to Unity log")
  46. .AppendLine("NOTE: By default, Unity does so automatically. Only use this option if no console messages are visible in Unity log").ToString());
  47. }
  48. }
  49. namespace UnityEngine
  50. {
  51. internal sealed class UnityLogWriter
  52. {
  53. [MethodImpl(MethodImplOptions.InternalCall)]
  54. public static extern void WriteStringToUnityLogImpl(string s);
  55. [MethodImpl(MethodImplOptions.InternalCall)]
  56. public static extern void WriteStringToUnityLog(string s);
  57. }
  58. }