Log parsing é o processo de conversão de dados log não estruturados em atributo (pares de valor principal) com base nas regras que você define. Você pode usar esses atributos em sua consulta NRQL para facetar ou filtrar o registro de maneiras úteis.
O New Relic analisa os dados de log automaticamente de acordo com determinadas regras de análise. Neste documento, você aprenderá como funciona a análise de log e como criar suas próprias regras de análise personalizadas.
Você também pode criar, consultar e gerenciar suas regras de análise de log usando NerdGraph, nossa API GraphQL. Uma ferramenta útil para isso é nosso Nerdgraph API Explorer. Para obter mais informações, consulte nosso tutorial NerdGraph para análise de arquivos.
Aqui está um vídeo de 5 minutos sobre análise de log:
Exemplo de análise
Um bom exemplo é um log de acesso NGINX padrão contendo texto não estruturado. É útil para pesquisar, mas não muito mais. Aqui está um exemplo de uma linha típica:
Em um formato não analisado, você precisaria fazer uma pesquisa de texto completo para responder à maioria das perguntas. Após a análise, o log é organizado em atributos, como response code e request URL:
A análise torna mais fácil criar consultas personalizadas relacionadas a esses valores. Isso ajuda você a entender a distribuição dos códigos de resposta por URL de solicitação e a encontrar rapidamente páginas problemáticas.
Como funciona a análise de log
Aqui está uma visão geral de como New Relic implementa a análise de log:
Análise de log
Como funciona
O que
A análise é aplicada a um campo selecionado específico. Por padrão, o campo message é usado. No entanto, qualquer campo/atributo pode ser escolhido, mesmo aquele que não exista atualmente em seus dados.
Cada regra de análise é criada usando uma cláusula NRQL WHERE que determina qual log a regra tentará analisar.
Para simplificar o processo de correspondência, recomendamos adicionar um atributo logtype ao seu registro. Entretanto, você não está limitado a usar logtype; um ou mais atributos podem ser usados como critérios de correspondência na cláusula NRQL WHERE.
Quando
A análise será aplicada apenas uma vez a cada mensagem do log. Se várias regras de análise corresponderem ao log, somente a primeira que for bem-sucedida será aplicada.
As regras de análise não são ordenadas. Se mais de uma regra de análise corresponder a um log, uma será escolhida aleatoriamente. Certifique-se de criar suas regras de análise para que não correspondam ao mesmo log.
A análise ocorre durante a ingestão de log, antes que os dados sejam gravados no NRDB. Depois que os dados forem gravados no armazenamento, eles não poderão mais ser analisados.
A análise ocorre no pipeline before ocorrem enriquecimentos de dados. Tenha cuidado ao definir os critérios de correspondência para uma regra de análise. Se o critério for baseado em um atributo que não existe até que a análise ou enriquecimento ocorra, esses dados não estarão presentes no log quando ocorrer a correspondência. Como resultado, nenhuma análise acontecerá.
Como
As regras podem ser escritas em Grok, regex ou uma mistura dos dois. Grok é uma coleção de padrões que abstraem expressões regulares complicadas.
Oferecemos suporte à sintaxe Java Regex em nossa interface de análise. Para nomes de atributos ou campos em grupos de captura, o Java Regex permite apenas [A-Za-z0-9].
Analisar atributo usando Grok
Os padrões de análise são especificados usando Grok, um padrão da indústria para análise de mensagens do log. Qualquer log recebido com um campo logtype será verificado em relação às nossas regras de análise integradas e, se possível, o padrão Grok associado será aplicado ao log.
Grok é um superconjunto de expressões regulares que adiciona padrões nomeados integrados para serem usados no lugar de expressões regulares literais complexas. Por exemplo, em vez de lembrar que um número inteiro pode ser correspondido com a expressão regular (?:[+-]?(?:[0-9]+)), você pode simplesmente escrever %{INT} para usar o padrão Grok INT, que representa a mesma expressão regular.
PATTERN_NAME é um dos padrões Grok suportados. O nome do padrão é apenas um nome amigável que representa uma expressão regular. Eles são exatamente iguais à expressão regular correspondente.
OPTIONAL_EXTRACTED_ATTRIBUTE_NAME, se fornecido, é o nome do atributo que será adicionado à sua mensagem do log com o valor correspondente ao nome do padrão. É equivalente a usar um grupo de captura nomeado usando expressões regulares. Se isso não for fornecido, a regra de análise corresponderá apenas a uma região da sua string, mas não extrairá um atributo com seu valor.
OPTIONAL_TYPE especifica o tipo de valor de atributo a ser extraído. Se omitido, os valores serão extraídos como strings. Por exemplo, para extrair o valor 123 de "File Size: 123" como um número para o atributo file_size, use value: %{INT:file_size:int}.
OPTIONAL_PARAMETER especifica um parâmetro opcional para determinados tipos. Atualmente apenas o tipo datetime recebe um parâmetro. Veja detalhes abaixo.
Você também pode usar uma combinação de expressões regulares e nomes de padrões Grok na string correspondente.
Clique neste link para obter uma lista de padrões Grok suportados e aqui para obter uma lista de tipos Grok suportados.
Observe que os nomes das variáveis devem ser definidos explicitamente e estar em letras minúsculas, como %{URI:uri}. Expressões como %{URI} ou %{URI:URI} não funcionariam.
Um registro de log poderia ser algo assim:
{
"message":"54.3.120.2 2048 0"
}
Esta informação é precisa, mas não é exatamente intuitiva o que significa. Os padrões Grok ajudam você a extrair e compreender os dados de telemetria desejados. Por exemplo, um registro de log como este é muito mais fácil de usar:
{
"host_ip":"43.3.120.2",
"bytes_received":2048,
"bytes_sent":0
}
Para fazer isso, crie um padrão Grok que extraia esses três campos; por exemplo:
Após o processamento, seu registro de log incluirá os campos host_ip, bytes_received e bytes_sent. Agora você pode usar esses campos no New Relic para filtrar, facetar e realizar operações estatísticas em seus dados de log. Para obter mais detalhes sobre como analisar logs com padrões Grok no New Relic, consulte nossa postagem no blog.
Se você tiver as permissões corretas, poderá criar regras de análise em nossa interface para criar, testar e ativar a análise Grok. Por exemplo, para obter um tipo específico de mensagem de erro para um de seus microsserviços chamado Inventory Services, você criaria uma regra de análise Grok que procura uma mensagem de erro e um produto específicos. Para fazer isso:
Dê um nome à regra; por exemplo, Inventory Services error parsing.
Selecione um campo existente para analisar (padrão = message) ou insira um novo nome de campo.
Identifique a cláusula NRQL WHERE que atua como pré-filtro para o log de entrada; por exemplo, entity.name='Inventory Service'. Esse pré-filtro restringe o número de logs que precisam ser processados pela sua regra, removendo processamento desnecessário.
Selecione um log correspondente, se existir, ou clique na guia Colar log para colar um log de amostra.
Adicione a regra de análise Grok; por exemplo:
Inventory error: %{DATA:error_message} for product %{INT:product_id}
Onde:
Inventory error: o nome da sua regra de análise
error_message: A mensagem de erro que você deseja selecionar
product_id: o ID do produto para o serviço de inventário
Ative e salve a regra de análise.
Em breve você verá que seu log do Inventory Service foi enriquecido com dois novos campos: error_message e product_id. A partir daqui você pode consultar esses campos, criar gráficos e dashboards, definir alertas, etc.
O campo OPTIONAL_TYPE especifica o tipo de valor de atributo a ser extraído. Se omitido, os valores serão extraídos como strings.
Os tipos suportados são:
Tipo especificado no Grok
Tipo armazenado no banco de dados New Relic
boolean
boolean
byteshortintinteger
integer
long
long
float
float
double
double
string (padrão) text
string
datedatetime
O tempo como long
Por padrão, é interpretado como ISO 8601. Se OPTIONAL_PARAMETER estiver presente, ele especifica a sequência padrão de data e horaa ser usada para interpretar datetime.
Se você tiver log multilinha, esteja ciente de que o padrão GREEDYDATA Grok não corresponde a novas linhas (é equivalente a .*).
Portanto, em vez de usar %{GREEDYDATA:some_attribute} diretamente, você precisará adicionar o sinalizador multilinha na frente dele: (?s)%{GREEDYDATA:some_attribute}
O pipeline do New Relic Logs analisa suas mensagens JSON de log por padrão, mas às vezes você tem mensagens JSON do log misturadas com texto simples. Nessa situação, você pode querer analisá-los e depois filtrar usando o atributo JSON. Se for esse o caso, você pode usar o tipojson grok , que analisará o JSON capturado pelo padrão grok. Este formato depende de 3 partes principais: a sintaxe grok, o prefixo que você gostaria de atribuir ao atributo json analisado e o jsontipo grok. Usando o tipo jsongrok, você pode extrair e analisar JSON do log que não está formatado corretamente; por exemplo, se o seu log tiver como prefixo uma string de data/hora:
Você pode definir a lista de atributos a serem extraídos ou descartados com as opções keepAttributes ou dropAttributes. Por exemplo, com a seguinte expressão Grok:
Se desejar omitir o prefixo my_attribute_prefix e manter apenas o atributo status , você poderá incluir "noPrefix": true e "keepAttributes: ["status"] na configuração.
Se seu JSON tiver escapado, você poderá usar a opção isEscaped para poder analisá-lo. Se o seu JSON tiver sido escapado e depois citado, você também precisará combinar as aspas, conforme mostrado abaixo. Por exemplo, com a seguinte expressão Grok:
Para configurar o tipo jsonGrok, use :json(_CONFIG_):
json({"dropOriginal": true}): elimine o trecho JSON que foi usado na análise. Quando definido como true (valor padrão), a regra de análise eliminará o trecho JSON original. Observe que o atributo JSON permanecerá no campo da mensagem.
json({"dropOriginal": false}): isso mostrará a carga JSON que foi extraída. Quando definido como false, a carga completa somente JSON será exibida em um atributo nomeado em my_attribute_prefix acima. Observe que o atributo JSON permanecerá no campo de mensagem aqui, dando ao usuário 3 visualizações diferentes dos dados JSON. Se o armazenamento de todas as três versões for uma preocupação, é recomendado usar o padrão true aqui.
json({"depth": 62}): níveis de profundidade que você deseja analisar o valor JSON (padrão 62).
json({"keepAttributes": ["attr1", "attr2", ..., "attrN"]}): Especifica qual atributo será extraído do JSON. A lista fornecida não pode estar vazia. Se esta opção de configuração não estiver definida, todos os atributos serão extraídos.
json({"dropAttributes": ["attr1", "attr2", ..., "attrN"]}): Especifica qual atributo será retirado do JSON. Se esta opção de configuração não for definida, nenhum atributo será eliminado.
json({"noPrefix": true}): Defina esta opção como true para remover o prefixo do atributo extraído do JSON.
json({"isEscaped": true}): Defina esta opção como true para analisar o JSON que foi escapado (que normalmente você vê quando o JSON é stringificado, por exemplo {\"key\": \"value\"})
Se o seu sistema envia log de valores separados por vírgula (CSV) e você precisa analisá-los no New Relic, você pode usar o tipo csv Grok, que analisa o CSV capturado pelo padrão Grok. Este formato depende de 3 partes principais: a sintaxe Grok, o prefixo que você gostaria de atribuir ao atributo CSV analisado e o csvtipo Grok. Usando o tipo csvGrok, você pode extrair e analisar CSV do log.
É obrigatório indicar as colunas na configuração do tipo CSV Grok (que deve ser um JSON válido).
Você pode ignorar qualquer coluna definindo "_" (sublinhado) como o nome da coluna para removê-la do objeto resultante.
Opções de configuração opcionais:
Embora a configuração de “colunas” seja obrigatória, é possível alterar a análise do CSV com as seguintes configurações.
dropOriginal: (o padrão é true) Elimine o trecho CSV usado na análise. Quando definida como true (valor padrão), a regra de análise descarta o campo original.
noPrefix: (o padrão é false) Não inclui o nome do campo Grok como prefixo no objeto resultante.
separator: (O padrão é ,) Define o caractere/string que divide cada coluna.
Outro cenário comum são os valores separados por tabulações (TSV), para isso você deve indicar \t como separador, ex. %{GREEDYDATA:log:csv({"columns": ["timestamp", "status", "method", "url", "time", "bytes"], "separator": "\t"})
quoteChar: (O padrão é ") Define o caractere que opcionalmente envolve o conteúdo de uma coluna.
Se o seu sistema enviar log contendo endereços IPv4, New Relic poderá localizá-los geograficamente e enriquecer o evento de log com o atributo especificado. Você pode usar o tipo geoGrok, que encontra a posição de um endereço IP capturado pelo padrão Grok. Este formato pode ser configurado para retornar um ou mais campos relacionados ao endereço, como cidade, país e latitude/longitude do IP.
É obrigatório especificar os campos lookup desejados retornados pela ação geo . É necessário pelo menos um item das opções a seguir.
city: Nome da cidade
countryCode: Abreviatura do país
countryName: Nome de país
latitude: Latitude
longitude: Longitude
postalCode: Código postal, CEP ou similar
region: Abreviatura de estado, província ou território
regionName: Nome do estado, província ou território
Organizando por tipo de log
O pipeline de ingestão de log do New Relic pode analisar dados combinando um evento de log com uma regra que descreve como o log deve ser analisado. Existem duas maneiras de analisar o evento de log:
As regras são uma combinação de lógica correspondente e lógica de análise. A correspondência é feita definindo uma correspondência de consulta em um atributo do log. As regras não são aplicadas retroativamente. log coletados antes da criação de uma regra não são analisados por essa regra.
A maneira mais simples de organizar seu log e como eles são analisados é incluir o campo logtype em seu evento de log. Isso informa ao New Relic qual regra integrada aplicar ao log.
Importante
Depois que uma regra de análise estiver ativa, os dados analisados pela regra serão alterados permanentemente. Isso não pode ser revertido.
Limites
A análise é computacionalmente cara, o que apresenta riscos. A análise é feita para regras personalizadas definidas em uma conta e para correspondência de padrões com um log. Um grande número de padrões ou regras personalizadas mal definidas consumirão uma enorme quantidade de memória e recursos de CPU, ao mesmo tempo que levarão muito tempo para serem concluídos.
Para evitar problemas, aplicamos dois limites de análise: por mensagem, por regra e por conta.
Limite
Descrição
Por mensagem por regra
O limite por mensagem por regra evita que o tempo gasto na análise de qualquer mensagem seja superior a 100 ms. Se esse limite for atingido, o sistema deixará de tentar analisar a mensagem do log com aquela regra.
O pipeline de ingestão tentará executar qualquer outro aplicável nessa mensagem, e a mensagem ainda será passada pelo pipeline de ingestão e armazenada no NRDB. A mensagem do log estará em seu formato original, não explorado.
Por conta
O limite por conta existe para evitar que as contas utilizem mais do que a sua quota-parte de recursos. O limite considera o tempo total gasto no processamento de all mensagens do log de uma conta por minuto.
Dica
Para verificar facilmente se seus limites de taxa foram atingidos, acesse a página do sistema Limitsna interface do New Relic.
Regras de análise integradas
Os formatos de log comuns possuem regras de análise bem estabelecidas e já criadas para eles. Para aproveitar o benefício das regras de análise integradas, adicione o atributo logtype ao encaminhar o registro. Defina o valor como algo listado na tabela a seguir e as regras para esse tipo de log serão aplicadas automaticamente.
Lista de regras integradas
Os seguintes valores de atributo logtype são mapeados para uma regra de análise predefinida. Por exemplo, para consultar o aplicativo Load Balancer:
Na interface New Relic , use o formato logtype:"alb".
Ao agregar logs, é importante fornecer metadados que facilitem a organização, pesquisa e análise desses logs. Uma maneira simples de fazer isso é adicionar o atributo logtype à mensagem do log quando eles forem enviados. As regras de análise integradas são aplicadas por padrão a determinados valores logtype .
Dica
Os campos logType, logtype e LOGTYPE são todos suportados para regras integradas. Para facilitar a pesquisa, recomendamos que você alinhe uma única sintaxe em sua organização.
Aqui estão alguns exemplos de como adicionar logtype ao registro enviado por alguns dos nossos métodos de envio suportados.
Adicione logtype como um attribute. Você deve configurar o tipo de log para cada origem nomeada.
logs:
-name: file-simple
file: /path/to/file
attributes:
logtype: fileRaw
-name: nginx-example
file: /var/log/nginx.log
attributes:
logtype: nginx
Adicione um bloco de filtro ao arquivo .conf , que usa um record_transformer para adicionar um novo campo. Neste exemplo, usamos um logtype de nginx para acionar a regra de análise NGINX integrada. Confira outros exemplos do Fluentd.
<filter containers>
@type record_transformer
enable_ruby true
<record>
#Add logtype to trigger a built-in parsing rule for nginx access logs
logtype nginx
#Set timestamp from the value contained in the field "time"
timestamp record["time"]
#Add hostname and tag fields to all records
hostname "#{Socket.gethostname}"
tag ${tag}
</record>
</filter>
Adicione um bloco de filtro ao arquivo .conf que usa um record_modifier para adicionar um novo campo. Neste exemplo, usamos um logtype de nginx para acionar a regra de análise NGINX integrada. Confira outros exemplos do Fluent Bit.
[FILTER]
Name record_modifier
Match *
Record logtype nginx
Record hostname ${HOSTNAME}
Record service_name Sample-App-Name
Adicione um bloco de filtro à configuração do Logstash que usa um filtro de mutação add_field para adicionar um novo campo. Neste exemplo, usamos um logtype de nginx para acionar a regra de análise NGINX integrada. Confira outros exemplos do Logstash.
filter {
mutate {
add_field=> {
"logtype"=> "nginx"
"service_name"=> "myservicename"
"hostname"=> "%{host}"
}
}
}
Você pode adicionar um atributo à solicitação JSON enviada para New Relic. Neste exemplo, adicionamos um atributo logtype de valor nginx para acionar a regra de análise NGINX integrada. Saiba mais sobre como usar a API Logs.
POST /log/v1 HTTP/1.1
Host: log-api.newrelic.com
Content-Type: application/json
X-License-Key: YOUR_LICENSE_KEY
Accept: */*
Content-Length: 133
{
"timestamp": TIMESTAMP_IN_UNIX_EPOCH,
"message": "User 'xyz' logged in",
"logtype": "nginx",
"service": "login-service",
"hostname": "login.example.com"
}
Crie e visualize regras de análise personalizadas
Muitos logs são formatados ou estruturados de maneira única. Para analisá-los, a lógica personalizada deve ser construída e aplicada.
Na navegação à esquerda na interface de registro, selecione Parsing e crie sua própria regra de análise personalizada com uma cláusula NRQL WHERE válida e um padrão Grok.
Para criar e gerenciar suas próprias regras de análise personalizadas:
Em Manage data no painel de navegação esquerdo da interface de registro, clique em Parsing e, em seguida, clique em Create parsing rule.
Insira um nome para a nova regra de análise.
Selecione um campo existente para analisar (padrão = message) ou insira um novo nome de campo.
Insira uma cláusula NRQL WHERE válida para corresponder ao log que você deseja analisar.
Selecione um log correspondente, se existir, ou clique na guia Paste log para colar um log de amostra . Observe que se você copiar texto da interface de log ou do criador de consulta para colar na interface de análise, certifique-se de que seja a versão Unformatted .
Em Manage data no painel de navegação esquerdo da interface de registro, clique em Parsing.
Resolução de problemas
Se a análise não estiver funcionando da maneira desejada, pode ser devido a:
Logic: A lógica de correspondência de regras de análise não corresponde ao log desejado.
Timing: Se a sua regra de análise de correspondência destino for um valor que ainda não existe, ela falhará. Isto pode ocorrer se o valor for adicionado posteriormente no pipeline como parte do processo de enriquecimento.
Limits: Há um período fixo de tempo disponível a cada minuto para processar o log por meio de análise, padrões, filtros de eliminação, etc. Se o tempo máximo tiver sido gasto, a análise será ignorada para registros adicionais de eventos de log.