이 프로젝트의 목표, 설계 및 구현에 대한 자세한 내용은 이 블로그 게시물을 확인하세요.
Ekanite 는 텍스트 검색 기능이 내장된 고성능 syslog 서버입니다. 그 목표는 몇 가지 일을 잘 수행하는 것입니다. 즉, 네트워크를 통해 로그 메시지를 받아들이고 메시지를 쉽게 검색할 수 있도록 하는 것입니다. 기능이 부족한 것은 초점을 맞추는 것입니다. Go가 내장되어 있어 외부 종속성이 없으므로 배포가 쉽습니다.
기능은 다음과 같습니다:
검색은 bleve 검색 라이브러리를 사용하여 구현됩니다. 블레브의 성능 분석과 Ekanite에서 사용하는 샤딩 기술에 대한 내용은 이 게시물을 확인하세요.
OSX 및 Linux에서 실행하는 가장 빠른 방법은 사전 빌드된 릴리스 바이너리를 다운로드하는 것입니다. Github 릴리스 페이지에서 이러한 바이너리를 찾을 수 있습니다. 일단 설치되면 다음과 같이 Ekanite를 시작할 수 있습니다.
ekanited -datadir ~ /ekanite_data # Or any directory of your choice.
모든 Ekanite 옵션을 보려면 명령줄에서 -h
전달하세요.
최신 코드를 원하거나 플랫폼용으로 사전 구축된 바이너리를 사용할 수 없기 때문에 Ekanite를 빌드하려는 경우 CONTRIBUTING.md를 살펴보세요.
현재 Ekanite가 로그를 허용하려면 로그 줄이 RFC5424를 준수하고 다음 형식을 따르도록 syslog 클라이언트를 구성해야 합니다.
<PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROC-ID MSGID MSG"
이러한 각 필드가 무엇인지 알아보려면 RFC를 참조하세요. TIMESTAMP 필드는 RFC3339 형식이어야 합니다. rsyslog와 syslog-ng는 모두 템플릿을 지원하므로 해당 프로그램이 로그 형식을 올바르게 지정하고 로그를 Ekanite로 전송하는 것이 매우 쉽습니다 . 두 시스템 모두에 대한 템플릿과 설치 지침은 다음과 같습니다.
rsyslog
# Send messages to Ekanite over TCP using the template. Assumes Ekanite is listening on 127.0.0.1:5514
$template Ekanite,"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% - %msg%n"
*.* @@127.0.0.1:5514;Ekanite
이 템플릿을 /etc/rsyslog.d/23-ekanite.conf
에 추가한 다음 sudo service rsyslog restart
명령을 사용하여 rsyslog를 다시 시작합니다.
syslog-ng
source s_ekanite {
system(); # Check which OS & collect system logs
internal(); # Collect syslog-ng logs
};
template Ekanite { template("<${PRI}>1 ${ISODATE} ${HOST} ${PROGRAM} ${PID} - $MSGn"); template_escape(no) };
destination d_ekanite {
tcp("127.0.0.1" port(5514) template(Ekanite));
};
log {
source(s_ekanite);
destination(d_ekanite);
};
이 템플릿을 /etc/syslog-ng/syslog-ng.conf
에 추가한 다음 /etc/init.d/syslog-ng restart
명령을 사용하여 syslog-ng를 다시 시작합니다.
이러한 변경 사항이 적용되면 rsyslog 또는 syslog-ng는 계속해서 기존 대상으로 로그를 보내고 Ekanite에도 로그를 전달합니다.
현재 검색 지원은 매우 간단합니다. 간단한 텔넷과 유사한 인터페이스와 브라우저 기반 쿼리 인터페이스의 두 가지 옵션이 있습니다.
쿼리 서버에 텔넷으로 연결하고(명령줄 옵션 참조) 검색어를 입력합니다. 지원되는 쿼리 언어는 bleve에서 지원하는 간단한 언어이지만 특정 필드 값 검색을 포함하여 보다 정교한 쿼리 구문이 곧 지원될 예정입니다.
예를 들어, 아래는 Wordpress 사이트의 로그인 URL에 대한 액세스를 보여주는 검색 세션의 예입니다. 텔넷 클라이언트는 쿼리 서버에 연결하고 login
문자열을 입력합니다.
$ telnet 127.0.0.1 9950
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
login
<134>0 2015-05-05T23:50:17.025568+00:00 fisher apache-access - - 65.98.59.154 - - [05/May/2015:23:50:12 +0000] "GET /wp-login.php HTTP/1.0" 200 206 "-" "-"
<134>0 2015-05-06T01:24:41.232890+00:00 fisher apache-access - - 104.140.83.221 - - [06/May/2015:01:24:40 +0000] "GET /wp-login.php?action=register HTTP/1.0" 200 206 "http://www.philipotoole.com/" "Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.17"
<134>0 2015-05-06T01:24:41.232895+00:00 fisher apache-access - - 104.140.83.221 - - [06/May/2015:01:24:40 +0000] "GET /wp-login.php?action=register HTTP/1.1" 200 243 "http://www.philipotoole.com/wp-login.php?action=register" "Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.17"
<134>0 2015-05-06T02:47:54.612953+00:00 fisher apache-access - - 184.68.20.22 - - [06/May/2015:02:47:51 +0000] "GET /wp-login.php HTTP/1.1" 200 243 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17"
<134>0 2015-05-06T04:20:49.008609+00:00 fisher apache-access - - 193.104.41.186 - - [06/May/2015:04:20:46 +0000] "POST /wp-login.php HTTP/1.1" 200 206 "-" "Opera 10.00"
아마도 해당 URL에 대한 POST
액세스만 검색하고 싶을 수도 있습니다.
login -GET
<134>0 2015-05-06T04:20:49.008609+00:00 fisher apache-access - - 193.104.41.186 - - [06/May/2015:04:20:46 +0000] "POST /wp-login.php HTTP/1.1" 200 206 "-" "Opera 10.00"
보다 정교한 클라이언트 프로그램이 계획되어 있습니다.
브라우저 기반 인터페이스는 Telnet 섹션에 설명된 것과 동일한 bleve 스타일 쿼리도 허용합니다. 기본적으로 브라우저 인터페이스는 http://localhost:8080에서 사용할 수 있습니다. 예시 세션이 아래에 나와 있습니다.
기본적인 통계 및 진단이 가능합니다. 이 정보를 검색하려면 http://localhost:9951/debug/vars
방문하세요. 호스트와 포트는 -diag
명령줄 옵션을 통해 변경할 수 있습니다.
이제 아키텍처는 3가지 쉬운 단계를 통해 기본 syslog를 넘어 새로운 파서를 쉽게 구현할 수 있도록 지원합니다.
input/parser.go
에서 supportFormats()를 확장하여 추가 표준 및 이름을 캡처합니다.parser/
에서 적절한 정규식 문을 사용하여 새로운 입력 형식 파서를 만듭니다.timestamp
필드(예: 2006-01-02T15:04:05Z07:00
가 포함되어 있는지 확인하세요.input/parser.go
로 돌아가 NewParser()를 업데이트하여 새 입력 형식 파서를 올바르게 인스턴스화합니다. 프로젝트는 적극적으로 유지 관리되지 않지만 향후 개발이 다시 발생할 수 있습니다.