2014-04-08 10 views
24

Tutaj wychodzę z głowy. Mam aplikację, która zapisuje logi do pliku. Każda pozycja dziennika jest obiektem JSON. Przykładem moim pliku .json wygląda następująco:Używanie JSON-a z LogStash

{"Property 1":"value A","Property 2":"value B"} 
{"Property 1":"value x","Property 2":"value y"} 

Próbuję rozpaczliwie dostać wpisy dziennika w LogStash. Próbując to zrobić, mam następujący LogStash stworzony plik konfiguracyjny:

input { 
    file { 
    type => "json" 
    path => "/logs/mylogs.log" 
    codec => "json" 
    } 
} 
output { 
    file { 
    path => "/logs/out.log" 
    } 
} 

Teraz mam ręczne dodawanie rekordów do mylogs.log aby spróbować i dostać pracę. Jednak pojawiają się one dziwnie na wyjściu standardowym. Kiedy patrzę otwarty out.log, widzę coś jak następuje:

{"message":"\"Property 1\":\"value A\", \"Property 2\":\"value B\"}","@version":"1","@timestamp":"2014-04-08T15:33:07.519Z","type":"json","host":"ip-[myAddress]","path":"/logs/mylogs.log"} 

z tego powodu, jeśli mogę wysłać wiadomość do ElasticSearch, nie dostać pola. Zamiast tego mam pomieszany bałagan. Potrzebuję moich właściwości, aby nadal były własnością. Nie chcę, żeby były wciśnięte w część wiadomości lub wyjście. Mam przeczucie, że ma to coś wspólnego z kodekami. Jednak nie jestem pewien. Nie jestem pewien, czy powinienem zmienić kodek w konfiguracji wejścia logstash. Lub, jeśli powinienem zmienić wejście w konfiguracji wyjściowej. Będę szczerze wdzięczny za każdą pomoc, ponieważ jestem zdesperowany w tym momencie.

Dzięki.

Odpowiedz

30

Spróbuj usunąć json codec i dodanie json filter

input { 
    file { 
    type => "json" 
    path => "/logs/mylogs.log" 
    } 
} 
filter{ 
    json{ 
     source => "message" 
    } 
} 
output { 
    file { 
    path => "/logs/out.log" 
    } 
} 

nie trzeba kodek json bo nie chcesz dekodowania JSON źródłowe ale chcesz filtrować dane wejściowe, aby uzyskać dane JSON w @message tylko pole.

Mam nadzieję, że to pomoże.

+1

słodkie! To się udało. Z wyjątkiem tego, że nie pomogło mi przejść przez mój prawdziwy JSON :(Dam ci zasługę za odpowiedź. Otworzyłem drugie pytanie na http://stackoverflow.com/questions/22944168/json-variants-log4j- z-logstash – user70192

+0

Wspaniale! Pójdę popatrzeć później Witam – vzamanillo

+1

Witam! Użyłem tego pliku konfiguracyjnego logstash 'input {tcp {port => '9563'}} filter {json {source =>" message "}} output {elasticsearch {hosts => ["localhost: 9200"]}} 'ale wciąż w elastycznym wyszukiwaniu mój json jest umieszczany jako ciąg w polu wiadomości jako _'message:" {\ "container \": \ "DOCKER \", \ "msg \": \ "From python 26 oct \"} "' _. Nie mogę pobrać _container'_ i _msg'_ jako innego pola w kibanie. Mam to dodatkowe pole w kibana mówiąc: _tagi: _jsonparsefailure_. Mój json to _ {"container": "DOCKER", "msg": "From python 26 oct"} _ –

5

Domyślnie tcp umieszcza wszystko w polu wiadomości, jeśli nie określono kodeka json.

obejście _jsonparsefailure pola wiadomość po określamy kodek json można również rektyfikowany, wykonując następujące czynności:

input { 
    tcp { 
    port => '9563' 
    } 
} 
filter{ 
    json{ 
    source => "message" 
    target => "myroot" 
    } 
    json{ 
    source => "myroot" 
    } 

} 
output { 
    elasticsearch { 
     hosts => [ "localhost:9200" ] 
    } 
} 

To będzie analizować pole wiadomość do właściwego ciąg json do pola myroot i następnie myroot jest przetwarzany w celu uzyskania jsona.

Możemy usunąć pola redundantny jak wiadomości jak

filter { 
    json { 
    source => "message" 
    remove_field => ["message"] 
    } 
}