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'