성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
[공진영] 안녕하세요 좋은글 감사합니다. 현재 제가 wpf로 관제 모...
[정성태] The Windows Registry Adventure #1: ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Logstash - FileBeat을 이용한 IIS 로그 처리</h1> <p> 이제 제법 Logstash에 익숙해졌으니,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Logstash 기본 사용법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12312'>https://www.sysnet.pe.kr/2/0/12312</a> Logstash - 사용자 정의 grok 패턴 추가를 이용한 IIS 로그 처리 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12313'>https://www.sysnet.pe.kr/2/0/12313</a> </pre> <br /> 근래에 더 현실적으로 사용되는 Beat -> Logstash -> Elasticsearch (또는, Beat -> Elasticsearch) 구조를 살펴보겠습니다. 그나저나 Beat는 "수집"만을 전용으로 담당하는 경량화된 모듈이라고 보면 되는데, 데이터의 성격상 여러 Beat 제품으로 나뉘어 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > The Beats family ; <a target='tab' href='https://www.elastic.co/downloads/beats'>https://www.elastic.co/downloads/beats</a> </pre> <br /> <ul> <li>FileBeat</li> <li>Packetbeat</li> <li>Winlogbeat</li> <li>Metricbeat</li> <li>Heartbeat</li> <li>Auditbeat</li> <li>Functionbeat</li> <li>Journalbeat</li> </ul> <br /> 모든 걸 여기서 다룰 수는 없고, 이 글에서는 IIS 로그가 File로 남겨지기 때문에 이를 위한 Filebeat를 사용해 실습을 해보겠습니다. <br /> <br /> <hr style='width: 50%' /><br /> <br /> 자, 그럼 먼저 웹 서버 측에 Filebeat를 다운로드해야겠지요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Download Filebeat (약 24MB) ; <a target='tab' href='https://www.elastic.co/downloads/beats/filebeat'>https://www.elastic.co/downloads/beats/filebeat</a> </pre> <br /> 압축 해제 후, 시작은 .\filebeat.exe를 실행하면 되는데 그전에 yml 파일을 통해 설정을 좀 해야 합니다. <br /> <br /> <ul> <li>fields.yml</li> <li>filebeat.yml</li> <li>filebeat.reference.yml</li> </ul> <br /> 이 중에서 filebeat.reference.yml, fields.yml은 일종의 레퍼런스 문서 역할을 하니 나중에 천천히 보시고, 실질적인 설정을 담당하는 filebeat.yml을 열어 봅니다. (아래는 기본 설치된 filebeat.yml의 주석을 제거한 설정값들을 정리한 것입니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > filebeat.inputs: - type: log enabled: false paths: - /var/log/*.log <span style='color: blue; font-weight: bold'>filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false</span> setup.template.settings: index.number_of_shards: 1 setup.kibana: <span style='color: blue; font-weight: bold'>output.elasticsearch: hosts: ["localhost:9200"]</span> processors: - add_host_metadata: when.not.contains.tags: forwarded - add_cloud_metadata: ~ - add_docker_metadata: ~ - add_kubernetes_metadata: ~ </pre> <br /> 우선 "filebeat.config.modules"의 "path"인 "<span class="tex2jax_ignore">$</span>{path.config}/modules.d" 폴더를 보면 Filebeat이 제공하는 다양한 모듈들에 대한 개별 설정을 담고 있지만 확장자가 ".disabled"로 끝나기 때문에 filebeat이 로드해야 할 모듈(*.yml)에 포함되지 않습니다. 따라서, IIS 모듈이 동작하려면 "<span class="tex2jax_ignore">$</span>{path.config}/modules.d/iis.yml.disabled" 파일의 확장자인 ".disabled"를 제거하고 그 안의 내용을, <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # Module: iis # Docs: <a target='tab' href='https://www.elastic.co/guide/en/beats/filebeat/7.9/filebeat-module-iis.html'>https://www.elastic.co/guide/en/beats/filebeat/7.9/filebeat-module-iis.html</a> - module: iis # Access logs <span style='color: blue; font-weight: bold'>access:</span> enabled: true # Set custom paths for the log files. If left empty, # Filebeat will choose the paths depending on your OS. <span style='color: blue; font-weight: bold'>#var.paths:</span> # Error logs <span style='color: blue; font-weight: bold'>error:</span> enabled: true # Set custom paths for the log files. If left empty, # Filebeat will choose the paths depending on your OS. <span style='color: blue; font-weight: bold'>#var.paths:</span> </pre> <br /> <a target='tab' href='https://www.elastic.co/guide/en/beats/filebeat/7.9/filebeat-module-iis.html'>문서</a>에 따라 "access"의 "var.paths"와 "error"의 "var.paths"를 각각 여러분들의 환경에 맞게 설정/저장해야 합니다. 가령 제 경우에는 다음과 같이 변경했습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > - module: iis access: enabled: true var.paths: [ "C:\\inetpub\\logs\\LogFiles\\*\\*.log" ] error: enabled: true var.paths: [ "C:\\Windows\\System32\\LogFiles\\HTTPERR\\*.log" ] </pre> <br /> 여기까지 설정하고 filebeat.exe을 실행하면 "localhost:9200"의 elasticsearch로 IIS 로그를 보내게 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 약간의 디버깅 용도라고 하면, elasticsearch에 어떤 데이터를 넘기는지 확인하기 위해 logstash를 사용할 수 있습니다. "<a target='tab' href='https://www.sysnet.pe.kr/2/0/12312'>Logstash 기본 사용법</a>" 글의 설명에 따라, logstash의 파이프라인을 다음과 같이 설정하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > input { beats { port => "5044" } } output { stdout { } } </pre> <br /> Filebeats의 iis.yml에 설정된 출력을 Logstash 쪽으로 바꿔주면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > output.logstash: hosts: ["localhost:5044"] </pre> <br /> 예를 들어, C:\Windows\System32\LogFiles\HTTPERR 경로에 에러 항목이 다음과 같은 유형으로 포함되어 있는 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #Software: Microsoft HTTP API 2.0 #Version: 1.0 #Date: 2020-09-02 12:52:59 #Fields: date time c-ip c-port s-ip s-port cs-version cs-method cs-uri streamid sc-status s-siteid s-reason s-queuename 2020-09-07 04:34:46 192.168.0.7 53858 192.168.100.50 8020 - - - - - - <a target='tab' href='https://www.sysnet.pe.kr/2/0/12314'>Timer_MinBytesPerSecond</a> - </pre> <br /> Logstash 콘솔 출력에 이런 내용을 확인할 수 있습니다.<br /> <br /> <pre style='height: 400px; margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { "@timestamp" => 2020-09-07T04:34:55.340Z, "host" => { "architecture" => "x86_64", "ip" => [ [0] "fe80::38cd:62c9:a8a4:d20a", [1] "192.168.100.50" ], "hostname" => "testpc", "mac" => [ [0] "00:15:5d:00:05:2f" ], "id" => "102f9250-5ebd-465d-b42b-b4cd8c09f0f3", "os" => { "build" => "17763.1397", "kernel" => "10.0.17763.1397 (WinBuild.160101.0800)", "family" => "windows", "platform" => "windows", "version" => "10.0", "name" => "Windows Server 2019 Standard" }, "name" => "testpc" }, "event" => { "module" => "iis", "dataset" => "iis.error" }, "fileset" => { "name" => "error" }, "@version" => "1", "agent" => { "ephemeral_id" => "a533d7f7-b4b8-4ee8-abe1-426091f010ca", "type" => "filebeat", "hostname" => "testpc", "id" => "c16e0429-6ffa-4f17-afa4-32be234ffdbb", "version" => "7.9.1", "name" => "testpc" }, "tags" => [ [0] "beats_input_codec_plain_applied" ], "service" => { "type" => "iis" }, "ecs" => { "version" => "1.5.0" }, "input" => { "type" => "log" }, "message" => "2020-09-07 04:34:46 192.168.0.7 53858 192.168.100.50 8020 - - - - - - Timer_MinBytesPerSecond -", "log" => { "offset" => 370319, "file" => { "path" => "C:\\Windows\\System32\\LogFiles\\HTTPERR\\httperr13.log" } } } </pre> <br /> 그런데, 보는 바와 같이 beats가 보내주는 내용이 꽤 많으므로 만약 이 내용을 그대로 Elasticsearch에 보내면 용량이 꽤나 부담스러울 것입니다. (대부분 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12313#remove_field'>mutate/remove_field</a>의 조합으로 잘라내고 싶겠죠. ^^ 그래서 현실적인 이유로 봤을 때 "Beats -> Logstash -> Elasticsearch" 구조가 주로 사용될 것입니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그나저나, logstash가 Filebeat로 받은 데이터를 보면 중간에 beats_input_codec_plain_applied 항목을 담은 "tags"가 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { "@timestamp" => 2020-09-07T04:37:39.988Z, "event" => { "module" => "iis", "dataset" => "iis.access" }, ...[생략]... }, <span style='color: blue; font-weight: bold'>"tags" => [ [0] "beats_input_codec_plain_applied"</span>] ], "service" => { "type" => "iis" }, ...[생략]... } </pre> <br /> 이전의 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12313#grokparsefailure'>_grokparsefailure</a>, <a target='tab' href='https://www.sysnet.pe.kr/2/0/12313#geoip_lookup_failure'>_geoip_lookup_failure</a> 경험을 보면 tags에 뭔가 메시지가 있다는 것은 부정적인 의미로 비치는데요, 이에 대해 검색을 해보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > The tag “beats_input_codec_plain_applied” present in every document in Kibana ; <a target='tab' href='https://stackoverflow.com/questions/61782692/the-tag-beats-input-codec-plain-applied-present-in-every-document-in-kibana'>https://stackoverflow.com/questions/61782692/the-tag-beats-input-codec-plain-applied-present-in-every-document-in-kibana</a> </pre> <br /> 다행히도, Beats 구성 요소가 생성하는 메시지는 전부 저 항목을 포함하고 있다고 합니다. 따라서, (그냥 무시해도 되지만) 이 항목을 (elasticsearch 서버의 디스크 공간을 절약하기 위해) 없애려면 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12313#remove_field'>mutate/remove_field</a>로 잘라내거나,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > if "beats_input_codec_plain_applied" in [tags] { mutate { remove_tag => ["beats_input_codec_plain_applied"] } } </pre> <br /> 아니면, input 단계에서 include_codec_tag 옵션을 추가할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > input { beats { port => "5044" <span style='color: blue; font-weight: bold'>include_codec_tag => false</span> } } </pre> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, filebeat 실행 시 다음과 같은 식의 오류가 발생한다면?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\beat\filebeat> <span style='color: blue; font-weight: bold'>filebeat.exe</span> <span style='color: blue; font-weight: bold'>Exiting: Failed to start crawler: creating module reloader failed: 1 error: invalid config: yaml: line 11: found unknown escape character loading configs</span> github.com/elastic/beats/v7/libbeat/cfgfile.(*Reloader).Check /go/src/github.com/elastic/beats/libbeat/cfgfile/reload.go:143 github.com/elastic/beats/v7/filebeat/beater.(*crawler).Start /go/src/github.com/elastic/beats/filebeat/beater/crawler.go:91 github.com/elastic/beats/v7/filebeat/beater.(*Filebeat).Run /go/src/github.com/elastic/beats/filebeat/beater/filebeat.go:438 github.com/elastic/beats/v7/libbeat/cmd/instance.(*Beat).launch /go/src/github.com/elastic/beats/libbeat/cmd/instance/beat.go:456 github.com/elastic/beats/v7/libbeat/cmd/instance.Run.func1 /go/src/github.com/elastic/beats/libbeat/cmd/instance/beat.go:189 github.com/elastic/beats/v7/libbeat/cmd/instance.Run /go/src/github.com/elastic/beats/libbeat/cmd/instance/beat.go:190 github.com/elastic/beats/v7/libbeat/cmd.genRunCmd.func1 /go/src/github.com/elastic/beats/libbeat/cmd/run.go:36 github.com/spf13/cobra.(*Command).execute /go/pkg/mod/github.com/spf13/cobra@v0.0.3/command.go:766 github.com/spf13/cobra.(*Command).ExecuteC /go/pkg/mod/github.com/spf13/cobra@v0.0.3/command.go:852 github.com/spf13/cobra.(*Command).Execute /go/pkg/mod/github.com/spf13/cobra@v0.0.3/command.go:800 main.main /go/src/github.com/elastic/beats/x-pack/filebeat/main.go:22 runtime.main /usr/local/go/src/runtime/proc.go:203 runtime.goexit /usr/local/go/src/runtime/asm_amd64.s:1373 </pre> <br /> filebeat.yml이나 각 module의 yml 설정에서 파일 경로에 대한 구분자로 단일 '\' 문자를 사용했는지 확인해 봅니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > var.paths: [ "C:\inetpub\logs\LogFiles\*\*.log" ] </pre> <br /> 저렇게 하면 escape 문자로 취급하기 때문에 반드시 2개 연속으로 디렉터리 구분자를 사용해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > var.paths: [ "C:\\inetpub\\logs\\LogFiles\\*\\*.log" ] </pre> <br /> 또는, *nix 식 구분자를 사용하거나.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > var.paths: [ "C:/inetpub/logs/LogFiles/*/*.log" ] </pre> <br /> <hr style='width: 50%' /><br /> <br /> 마지막으로, 혹시 docker나 k8s에 대한 Beats의 활용이 궁금하신 분은 다음의 영상 강좌를 참고해 보는 것도 좋겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Beats 및 Elasticsearch를 이용한 Docker & Kubernetes 로그 수집 및 모니터링 ; <a target='tab' href='https://www.elastic.co/kr/webinars/elasticsearch-log-collection-with-kubernetes-docker-and-containers/?view=1'>https://www.elastic.co/kr/webinars/elasticsearch-log-collection-with-kubernetes-docker-and-containers/?view=1</a> </pre> <br /> <br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1317
(왼쪽의 숫자를 입력해야 합니다.)