【问题标题】:How do I parse a Logstash configuration file into JSON?如何将 Logstash 配置文件解析为 JSON?
【发布时间】:2015-06-11 20:30:36
【问题描述】:

我有一个如下格式的 Logstash 配置文件:

input {
    twitter {
        keywords => ["apples","bananas",  "cherries",
                       "lettuce", "tomatoes"]
        follows => ["@sirwebber"]
        ... additional parameters ... 
    }
}

output {
    elasticsearch {
        ... similar types of configuration stuff ...
    }
}

我想将其解析为 Node.js 中的 JSON 对象。所以我正在寻找类似的东西:

{
    "input": {
        "twitter": {
            "keywords": ["apples","bananas","cherries","lettuce","tomatoes"],
            "follows": ["@sirwebber"],
            ... additional parameters ...                 
        }
    },
    "output": {
       ... similar format ... 
    }
}

我的第一次尝试是将文件作为字符串读取,然后解析换行符(在区分我对输入还是输出感兴趣之后)。然后我在 '=>' 上拆分,我能够创建一个带有所需键和值的 JavaScript 对象。

只要我的值不跨越多行,这种方法就有效。但是,我想确保解析器在一般情况下工作(可以包括数组中项目之间的空格)。

你对我应该怎么做有什么建议吗?我需要编写自己的解析器吗?如果是这样,关于如何编写这样的解析器,我应该参考什么好的资源?

【问题讨论】:

  • 我不太了解 logstash 配置,但一种天真的方法是:1. 将所有出现的 "=>" 替换为 ":" 2. 当你遇到 "{" 字符时,如果它前面有一个不同于“:”的字符,则在前面加上“:”。

标签: javascript json node.js logstash


【解决方案1】:

我会根据空格对字符串进行标记,然后遍历标记:

var str = "input {\n\
         twitter {\n\
           keywords => [\"apples\",\"bananas\",\"cherries\"]\n\
           follows => [\"@sirwebber\"]\n\
         }\n\
       }\n\
       \n\
       output {\n\
           elasticsearch {\n\
               something =>\n\
                  [\"hello\"]\n\
           }\n\
       }";

var tokens = str.split(/\s+/);
var js = "{"; 
var prev = '';
for (var i = 0; i < tokens.length; i++) {
    var next = i+1 < tokens.length ? tokens[i+1] : '';
    switch(tokens[i]) {
        case '{':
            js += ":{";
            break;
        case '=>': 
            js += ":";
            break;
        default:
            if (next == "{" || next == '=>') { js += '"'; }
            js += tokens[i] + (((prev == '=>' || prev=='}') && (next != '}' && next != '' && next != '{') )? ',' : '');
            if (next == "{" || next == '=>') { js += '"'; }
            break;
    }
    prev = tokens[i];
}
js += '}';
JSON.parse(js);

【讨论】:

  • 感谢您的帮助!这并不能完全解决我正在寻找的东西。特别是,如果数组中的项目之间有空格或换行符,则它不起作用。我已经更新了我的问题以更好地展示这些案例。再次感谢您的帮助!
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多