Ver Fonte

fix(转链日志): 截断超长文本字段

按 UTF-8 字节数限制写入 MySQL TEXT 的原始响应和内容字段,兼容中文及代理对,避免超长日志导致批量入库失败。
dodo hold há 21 horas atrás
pai
commit
3fa8d440b0

+ 36 - 6
molilian.core/Core/log/base.cs

@@ -1,8 +1,9 @@
 using dodohold.core;
-using CSRedis;
-using System.Data;
-using System.Diagnostics;
-using YunhuiKit;
+using CSRedis;
+using System.Data;
+using System.Diagnostics;
+using System.Text;
+using YunhuiKit;
 using static ICSharpCode.SharpZipLib.Zip.ExtendedUnixData;
 
 
@@ -21,8 +22,37 @@ namespace molilian.core
         private const int StatsHourlyExpireSeconds = 7 * 86400;
         private const int StatsDailyExpireSeconds = 90 * 86400;
         private const int StatsMonthlyExpireSeconds = 366 * 86400;
-
-        public static async Task<int> BatchInsertLogDBAsync(int limit)
+        private const int MySqlTextMaxBytes = 65_535;
+
+        /// <summary>
+        /// Truncates a value to the maximum byte length supported by a MySQL TEXT column.
+        /// The limit is measured in UTF-8 bytes rather than UTF-16 characters so Chinese
+        /// characters and surrogate pairs are handled correctly.
+        /// </summary>
+        private static string? TruncateMySqlText(string? value)
+        {
+            if (string.IsNullOrEmpty(value))
+            {
+                return value;
+            }
+
+            int byteCount = 0;
+            int charCount = 0;
+            foreach (Rune rune in value.EnumerateRunes())
+            {
+                if (byteCount + rune.Utf8SequenceLength > MySqlTextMaxBytes)
+                {
+                    break;
+                }
+
+                byteCount += rune.Utf8SequenceLength;
+                charCount += rune.Utf16SequenceLength;
+            }
+
+            return charCount == value.Length ? value : value[..charCount];
+        }
+
+        public static async Task<int> BatchInsertLogDBAsync(int limit)
         {
             await semaphore.WaitAsync().ConfigureAwait(false);
             try

+ 1 - 1
molilian.core/Core/log/cps.cs

@@ -104,7 +104,7 @@ namespace molilian.core
                 .Add("accountId", data.accountId)
                 .Add("accountName", data.accountName)
                 .Add("proxy_node", data.proxy_node)
-                .Add("rawContent", data.rawContent)
+                .Add("rawContent", TruncateMySqlText(data.rawContent))
                 .Add("rawContent2", data.rawContent2)
                 .Add("success", data.success)
                 .Add("message", data.message)

+ 1 - 1
molilian.core/Core/log/deeplink.cs

@@ -216,7 +216,7 @@ namespace molilian.core
                 .Add("success", data.success)
                 .Add("message", data.message)
                 .Add("reason", data.reason)
-                .Add("content", content)
+                .Add("content", TruncateMySqlText(content))
                 .Add("ip", data.ip)
                 .Add("oaid", data.oaid)
                 .Add("deeplink_url", data.deeplink_url)

+ 4 - 4
molilian.core/Core/log/dy.cs

@@ -29,11 +29,11 @@ namespace molilian.core
                         .Add("accountId", data.accountId)
                         .Add("accountName", data.accountName)
                         .Add("proxy_node", data.proxy_node)
-                        .Add("rawContent", data.rawContent)
+                        .Add("rawContent", TruncateMySqlText(data.rawContent))
                         .Add("success", data.success)
                         .Add("message", data.message)
                         .Add("reason", data.reason)
-                        .Add("content", data.content)
+                        .Add("content", TruncateMySqlText(data.content))
                         .Add("itemId", data.itemId)
                         .Add("itemName", data.itemName)
                         .Add("pic", data.pic)
@@ -90,11 +90,11 @@ namespace molilian.core
                         .Add("accountId", data.accountId)
                         .Add("accountName", data.accountName)
                         .Add("proxy_node", data.proxy_node)
-                        .Add("rawContent", data.rawContent)
+                        .Add("rawContent", TruncateMySqlText(data.rawContent))
                         .Add("success", data.success)
                         .Add("message", data.message)
                         .Add("reason", data.reason)
-                        .Add("content", data.content)
+                        .Add("content", TruncateMySqlText(data.content))
                         .Add("itemId", data.itemId)
                         .Add("itemName", data.itemName)
                         .Add("pic", data.pic)

+ 2 - 2
molilian.core/Core/log/jd.cs

@@ -259,11 +259,11 @@ namespace molilian.core
                 .Add("proxy_name", data.proxy_name)
                 .Add("proxy_node", data.proxy_node)
                 .Add("curl_proxy", data.curl_proxy)
-                .Add("rawContent", data.rawContent)
+                .Add("rawContent", TruncateMySqlText(data.rawContent))
                 .Add("success", data.success)
                 .Add("message", data.message)
                 .Add("reason", data.reason)
-                .Add("content", data.content)
+                .Add("content", TruncateMySqlText(data.content))
                 .Add("itemId", data.itemId)
                 .Add("itemName", data.itemName)
                 .Add("pic", data.pic)

+ 2 - 2
molilian.core/Core/log/ks.cs

@@ -163,11 +163,11 @@ namespace molilian.core
                 .Add("accountId", data.accountId)
                 .Add("accountName", data.accountName)
                 .Add("proxy_node", data.proxy_node)
-                .Add("rawContent", data.rawContent)
+                .Add("rawContent", TruncateMySqlText(data.rawContent))
                 .Add("success", data.success)
                 .Add("message", data.message)
                 .Add("reason", data.reason)
-                .Add("content", data.content)
+                .Add("content", TruncateMySqlText(data.content))
                 .Add("itemId", data.itemId)
                 .Add("itemName", data.itemName)
                 .Add("pic", data.pic)

+ 2 - 2
molilian.core/Core/log/pdd.cs

@@ -168,12 +168,12 @@ namespace molilian.core
                 .Add("accountId", data.accountId)
                 .Add("accountName", data.accountName)
                 .Add("proxy_node", data.proxy_node)
-                .Add("rawContent", data.rawContent)
+                .Add("rawContent", TruncateMySqlText(data.rawContent))
                 .Add("rawContent2", data.rawContent2)
                 .Add("success", data.success)
                 .Add("message", data.message)
                 .Add("reason", data.reason)
-                .Add("content", data.content)
+                .Add("content", TruncateMySqlText(data.content))
                 .Add("itemId", data.itemId)
                 .Add("itemName", data.itemName)
                 .Add("pic", data.pic)

+ 2 - 2
molilian.core/Core/log/taobao.cs

@@ -169,11 +169,11 @@ namespace molilian.core
                 .Add("accountName", data.accountName)
                 .Add("proxy_node", data.proxy_node)
                 .Add("tkEndpoint", data.tkEndpoint)
-                .Add("rawContent", data.rawContent)
+                .Add("rawContent", TruncateMySqlText(data.rawContent))
                 .Add("success", data.success)
                 .Add("message", data.message)
                 .Add("reason", data.reason)
-                .Add("content", data.content)
+                .Add("content", TruncateMySqlText(data.content))
                 .Add("mktId", data.mktId)
                 .Add("itemId", data.itemId)
                 .Add("itemName", data.itemName)

+ 4 - 4
molilian.core/Core/log/tool.cs

@@ -29,11 +29,11 @@ namespace molilian.core
                         new DBContext.Table(connection, "tool_parse_logs_test")
                             .Add("end_point", data.end_point)
                             .Add("channel", (int)data.channel)
-                            .Add("rawContent", data.rawContent)
+                            .Add("rawContent", TruncateMySqlText(data.rawContent))
                             .Add("success", data.success)
                             .Add("message", data.message)
                             .Add("reason", data.reason)
-                            .Add("content", data.content)
+                            .Add("content", TruncateMySqlText(data.content))
                             .Add("taoToken", data.taoToken)
                             .Add("shortLinkurl", data.shortLinkurl)
                             .Add("deeplink_url", data.deeplink_url)
@@ -49,11 +49,11 @@ namespace molilian.core
                         new DBContext.Table(connection, daily_table)
                             .Add("end_point", data.end_point)
                             .Add("channel", (int)data.channel)
-                            .Add("rawContent", data.rawContent)
+                            .Add("rawContent", TruncateMySqlText(data.rawContent))
                             .Add("success", data.success)
                             .Add("message", data.message)
                             .Add("reason", data.reason)
-                            .Add("content", data.content)
+                            .Add("content", TruncateMySqlText(data.content))
                             .Add("taoToken", data.taoToken)
                             .Add("shortLinkurl", data.shortLinkurl)
                             .Add("deeplink_url", data.deeplink_url)

+ 3 - 3
molilian.core/Core/log/第三方旧接口.cs

@@ -52,7 +52,7 @@ namespace molilian.core
                         .Add("channel", (int)data.channel)
                         .Add("accountId", data.accountId)
                         .Add("accountName", data.accountName)
-                        .Add("rawContent", data.rawContent)
+                        .Add("rawContent", TruncateMySqlText(data.rawContent))
                         .Add("rawContent2", data.rawContent2)
                         .Add("success", data.success)
                         .Add("message", data.message)
@@ -160,12 +160,12 @@ namespace molilian.core
                   .Add("channel", (int)data.channel)
                   .Add("accountId", data.accountId)
                   .Add("accountName", data.accountName)
-                  .Add("rawContent", data.rawContent)
+                  .Add("rawContent", TruncateMySqlText(data.rawContent))
                   .Add("rawContent2", data.rawContent2)
                   .Add("success", data.success)
                   .Add("message", data.message)
                   .Add("reason", data.reason)
-                  .Add("content", data.content)
+                  .Add("content", TruncateMySqlText(data.content))
                   .Add("couponAmount", data.couponAmount)
                   .Add("itemId", data.itemId)
                   .Add("itemName", data.itemName)