使用NLog记录含控制字符的字符串时触发ArgumentException异常的解决咨询
问题描述
我尝试在日志文件中记录以下字符串:
$"{(char)0}{(char)1}{(char)3}{(char)0}{(char)3}{(char)0}{(char)0}{(char)0}{Line}{(char)0}{(char)7}{(char)232}{(char)3}{(char)0}{(char)9}{(char)31}"
其中Line的值为" 59 "(整数值可变化,但长度固定为10)。在监视窗口查看该字符串时,显示包含多个不可见控制字符的内容。
我的NLog配置信息(来自监视窗口):
((System.RuntimeType)_log._loggerType).AssemblyQualifiedName : "NLog.Logger, NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=..." _log._loggerType.IsUnicodeClass : false ...
请问执行Log.Debug($"Commands=[{Commands}]")时,如何避免触发上述ArgumentException异常?
解决方法
- 过滤不可见控制字符
异常通常由字符串中的非打印控制字符(如ASCII 0-31范围内的字符)引发。可以提前对Commands字符串进行清理,保留可打印字符,移除或替换控制字符:
// 保留可打印ASCII字符(32-126)及常用格式符(制表符、换行、回车),其余替换为? var cleanedCommands = new string(Commands.Select(c => (c >= 32 && c <= 126) || c == '\t' || c == '\n' || c == '\r' ? c : '?' ).ToArray()); Log.Debug($"Commands=[{cleanedCommands}]");
根据实际需求调整保留的字符类型,确保日志内容可读且符合输出要求。
- 调整NLog编码配置
由于_loggerType.IsUnicodeClass为false,可能存在编码不兼容问题。在NLog配置文件中明确指定文件目标使用UTF-8编码,提升对特殊字符的支持:
<target xsi:type="File" name="file" fileName="your-log-file.txt" encoding="UTF-8" />
注意:即使编码配置正确,多数日志查看工具仍无法正常显示控制字符,因此过滤字符仍是更可靠的方案。
- 升级NLog版本
你当前使用的NLog 4.0.0.0版本较旧,新版本(如5.x系列)修复了不少字符处理相关的Bug,升级到最新稳定版可能直接解决该异常问题。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

