Azure WebJob日志控制台显示乱码,Rider输出正常的问题求助
问题解答
核心原因分析
你遇到的Azure日志乱码问题,大概率不是输出编码设置的问题,而是WebSocket接收数据时的编码转换错误,或者原始JSON字符串中包含了Azure日志控制台无法解析的不可见控制字符(比如Binance UserStream可能附带的心跳包标记、特殊分隔符等)。直接设置Console.OutputEncoding = Encoding.UTF8无法解决,因为问题根源不在输出环节。
具体解决方案
- 确保WebSocket接收数据时的编码正确
Binance UserStream返回的是UTF-8编码的JSON数据,接收字节数组转字符串时必须显式指定UTF-8编码,不能依赖系统默认编码:
// 示例:WebSocket接收字节转字符串 byte[] receivedBytes = await webSocket.ReceiveAsync(buffer, CancellationToken.None); string jsonString = Encoding.UTF8.GetString(receivedBytes, 0, receivedBytes.Length);
如果这里用了Encoding.Default或者其他编码,会直接导致字符串包含乱码字符,后续输出到任何控制台都会有问题。
- 过滤无效字符并格式化JSON输出
不要直接输出原始WebSocket字符串,先解析并格式化JSON,自动过滤不可见控制字符:
using Newtonsoft.Json; // 需要安装Newtonsoft.Json NuGet包 try { // 先解析JSON对象,确保格式合法 var jsonObject = JsonConvert.DeserializeObject(jsonString); // 格式化后输出,保证是标准JSON格式 string formattedJson = JsonConvert.SerializeObject(jsonObject, Formatting.Indented); Console.WriteLine(formattedJson); } catch (JsonException ex) { Console.WriteLine($"JSON解析失败: {ex.Message}"); }
如果使用System.Text.Json,代码类似:
using System.Text.Json; try { var jsonDocument = JsonDocument.Parse(jsonString); string formattedJson = JsonSerializer.Serialize(jsonDocument, new JsonSerializerOptions { WriteIndented = true }); Console.WriteLine(formattedJson); } catch (JsonException ex) { Console.WriteLine($"JSON解析失败: {ex.Message}"); }
- 改用专业日志框架替代Console.WriteLine
Azure WebJob的日志系统对Console输出的兼容性不如专业日志框架(比如Serilog、NLog)。用日志框架记录JSON,能自动处理编码和字符过滤问题:
// 示例:Serilog配置及使用 Log.Logger = new LoggerConfiguration() .WriteTo.Console() .CreateLogger(); Log.Information("Binance UserStream数据: {JsonData}", jsonString);
部署到Azure后,日志会自动同步到Azure Monitor,不会出现乱码。
总结
不需要对合法JSON字符串额外转义,重点排查WebSocket接收时的编码转换和原始字符串中的无效控制字符,改用格式化输出或专业日志框架即可解决问题。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

