如何将Logstash配置文件解析为JSON?

时间:2015-06-11 20:30:37

标签: javascript json node.js logstash

我有一个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对象。

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

您对我应该做什么有什么建议吗?我需要编写自己的解析器吗?如果是这样,我是否应该参考如何编写这样的解析器?

1 个答案:

答案 0 :(得分:0)

我会基于空格对字符串进行标记,然后运行标记:

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);