JavaScript如何处理含引号、花括号等特殊字符的日志字符串并执行操作
解决JavaScript混合日志字符串的格式化与操作方案
核心问题说明
- 硬编码多行字符串用普通双引号包裹时,需要手动转义大量双引号、斜杠,容易出现语法错误
- 内容中混入了多余的反引号
(如properties、becb`)导致JSON结构失效 - 普通日志行与JSON结构行混合,未做分类处理导致字符串操作异常
具体实现步骤
第一步:修正字符串声明方式
使用ES6模板字符串(反引号包裹)替代普通双引号,不需要手动转义内容中的双引号、斜杠,避免声明阶段就出现语法错误。
第二步:清理多余特殊字符
用正则批量清理内容中异常的反引号,以及不必要的转义斜杠。
第三步:拆分解析日志内容
逐行处理内容,区分普通日志和JSON结构日志,分类存储后可直接按需读取字段。
完整可运行代码如下:
// 1. 用模板字符串声明原始内容,无需手动转义特殊字符 let words = `2021-08-03 14:00:49.0430 Info Message Template Auto Format enabled 2021-08-03 14:00:49.4297 Info Adding target ConsoleTarget(Name=consoleLogger) 2021-08-03 14:00:49.8396 Info Found 48 configuration items 2021-08-03 14:00:49.8716 Info Configuration initialized. 2021-08-03 14:00:49.8716 Info NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 4.6.8.10751. Product version: 4.6.8. { "time": "2021-08-03 14:00:50.0625", "thread": "1", "level": "WARN", "message": "Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.", "properties": "path=/root/.aspnet/DataProtection-Keys, EventId_Id=60, EventId=60" } { "time": "2021-08-03 14:00:50.4593", "thread": "1", "level": "WARN", "message": "No XML encryptor configured. Key {153434f7-eab5-4326-a0aa-5973fb78becb} may be persisted to storage in unencrypted form.", "properties": "KeyId=153434f7-eab5-4326-a0aa-5973fb78becb, EventId_Id=35, EventId=35" } { "time": "2021-08-03 14:01:14.0448", "thread": "5", "level": "WARN", "message": "Failed to determine the https port for redirect.", "properties": "EventId_Id=3, EventId_Name=FailedToDeterminePort, EventId=FailedToDeterminePort" }` // 2. 清理异常特殊字符 words = words.replace(/`/g, '').replace(/\\\//g, '/') // 3. 逐行解析分类日志 const logList = words.split('\n').map(line => { line = line.trim() // 判断是否为JSON结构的日志 if (line.startsWith('{') && line.endsWith('}')) { try { return JSON.parse(line) } catch (e) { // 解析失败就返回原始字符串 return line } } return line }) // 测试:输出所有日志内容,JSON结构可直接取字段 console.log(logList) // 示例用法:获取所有WARN级别的日志 // const warnLogs = logList.filter(item => typeof item === 'object' && item.level === 'WARN')
效果说明
- 处理后的字符串可正常调用所有JS原生字符串方法,无特殊字符干扰
- 解析后的
logList数组中,普通日志为字符串类型,JSON日志为对象类型,可直接读取time、level、message等字段 - 所有异常反引号、多余转义符号都已清理,无需额外处理即可直接操作日志内容
内容的提问来源于stack exchange,提问作者Thomas James
相关产品推荐
相关产品推荐

