UnityLogListener.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. public void LogEvent(object sender, LogEventArgs eventArgs)
  33. {
  34. if (eventArgs.Source is UnityLogSource)
  35. return;
  36. // Special case: don't write console twice since Unity can already do that
  37. if (LogConsoleToUnity.Value || eventArgs.Source.SourceName != "Console")
  38. WriteStringToUnityLog?.Invoke(eventArgs.ToStringLine());
  39. }
  40. public void Dispose() { }
  41. private ConfigEntry<bool> LogConsoleToUnity = ConfigFile.CoreConfig.Bind("Logging",
  42. "LogConsoleToUnityLog", false,
  43. new StringBuilder()
  44. .AppendLine("If enabled, writes Standard Output messages to Unity log")
  45. .AppendLine("NOTE: By default, Unity does so automatically. Only use this option if no console messages are visible in Unity log").ToString());
  46. }
  47. }
  48. namespace UnityEngine
  49. {
  50. internal sealed class UnityLogWriter
  51. {
  52. [MethodImpl(MethodImplOptions.InternalCall)]
  53. public static extern void WriteStringToUnityLogImpl(string s);
  54. [MethodImpl(MethodImplOptions.InternalCall)]
  55. public static extern void WriteStringToUnityLog(string s);
  56. }
  57. }