UnityLogListener.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.Reflection;
  3. using System.Runtime.CompilerServices;
  4. using System.Text;
  5. using BepInEx.Configuration;
  6. namespace BepInEx.Logging
  7. {
  8. /// <summary>
  9. /// Logs entries using Unity specific outputs.
  10. /// </summary>
  11. public class UnityLogListener : ILogListener
  12. {
  13. internal static readonly Action<string> WriteStringToUnityLog;
  14. static UnityLogListener()
  15. {
  16. foreach (MethodInfo methodInfo in typeof(UnityEngine.UnityLogWriter).GetMethods(BindingFlags.Static | BindingFlags.Public))
  17. {
  18. try
  19. {
  20. methodInfo.Invoke(null, new object[] { "" });
  21. }
  22. catch
  23. {
  24. continue;
  25. }
  26. WriteStringToUnityLog = (Action<string>)Delegate.CreateDelegate(typeof(Action<string>), methodInfo);
  27. break;
  28. }
  29. if (WriteStringToUnityLog == null)
  30. Logger.LogError("Unable to start Unity log writer");
  31. }
  32. /// <inheritdoc />
  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. /// <inheritdoc />
  42. public void Dispose() { }
  43. private ConfigEntry<bool> LogConsoleToUnity = ConfigFile.CoreConfig.Bind("Logging",
  44. "LogConsoleToUnityLog", false,
  45. new StringBuilder()
  46. .AppendLine("If enabled, writes Standard Output messages to Unity log")
  47. .AppendLine("NOTE: By default, Unity does so automatically. Only use this option if no console messages are visible in Unity log").ToString());
  48. }
  49. }
  50. namespace UnityEngine
  51. {
  52. internal sealed class UnityLogWriter
  53. {
  54. [MethodImpl(MethodImplOptions.InternalCall)]
  55. public static extern void WriteStringToUnityLogImpl(string s);
  56. [MethodImpl(MethodImplOptions.InternalCall)]
  57. public static extern void WriteStringToUnityLog(string s);
  58. }
  59. }