com.alicizax.unity/Runtime/Base/Log/LogReportUtil.cs
陈思海 bf0d8340af init
2025-02-07 16:04:12 +08:00

135 lines
4.1 KiB
C#

using Cysharp.Text;
using UnityEngine;
namespace AlicizaX.Runtime
{
public static class LogReportUtil
{
private static LogDetails LastReportedDetails = new LogDetails();
public static bool ForceDisableReport = true;
internal static void RedirectLog()
{
Application.logMessageReceived += HandleLog;
}
internal static void UnRedirectLog()
{
Application.logMessageReceived -= HandleLog;
}
private static void HandleLog(string logMessage, string stackTrace, LogType logType)
{
GameFrameworkLogLevel logLevel = GameFrameworkLogLevel.Info;
switch (logType)
{
case LogType.Error:
logLevel = GameFrameworkLogLevel.Error;
break;
case LogType.Assert:
case LogType.Exception:
logLevel = GameFrameworkLogLevel.Fatal;
break;
case LogType.Warning:
logLevel = GameFrameworkLogLevel.Warning;
break;
case LogType.Log:
logLevel = GameFrameworkLogLevel.Info;
break;
}
ProcessLogMessage(logLevel, logMessage, stackTrace);
}
private static void ProcessLogMessage(GameFrameworkLogLevel logLevel, string message, string stackTrace)
{
if (logLevel == GameFrameworkLogLevel.Fatal || logLevel == GameFrameworkLogLevel.Error)
{
string formattedMessage = "";
using (var sb = ZString.CreateStringBuilder())
{
sb.Append(message);
sb.Append(GetStackTrace(stackTrace));
formattedMessage = sb.ToString();
}
if (!ForceDisableReport && ShouldReport(logLevel, formattedMessage))
{
_ = WebHookUtils.SendLogToServerAsync(formattedMessage);
}
}
}
private static string GetStackTrace(string stackTrace)
{
return string.IsNullOrEmpty(stackTrace) ? string.Empty : $"\nStackTrace:\n{SimplifyStackTrace(stackTrace)}";
}
private static string SimplifyStackTrace(string stackTrace)
{
var sb = ZString.CreateStringBuilder();
var lines = stackTrace.Split('\n');
bool skipLine = false;
foreach (var line in lines)
{
if (line.Contains("Log") || line.Contains("Sirenix"))
{
skipLine = true;
}
else
{
if (skipLine)
{
if (!string.IsNullOrWhiteSpace(line) && !line.Contains("Log") && !line.Contains("Sirenix"))
{
skipLine = false;
}
else
{
continue;
}
}
if (!string.IsNullOrWhiteSpace(line))
{
sb.Append(line);
sb.Append('\n');
}
}
}
string result = sb.ToString().Trim();
return !string.IsNullOrEmpty(result) ? result : "Stack trace not available.";
}
private static bool ShouldReport(GameFrameworkLogLevel logLevel, string message)
{
if (LastReportedDetails.Level == logLevel && LastReportedDetails.Message.Equals(message))
{
return false;
}
LastReportedDetails.Update(logLevel, message);
return true;
}
private struct LogDetails
{
public GameFrameworkLogLevel Level;
public string Message;
public void Update(GameFrameworkLogLevel level, string message)
{
Level = level;
Message = message;
}
}
}
}