using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Net.Http; using System.Text; using System.Threading.Tasks; using DefaultNamespace.LogTool; using UnityEngine; using Utility; public class LogServer : Singleton { public string playerID; public string gameName = "Editor"; public string version; private string deviceModel; private string operatingSystem; public void Init(string gameName) { this.gameName = gameName; version = Application.version; deviceModel = SystemInfo.deviceName + " " + SystemInfo.deviceModel+" "+SystemInfo.deviceUniqueIdentifier; operatingSystem = SystemInfo.operatingSystem; } public void UpLog(Exception exception) { try { LogServeData logServeData = new LogServeData(); logServeData.hash = GetStackTraceHash(exception); logServeData.title = exception.Message; logServeData.content = exception.StackTrace; logServeData.LogType = 1; logServeData.gameName = gameName; // logServeData.time = (long)(CombatTimerManager.Instance.TimeSinceStartUp() * 1000); logServeData.playerId = playerID; logServeData.v = version; logServeData.DeviceID = deviceModel; logServeData.operatingSystem = operatingSystem; UpdatToServer(logServeData); } catch (Exception e) { } } public void UpLog(string title, string messge) { try { LogServeData logServeData = new LogServeData(); logServeData.hash = GetStackTraceHash(title, messge); logServeData.title = title; logServeData.content = messge; logServeData.LogType = 2; logServeData.gameName = gameName; // logServeData.time = (long)(CombatTimerManager.Instance.TimeSinceStartUp() * 1000); logServeData.playerId = playerID; logServeData.v = version; logServeData.DeviceID = deviceModel; logServeData.operatingSystem = operatingSystem; UpdatToServer(logServeData); } catch (Exception e) { } } private async Task UpdatToServer(LogServeData logServeData) { string json = LitJson.JsonMapper.ToJson(logServeData); byte[] logData = Encoding.UTF8.GetBytes(json); using var httpClient = new HttpClient(); var content = new ByteArrayContent(logData); content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); var response = await httpClient.PostAsync("http://139.155.99.185:5001/api/logserver/upload", content); if (response.IsSuccessStatusCode) { var result = await response.Content.ReadAsStringAsync(); // UnityEngine.Debug.Log($"上传成功: {result}"); } // else // { // UnityEngine.Debug.Log($"上传失败: {response.StatusCode}"); // } } private string GetStackTraceHash(string title, string messge) { var sb = new StringBuilder(); sb.Append(title); sb.Append(messge); return GetStackTraceHash(sb); } private string GetStackTraceHash(Exception ex) { var trace = new StackTrace(ex, true); var sb = new StringBuilder(); foreach (var frame in trace.GetFrames() ?? Array.Empty()) { var method = frame.GetMethod(); if (method?.DeclaringType != null) { sb.Append(method.DeclaringType.FullName) .Append(".") .Append(method.Name) .Append("()"); } } return GetStackTraceHash(sb); } private string GetStackTraceHash(StringBuilder stringBuilder) { using var sha = System.Security.Cryptography.SHA1.Create(); byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(stringBuilder.ToString())); return Convert.ToBase64String(hash); } }