반응형

https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html

 

 

INPUT

input {

file {

path => "/var/log/sniper3.log"

start_position => beginning

}

}

 

(path => "/var/log/sniper3.log")

 자신이 원하는 소스들을 넣어준다. 위에서는 로그파일을 소스로 넣었으며, 해당 경로를 정확하게 입력해주어야 한다.  

 

(start_position => beginning)

을 설정을 안할경우 리눅스에서 tail sniper3.log와 비슷하게 읽게 된다.

맨 앞부터 읽을려면 beginning으로 설정을 해주어야 한다.

 

 

Filter

 

filter {
    grok
{
        match
=> { "message" => "%{COMBINEDAPACHELOG}"}
   
}
}

설명 -> grok 이라는 플로그인 사용

 

 

반응형
반응형

https://www.elastic.co/guide/en/logstash/current/index.html

 

 

logstash 기초 예제

 

logstash -e 는 바로 명령어를 칠 수 있도록 해주는 옵션이다.

 

메시지의 시간과 IP를 보여준다.

 

종료 할려면 Ctrl + D 를 누르면 된다.

반응형
반응형

출처: http://addio3305.tistory.com/43

 

Log4j는 자바기반의 로깅 유틸리티로, Apache에서 만든 오픈소스 라이브러리다. 

갑자기 로그라고 하면 이게 무엇인가, 그걸 대체 어따 써먹는것인가!!!! 라고 생각할 수 있지만, 로그는 우리가 굉장히 많이 쓰고 있다. 예를 들어서, 개발을 하다가 어떤 변수의 값을 확인하고 싶으면 자연스럽게

System.out.println()으로 출력을 하는데, 이런것들이 모두 로그의 한 종류라고 생각할 수 있다. 그러면 그냥 System.out.println()으로 출력하면 되는데 왜 귀찮게 다른걸 사용하냐는 의문이 들 수 있다.

사실 우리가 혼자서 그냥 연습삼아 프로젝트를 만들거나 하면 System.out.println()은 큰 문제가 없지만, 실제 프로젝트는 혼자서 하는것도 아니고, 또 시스템 운영시에는 큰 문제를 야기한다.


간단하게 살펴보면

1) 운영시에 불필요한 로그가 계속 출력된다. - 시스템을 개발하고 운영할 때, System.out.println()을 모두 찾아    서 지워준다면 몰라도, 거의 대부분은 그냥 한다....ㅡ_ㅡ; 그러면 쓸모없는 로그로 아까운 리소스가 낭비된      다.


2) 모든 로그를 지워버리면, 에러가 났을경우, 그 에러 원인을 찾기가 어려울 수도 있다. - 예를 들어, 시스템에 

   중대한 에러가 날 경우, 로그를 출력해놓도록 해놨는데, 위에서 System.out.println을 모두 지워버렸다면, 로

   그가 안남을 수도 있다.


3) 성능에 큰 영향을 미친다. - 사실 가장 중요한 문제다. 우리가 프로그램을 실행하다가 System.out.println()

   을 굉장히 많이 호출하면 프로그램의 전체적인 성능이 떨어지는것을 확인할 수 있다. 예를 들어 1부터 100까

   지를 모두 더하는 프로그램을 만들었을때, 로그를 하나도 안찍으면 정말 0.01초도 안걸려서 끝나지만, 그 계

   산과정을 모두 System.out.println()으로 화면에 찍어보면....한참 걸린다... 특히 다중사용자를 처리해야 하

   는 웹에서 System.out.println()은 정말 큰 문제를 만들어버린다. 


Log4j는 위에서 간단히 이야기 한 문제점을들 손쉽게 해결할 수 있다. 

Logj4는 시스템의 성능에 큰 영향을 미치지 않으면서도, 옵션 설정을 통해서 다양한 로깅 방법을 제공한다.

환경설정을 통해서 선택적인 로그를 남긴다거나, 특정 파일등에 로그를 생성하는 등 다양한 이점을 가지고 있다. 


Log4j의 구조는 다음과 같다.  


 요소

 설명

Logger

 출력할 메시지를 Appender에 전달한다.

Appender

 전달된 로그를 어디에 출력할 지 결정한다. (콘솔 출력, 파일 기록, DB 저장 등)

Layout

 로그를 어떤 형식으로 출력할 지 결정한다.

 


Log4j는 다음과 같은 로그 레벨을 가진다.


로그 레벨

설명 

FATAL

 아주 심각한 에러가 발생한 상태를 나타낸다. 

ERROR

 어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타낸다. 

 WARN

 프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될수 있는 경고성 메시  지를 나타낸다.

 INFO

 어떠한 상태변경과 같은 정보성 메시지를 나타낸다. 

 DEBUG

 개발시 디버그 용도로 사용하는 메시지를 나타낸다. 

 TRACE

 디버그 레벨이 너무 광범위한것을 해결하기 위해서 좀 더 상세한 이벤트를 나타낸다.

 


Log4j에 대한 간단한 설명은 이정도로만 하고, 자세한 내용은 추후 이야기 하겠다. 


일단 여기서는 Log4j의 간단한 설정만 이야기 하겠다. 


1. pom.xml에 Log4j를 추가한다. 

우리가 생성한 프로젝트에는 기본적으로 Log4j 라이브러리가 추가되어있고 기본설정도 되어있기 때문에, 넘어가도록 한다. 


2. Log4j 설정

인터넷에서 Log4j에 대해서 찾아보면 여러가지 글이 나오는데, 상당히 많은 글들이 .properties 파일을 이용한 설정방법이다.

Log4j에 .properties를 사용하는 건 최악이다. 절대로 하지말자. (진지한 궁서체다.)

이제 .properties는 굉장히 옛날 방식이고 절대로 사용해서는 안되는 방식인데, 최근에 작성된 글들도 .properties를 가지고 이야기하고 있다. (특히 네E년 - 자체심의) 

최신 Log4j에서는 xml과 json을 이용한 설정만 지원하고 있다. 


src/main/resources 폴더 밑에 있는 log4j.xml 파일을 열자. 

log4j.xml이 Log4j의 설정파일로, 여기서 로그 출력 형식과 레벨 등을 모두 지정할 수 있다.

기존에 http://addio3305.tistory.com/36 에서 프로젝트를 생성하고 실행시켰을 때, 콘솔에서 이것저것 출력되었던 것도 여기서 설정된 것을 이용해서 출력이 된것이다.



당시 사용했던 이미지를 다시 가져왔는데, 빨간색 점선으로 표시된 부분이 Log4j를 통해서 출력된 로그들이다. " INFO : " 라고 되어있는게 위에서 설명한 INFO 레벨의 로그이다. 


우리는 앞으로 여러가지 로그를 찍고, 각 로그 종류에 따라서 화면에 보이는게 다르게 하기 위해서 다음과 같이 log4j.xml을 변경한다. 


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
    <!-- Appenders -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />
        </layout>  
    </appender>
     
    <appender name="console-infolog" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %5p %m%n" />
        </layout>  
    </appender>
     
    <!-- Application Loggers -->
    <logger name="first" additivity="false">
        <level value="debug" />
        <appender-ref ref="console"/>
    </logger>
     
    <!-- Query Loggers -->
    <logger name="jdbc.sqlonly" additivity="false"
        <level value="INFO"/> 
        <appender-ref ref="console-infolog"/> 
    </logger>
     
    <logger name="jdbc.resultsettable" additivity="false"
        <level value="INFO"/> 
        <appender-ref ref="console"/> 
    </logger
 
    <!-- Root Logger -->
    <root>
        <priority value="off"/>
        <appender-ref ref="console" />
    </root>
     
</log4j:configuration>

 

여기서 2개의 appender와 3개의 logger를 볼 수 있다. 

일반적인 debug 레벨은 기존의 appender를 이용하고, 그 외 필요한 여러가지 정보는 info 레벨로 약간 다른형식으로 출력하려고 한다. 이건 추후 소스에서 그 결과를 확인할 수 있다. 

반응형

'프로젝트 관련 조사 > 로그 관련' 카테고리의 다른 글

logstash conf 설정 - 기초  (0) 2015.10.15
logstash 레퍼런스  (0) 2015.10.15
[Elasticsearch] Logstash 설치와 기본개념  (0) 2015.10.15
중앙집중 로깅 시스템  (0) 2015.10.15
LogStash 이해하기  (0) 2015.10.15
반응형

출처: http://asuraiv.blogspot.kr/2015/07/elasticsearch-logstash.html

 

1. 개요



Logstash는 입출력 도구이다. 다양한 종류의 로그 (System logs, webserver logs, error logs, application logs) 뿐만아니라 입력되는 모든 종류의 데이터를 가공하여 출력할 수 있다.

Elasticsearch와 궁합이 잘 맞아 지금은 Elasticsearch의 공식 패키지에 포함되어 있다고 한다. 이제 그 Logstash 설치해보고 기본적인 개념들을 살펴보도록 한다.

2. Logstash 설치와 간단예제



일단 설치해보자.

1) download

$ wget 'http://download.elastic.co/logstash/logstash/logstash-1.5.1.tar.gz'

주소는 다음으로 변경됨

 

 

 


2) 압축풀기

$ tar -xvzf logstash-1.5.1.tar.gz


끝났다(..) 정말이다.

Logstash는 위에서 언급했듯이 입출력 도구이며,
input > filter > output 의 pipeline구조로 구성되어있다.









 

  • input : 데이터를 받아들인다
  • filter : 데이터를 가공한다
  • output : 데이터를 출력한다


이러한 input, filter, output 설정은 직접 configuration 파일을 작성하여 설정해야하는데,
문법은 아래와 같다

input {
        .
        .
        .
}

filter {
        .
        .
        .
}

output {
        .
        .
        .
}

엄청 간단해 보인다. 하지만 어떤 기술이든 마찬가지로 기본은 쉬워보이는법,, 조금만 파고들어가면 걷잡을 수 없이 미로를 헤맬수  있다.

여튼 가장 기본적인 설정 즉, 입력은 stdin, 출력은 stdout 으로 설정하여 어떤식으로 입출력을 처리하는지 살펴보자. 일단 설정파일은 아래와 같이 매우 간단하다.

$ cat logstash.conf
input {
        stdin { }
}

output {
        stdout {
                codec => rubydebug { }
        }
}

주목할 부분은 stdout 설정에 codec을 추가했다는 것이다. rubydebug는 출력을 보기좋은 json 포맷으로 보여준다.

이제 logstash 압축을 해제한 디렉토리의 /bin 디렉토리로 이동하여 아래와같은 명령어로 conf 파일과 함께 실행 시킨다.

$ ./logstash -f [configuration file path]/logstash.conf

실행이 되었으면 stdin 으로 'Hello world'를 입력해보자

$ ./logstash -f logstash.conf
Logstash startup completed
Hello world!
{
       "message" => "Hello world!",
      "@version" => "1",
    "@timestamp" => "2015-07-21T11:47:37.140Z",
          "host" => "cweb02.ami"
}

표준 입력으로 Hello world! 라는 문자열을 입력했고, 표준 출력으로 출력이되며 rubydebug 코덱으로 인해 json 형식으로 출력된다. 이때 message, @version, @timestamp 등의 필드는 Logstash에 내장 되어있는 필드라고 볼 수 있다.

input, output 플러그인의 종류는 매우 많다. 물론 데이터의 출력과 동시에 Elasticsearch에 색인작업을 해주는 elasticsearch output plugin도 존재한다.
아래의 문서들을 참고하자!

  • input plugins : https://www.elastic.co/guide/en/logstash/current/input-plugins.html
  • output plugins : https://www.elastic.co/guide/en/logstash/current/output-plugins.html
  • codec plugins : https://www.elastic.co/guide/en/logstash/current/codec-plugins.html


filter 설정을 적용하면, 입력으로 들어온 데이터를 가공하는 작업 예를들어 json 형식으로 데이터가 입력되었다면 필드를 삭제, 추가하거나 필드의 값을 조작할 수 있다. 여기서는 json 데이터를 가공해주는 json filter를 적용해보자.

아래와 같이 conf 파일을 수정한다

input {
        stdin { }
}

filter {
        json {
                source => "message"
                add_field => { "new_field1" => "New field value!"  }
                add_field => { "new_field2" => "My name is %{name}" }
                remove_field => [ "useless_field" ]
        }
}

output {
        stdout {
                codec => rubydebug { }
        }
}

filter로서 'json' filter를 추가했다. source 설정은 가공할 데이터가 들어있는 field를 가리킨다. add_field는 말그대로 field를 추가하는 것으로서, static한 고정값을 가지고있는 field를 추가할 수도있고, 기존 source의 데이터의 필드값을 '%{field이름}' 을 사용해 접근할 수 있다.

이제 이러한 설정을 저장하고, 실행한 뒤 표준 입력으로 json 포맷을 던져보자.

$ ./logstash -f logstash.simple.conf
Logstash startup completed
{ "name" : "timmy", "address" : "boston", "useless_field" : "garbage value" }
{
       "message" => "{ \"name\" : \"timmy\", \"address\" : \"boston\", \"useless_field\" : \"garbage value\" }",
      "@version" => "1",
    "@timestamp" => "2015-07-21T12:03:38.577Z",
          "host" => "cweb02.ami",
          "name" => "timmy",
       "address" => "boston",
    "new_field1" => "New field value!",
    "new_field2" => "My name is timmy"
}

{ "name" : "timmy", "address" : "boston", "useless_field" : "garbage value" } 와 같은 json 데이터를 표준입력을 통해 입력했다. name필드값으로 'timmy', address필드값으로 'boston'을 입력하였고, 필드 삭제 예제를 위해 'useless_field'도 추가했다.

결과는? 입력된 값 바로아래에서 볼 수 있다. 일단은 위에서 설명한것처럼 message, @version, @timestamp, host 필드는 Logstash의 내장 필드이다. 그 아래로, name과 address가 정상적으로 출력되고 있고, remove_field 설정으로 인해 'useless_field'는 삭제되었다.

그리고 add_field 설정에서 정의된 new_field1, new_field2 필드들이 새로 추가 되었으며, 주목할만한건 new_field2 의 값인데, %{name} 와 같이 기존 데이터의 필드의 값을 접근하여 새로운 필드의 값으로 저장된 것을 볼 수 있다.

짐작했겠지만 다양한 종류의 데이터를 가공하기 위해 필터의 종류도 매우 다양하다. 아래를 참고 하자.

fileter plugins : https://www.elastic.co/guide/en/logstash/current/filter-plugins.html

3. 결론



아무튼 Logstash는 input, filter, output 의 파이프라인 구조로 되어있다는 점, 더불어 input과 output의 한 부분으로 동작하며 데이터를 변화시키는 codec도 기억하면 좋을 것이다.

반응형

'프로젝트 관련 조사 > 로그 관련' 카테고리의 다른 글

logstash 레퍼런스  (0) 2015.10.15
log4j 관련  (0) 2015.10.15
중앙집중 로깅 시스템  (0) 2015.10.15
LogStash 이해하기  (0) 2015.10.15
MS 로그 syslog로 전환  (0) 2015.10.12

+ Recent posts