Filter specific information

Hello,

I am trying filter a specific information inside of determite field.

I used kv for split my log.

It's work well.

After that I need get apelido information inside request field. But It didn't work.

This information is inside request field.

Is there a way to get part of information inside request field? I don't need patterned all field.

Regards,

Hello,

Please share a complete sample message and your configuration as a plain text using the preformatted text option, the </> button, this way it is possible to try to replicate what you are trying to do.

@leandrojmp

Oi Leandro, vi que você também é do RJ. Sou carioca também. Pode ser em português ?

Segue um exemplo do campo request:

"<POST /mov-centralizador/tela/Configuracao/ping HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded;charset=UTF-8\r\nContent-Length: 92\r\ncharset: UTF-8\r\nconnection: close\r\nAccpet-Encoding: gzip\r\nX-CNL-Ticket: 0020000000/K1Zgsc2BBBB\r\napelido=newapelido/>

Eu preciso pegar somente a informação de apelido, o resto que está dentro do campo request não me interessa.

Como poderia fazer?

Sem problemas.

Se você só precisa do que vem depois de apelido= você pode user um dissect no campo request.

dissect {
    mapping => {
        "request" => "%{}apelido=%{apelido}/%{}"
    }
}

Esse filtro vai colocar tudo que estiver entre apelido= e / no campo apelido, na mensagem que você compartilhou seria o valor newapelido.

Só tem que validar se em todas as mensagens que você tem o campo apelido é o último no request.

@leandrojmp Bom dia. Tudo bem ?

Muito obrigado. Realmente o dissect me ajudou muito.

O campo apelido não é o ultimo do log e a configuração que me passou traz informação a mais que o campo apelido. Consegui resolver de um especifico, que procuro pelo valor soID. Como vem o valor soID=37748i3uu4| por exemplo. Coloquei a seguinte configuração de dissect:

dissect {
mapping => {
"request"=> "%{}soID=%{soID}|"

Funcionou perfeitamente. Porém o apelido está pegando o inicio da string apos o sinal de = até o final do campo request. Estou procurando como faço para entender que apos a informação vem espaço. E ele tem que parar ali, por exemplo de log:

apelido=silas bundle=novobundle

tentei colocar %{}apelido=%{apelido}/bundle" e não funcionou.

Como nunca tinha utilizado dissect somente grok estou "apanhando" um pouco.

Estou vendo muitos erros de dissectfailure, porém fazendo uma analise entendi que sempre que passar o log pelo dissect e não tiver a informação para parsear ele dará um erro.

Vou testar um estrutura de if [request] == apelido para só entrar no dissect se tiver a informação que será parseada.

Muito obrigado pela ajuda

@leandrojmp

Consegui resolver a questão acima de quebrar a consulta por espaço.

"%{}apelido=%{apelido} %{}"

Porém como tenho alguns logs que o valor que vem dentro do campo apelido vem precedido de espaço ele coloca a informação do campo como empty:

exemplo: apelido= Android.N38848

Tem alguma forma de tratar isso dentro do dissect ou teria que tratar o campo antes ?

Como ficou após a correção dita acima:

Obrigado

@leandrojmp

Consegui resolver também o problema acima rs

Agora única coisa que está acontecendo e um grande numero de dissectfailure. Acredito que o motivo seja que os logs nem sempre tem os campos coletados pelo dissect, então quando ele não encontra ele da esse erro. Pode ser isso ?

Muito obrigado mais uma vez

Se a mensagem não der match no padrão do dissect ele vai gerar um log e adicionar a tag _dissectfailure.

Dependendo do volume de mensagens isso vai gerar muito ruído no log e pode inclusive impactar na performance do logstash, o ideal é só passar pelo dissect quando a mensagem vai dar match no padrão configurado.

Nesse seu exemplo, você pode usar um condicional pra só mandar pro dissect se a mensagem tiver o campo que você precisa, algo assim:

if "apelido" in [campo] {
    dissect {
        mapping => {
            "campo" => "padrão dissect"
        }
    }
}

@leandrojmp Boa noite. Tudo bem ?

Consegui resolver todos os dissect que precisava.

Porém não estou conseguindo resolver a seguinte situação:

Tenho dois tipos de log:

apelido=valor

e

apelido= valor

Estou usando a seguinte configuração:

if "apelido=" in [request] {

dissect {
mapping => {
"request"=> "%{}apelido=%{apelido} %{}"

}
}
}

e o outro:

if "apelido= " in [request] {

dissect {
mapping => {
"request"=> "%{}apelido= %{apelido} %{}"

}
}
}

Os campos apelido não aparecem no final do log.

Consigo até parsear porém da uma faixa de 4% de erro de dissectfailure.

Tem alguma ideia de como resolver essa questão?

Obrigado pela ajuda

Talvez o dissect não seja o ideal pro seu tipo de log, compartilha alguns exemplos dos valores que esse campo request pode ter, quanto vem com "apelido=", quando vem com "apelido= " e quando vem sem.

Com uma massa de dados dá pra ver qual o melhor filtro ou como manipular o valor pra parsear corretamente.

Tem como compartilhar os logs em texto puro? Não dá pra simular nem testar nada dessa forma.

Pode anonimizar informações sensíveis se tiver.

@leandrojmp

Infelizmente não consigo. É um ambiente virtual que não consigo exportar. Somente printar.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.