syslog-ng의 csv-parser에서 값 추출

syslog-ng의 csv-parser에서 값 추출

csv-parser를 사용하여 syslog-ng에서 수집되고 디스크에 기록되는 csv 형식의 syslog 피드가 있습니다.

내가 이해하는 바에 따르면, csv-parser를 사용하면 들어오는 데이터에 대한 syslog-ng 컨텍스트를 제공하고 값이 무엇을 의미하는지를 알 수 있습니다. 해당 컨텍스트를 사용하여 syslog-ng가 해당 논리를 기반으로 필터를 적용하도록 하고 싶습니다.

예를 들어 csv 열 중 하나가 특정 값과 일치하는 경우에만 디스크에 이벤트를 기록하고 싶습니다.

CSV 파서선적 서류 비치이것이 가능해야 한다고 제안하는 것 같습니다.

내 구성은 다음과 같습니다.

parser p_my_app {
    csv-parser(
        columns("MY_APP.COLOUR","MY_APP.SIZE","MY_APP.SERIAL_NUMBER")
        delimiters(",")
        flags(escape-double-char)
    );
};

source s_my_app {
    syslog(ip(0.0.0.0) port(6514)
        transport("tcp")
    );
}; 

filter f_my_app { 
    match("123456" value("MY_APP.SERIAL_NUMBER") );
};

destination d_my_app { 
    file("/var/log/my_app.log"
        create_dirs(yes)
    ); 
};

log { 
    source(s_my_app);
    filter(f_my_app);
    parser(p_my_app);
    destination(d_my_app); 
};

하지만 아무리 노력해도 일치하지 않는 것 같습니다. 해당 구성의 sylog-ng 디버그 출력은 다음과 같습니다.

Incoming log entry; line='<14>1 2017-01-18T17:46:38+11:00 hostname  - - - red,large,123456
'
Filter rule evaluation begins; rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'
Filter node evaluation result; result='not-match'
Filter rule evaluation result; result='not-match', rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'

나는 (희망?) 정말 분명한 것을 놓치고 있지만 몇 시간 동안 인터넷 검색을 한 후에도 온라인에서 완전한 예를 찾을 수 없으며 결코 작동하지 않는 것 같은 추출만 찾을 수 있습니다. 내가 뭘 잘못하고 있는지 확인하거나 완전한 작업 예제를 제공할 수 있는 사람이 있나요?

답변1

글쎄요, 늘 그렇듯이 저는 한 문제에 대해 일주일을 보내고, 포기하고, 도움을 구하기로 결정했습니다. 그런 다음 한 시간 후에 스스로 해결책을 찾아냅니다.

내 문제는 명세서에 있는 항목의 순서였습니다 log(). 구체적으로, parser()라인해야 하다진술 앞에 있어야합니다 filter().

실제로,선적 서류 비치(10번 읽었지만 놓쳤음에 틀림없음)은 다음과 같이 말합니다.

메모 로그 문의 필터, 다시 쓰기 규칙 및 파서는 순차적으로 처리되므로 순서가 중요합니다.

따라서 작업 코드는 다음을 사용하는 것입니다.

log { 
    source(s_my_app);
    parser(p_my_app);
    filter(f_my_app);
    destination(d_my_app); 
};

또한 주목해야 할 또 다른 사항은 match()실제로 정규식이어야 하므로 명확성을 높이기 위해 필터도 다음과 같이 업데이트했습니다.

filter f_my_app { 
    match("123456" value("MY_APP.SERIAL_NUMBER") type("string"));
};

이제 syslog-ng가 다음을 보고합니다.

Incoming log entry; line='<14>1 2017-01-18T17:46:38+11:00 hostname  - - - red,large,123456
'
Message parsing complete; result='1', rule='p_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:14:2'
Filter rule evaluation begins; rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'
Filter node evaluation result; result='match'
Filter rule evaluation result; result='match', rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'

관련 정보