parse logs do Mongodb com syslog-ng

1

Estou recebendo muitos logs do Mongodb com o meu Syslog-ng. abaixo está a amostra de logs analisados e armazenados assim:

2016-10-18 19:01:08 f:local1.p:info h:10.133.126.81 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:02.439+0330 I COMMAND  [conn71796] command CLM.TroubleTicket command: find { find: "TroubleTicket", filter: { $and: [ { troubleTicket.serviceCode: "8118415922" } ] }, projection: { troubleTicket.referenceNumber: 1, troubleTicket.ticketGenerationDate: 1, troubleTicket.ticketCreatedDate: 1, troubleTicket.currentStatus: 1, troubleTicket.currentStatusReason: 1, troubleTicket.thirdPartyIncidentNumber: 1, troubleTicket.troubleTicketCatId: 1, troubleTicket.troubleTicketSubCatId: 1, troubleTicket.troubleTicketSubSubCatId: 1, troubleTicket.serviceCode: 1, troubleTicket.lastUpdateDate: 1, $sortKey: { $meta: "sortKey" } }, sort: { troubleTicket.ticketCreatedDate: -1 }, ntoreturn: 5, shardVersion: [ Timestamp 232000|1, ObjectId('578fb3a6e0f9dacf6705e34c') ] } planSummary: IXSCAN { troubleTicket.serviceCode: 1.0 }, IXSCAN { troubleTicket.serviceCode: 1.0 } cursorid:85032809863 keysExamined:97798 docsExamined:97798 hasSortStage:1 keyUpdates:0 writeConflicts:0 numYields:764 nreturned:5 reslen:2354 locks:{ Global: { acquireCount: { r: 1530 } }, Database: { acquireCount: { r: 765 } }, Collection: { acquireCount: { r: 765 } } } protocol:op_command 572ms
2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.226+0330 I SHARDING [conn6447] request split points lookup for chunk CLM.ActionLevelDetails { : MinKey } -->> { : MaxKey }
2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.229+0330 W SHARDING [conn6447] possible low cardinality key detected in CLM.ActionLevelDetails - key is { actionLevelDetails.activityType: "CNFRMREG" }
2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.229+0330 W SHARDING [conn6447] possible low cardinality key detected in CLM.ActionLevelDetails - key is { actionLevelDetails.activityType: "DOCSUPLOAD" }
2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.234+0330 I SHARDING [conn6447] request split points lookup for chunk CLM.ActionLevelDetails { : MinKey } -->> { : MaxKey }
2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.237+0330 W SHARDING [conn6447] possible low cardinality key detected in CLM.ActionLevelDetails - key is { actionLevelDetails.activityType: "CNFRMREG" }
2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.237+0330 W SHARDING [conn6447] possible low cardinality key detected in CLM.ActionLevelDetails - key is { actionLevelDetails.activityType: "DOCSUPLOAD" }
2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.350+0330 I SHARDING [conn6447] request split points lookup for chunk CLM.ActionLevelDetails { : MinKey } -->> { : MaxKey }
2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.353+0330 W SHARDING [conn6447] possible low cardinality key detected in CLM.ActionLevelDetails - key is { actionLevelDetails.activityType: "CNFRMREG" }
2016-10-18 19:01:18 f:local1.p:info h:10.133.126.81 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:16.762+0330 I ACCESS   [conn6012] Successfully authenticated as principal dba_admin on admin

observe que a mensagem de log do Mongodb contém o formato JSON, como você pode ver nos registros. A configuração do syslog-ng para esses logs é a seguinte:

source s_all {
                udp(ip("0.0.0.0") port(514));
                tcp(ip("0.0.0.0") port(514) keep-alive(no) max-connections(1000));
};


destination d_clm_mongodb {
   file("/storage/sensage/incoming/mtn/syslog-ng/clm_mongodb/clm_mongodb.log"
   template("$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC f:$FACILITY.p:$PRIORITY h:$HOST_FROM prog:$PROGRAM m:$MSG\n")
   template_escape(no) );
};

filter f_clm_mongodb          { program("sharmongo-log"); };

log { source(s_all); filter(f_clm_mongodb);       destination(d_clm_mongodb);       flags(final); };

Eu preciso analisar esses logs para CSV format (separado por vírgula), o que significa que a parte JSON do evento deve ser separada por vírgula. Eu procurei muito sobre esse assunto. Eu preciso agora existe uma capacidade no syslog-ng que analisar os logs JSON (Smaples) e armazenar com CSV formato?

Nota: O formato de log do mongodb é o seguinte link: link

    
por amir jj 19.10.2016 / 10:35

1 resposta

1

é complicado. O problema é que existem objetos JSON misturados com campos de texto simples. Eu acho que você tem as seguintes opções (note que você precisará de uma versão recente do syslog-ng para usar os analisadores json e k-v, eu usaria a versão 3.8):

  • Se puder, configure o mongodb para efetuar login no json puro e analise-o com o analisador json do syslog-ng. (Não sei se o mongodb pode fazer isso.)

  • Você pode constrói um banco de dados de padrões para cobrir as mensagens individuais, mas isso pode levar muito tempo

  • Mas a opção mais provável seria para usar uma combinação de analisadores syslog-ng . Ou seja, tente o seguinte:

    • use um csv-parser para dividir a mensagem em duas colunas no primeiro {caractere
    • analisa a primeira coluna usando um analisador de valores-chave (os dois pontos são um separador nessa parte da mensagem)
    • use um analisador json para analisar a segunda parte da mensagem (já que algumas mensagens possuem várias partes json, você pode ter que adicionar outra combinação csv + json aqui) Esses analisadores criarão pares de valores de nomes dos valores analisados e você poderá usar um modelo ou uma função de modelo para gerá-los conforme necessário (por exemplo, usando a função de modelo format-welf).
  • Ou agora que penso nisso, se você não precisa da estrutura JSON (apenas os nomes simples + valores), tente simplesmente usar uma regra de reconfiguração para remover os {} caracteres das mensagens e use um analisador de valor-chave.

  • Se a opção acima não funcionar, você pode escrever um analisador personalizado em python e processar as mensagens lá.

HTH.

Por favor, deixe-me saber se você tiver sucesso.

    
por 21.10.2016 / 09:31