Este tópico descreve como extrair pares chave-valor dinâmicos de uma string.
Funções
A extração de pares chave-valor dinâmicos é um processo que extrai e transforma palavras-chave e valores. Use as funções e_kv, e_kv_delimit e e_regex para essa tarefa. A tabela a seguir descreve as funções em diferentes casos de uso.
|
Função |
Extração de palavra-chave |
Extração de valor |
Transformação de palavra-chave |
Transformação de valor |
|
e_kv |
Usa expressões regulares específicas. |
Suporta o conjunto de caracteres padrão e delimitadores específicos, como vírgulas (,) e aspas simples ("). |
Suporta prefixos e sufixos. |
Suporta escape de texto. |
|
e_kv_delimit |
Usa expressões regulares específicas. |
Utiliza delimitadores. |
Suporta prefixos e sufixos. |
Nenhuma (padrão). |
|
e_regex |
Usa expressões regulares personalizadas e o conjunto de caracteres padrão. |
Personalizada. |
Personalizada. |
Personalizada. |
Na maioria dos casos, use a função e_kv e configure parâmetros específicos para extrair pares chave-valor, especialmente quando for necessário extrair e aplicar escape em caracteres entre aspas ou barras invertidas (\). Em cenários complexos ou avançados, utilize a função e_regex para a extração. Já em situações específicas, a função e_kv_delimit pode ser necessária para extrair os pares chave-valor.
Extrair palavras-chave
-
Método
Ao usar a função
e_kv,e_kv_delimitoue_regexpara extrair palavras-chave, as funções devem obedecer às restrições de extração. Para obter mais informações, consulte Limites em nomes de campos para extração. -
Exemplo 1
O exemplo a seguir descreve as funções para extrair palavras-chave e valores do log
k1: q=asd&a=1&b=2&__1__=3.-
Função e_kv
-
Log bruto
k1: q=asd&a=1&b=2&__1__=3 -
Regra de transformação
# By default, keywords are extracted by using a specific character set. e_kv("k1") -
Resultado
k1: q=asd&a=1&b=2 q: asd a: 1 b: 2NotaA palavra-chave
__1__não foi extraída porque não obedece às restrições de extração. Para obter mais informações, consulte Limites em nomes de campos para extração.
-
-
Função e_kv_delimit
-
Log bruto
k1: q=asd&a=1&b=2&__1__=3 -
Regra de transformação
# After the key-value pair is separated by an ampersand (&), extract the keywords by using the ampersand (&). e_kv_delimit("k1", pair_sep=r"&") -
Resultado
k1: q=asd&a=1&b=2 q: asd a: 1 b: 2
-
-
Função e_regex
-
Log bruto
k1: q=asd&a=1&b=2&__1__=3 -
Regra de transformação
# Keywords and values are extracted by using a custom character set. e_regex("k1",r"(\w+)=([a-zA-Z0-9]+)",{r"\1": r"\2"}) -
Resultado
k1: q=asd&a=1&b=2 q: asd a: 1 b: 2
-
-
-
Exemplo 2
O exemplo a seguir descreve as funções para extrair palavras-chave do log
content:k1=v1&k2=v2?k3:v3usando expressões regulares.-
Função e_kv
-
Log bruto
content:k1=v1&k2=v2?k3:v3 -
Regra de transformação
e_kv("content",sep="(?:=|:)") -
Resultado
content:k1=v1&k2=v2?k3:v3 k1: v1 k2: v2 k3: v3NotaQuando um conjunto de caracteres é passado para o parâmetro
pair_sep,kv_sepousep, use expressões regulares que incluam um grupo sem captura no formato(?:Conjunto de caracteres).
-
-
Função e_kv_delimit
-
Log bruto
content:k1=v1&k2=v2?k3:v3 -
Regra de transformação
e_kv_delimit("content",pair_sep=r"&?",kv_sep="(?:=|:)") -
Resultado
content:k1=v1&k2=v2?k3:v3 k1: v1 k2: v2 k3: v3
-
-
Função e_regex
-
Log bruto
content:k1=v1&k2=v2?k3:v3 -
Regra de transformação
e_regex("content",r"([a-zA-Z0-9]+)[=|:]([a-zA-Z0-9]+)",{r"\1": r"\2"}) -
Resultado
content:k1=v1&k2=v2?k3:v3 k1: v1 k2: v2 k3: v3
-
-
-
Exemplo 3
O exemplo a seguir mostra como usar a função
e_regexpara extrair palavras-chave de uma string complexa.-
Log bruto
content :"key1:"value1,"key2:"value2 -
Regra de transformação
Se houver aspas duplas (") antes das palavras-chave, use a função
e_regex.e_regex("content", r"(\w+):\"(\w+)", {r"\1": r"\2"}) -
Resultado
Formato do log após a orquestração DSL:
content :"key1:"value1,"key2:"value2 key1: value1 key2: value2
-
Extrair valores
-
O exemplo a seguir mostra como usar a função
e_kvpara extrair valores de um log quando existem identificadores claros entre pares chave-valor dinâmicos ou entre palavras-chave e valores, comoa=bea="cxxx".-
Log bruto
content1: k1="helloworld",the change world, k2="good" -
Regra de transformação
Neste caso,
the change worldnão é extraído.e_kv("content1") # The syntax of the e_kv_delimit function: A space is required before k2. Therefore, k2 can be parsed only when the pair_sep parameter of the e_kv_delimit function is set to ",\s". e_kv_delimit("content1",kv_sep="=", pair_sep=",\s") # The syntax of the e_regex function. e_regex("str",r"(\w+)=(\"\w+)",{r"\1": r"\2"}) -
Resultado
Log extraído:
content1: k1="helloworld",the change world, k2="good" k1: helloworld k2: good
-
-
O exemplo a seguir mostra como usar a função
e_kvpara extrair valores de um log que contém o caractere"no formatocontent:k1="v1=1"&k2=v2?k3=v3.-
Log bruto
content:k1="v1=1"&k2=v2?k3=v3 -
Regra de transformação
e_kv("content",sep="=", quote="'") -
Resultado
Log extraído:
content: k1='v1=1'&k2=v2?k3=v3 k1: v1=1 k2:v2 k3:v3
Se você usar a função
e_kv_delimitpara extrair valores e a sintaxe fore_kv_delimit("ctx", pair_sep=r"&?", kv_sep="="), apenask2: v2ek3: v3poderão ser analisados. A palavra-chavek1="v1no primeiro par chave-valor é descartada porque não obedece às restrições de extração. Para obter mais informações, consulte Limites em nomes de campos para extração. -
-
Alguns pares chave-valor separados por delimitadores contêm caracteres especiais, mas não estão entre caracteres específicos. Use a função e_kv_delimit para extrair valores desses pares chave-valor. Exemplo:
-
Log bruto
content: rats eat rice, oil|chicks eat bugs, rice|kittens eat fish, mice| -
Regra de transformação (recomendada)
Use a função e_kv_delimit.
e_kv_delimit("content", pair_sep="|", kv_sep=" eat ") -
Resultado (recomendado)
Log extraído:
content: rats eat rice, oil|chicks eat bugs, rice|kittens eat fish, mice| kittens: fish, mice chicks: bugs, rice rats: rice, oil -
Regra de transformação (não recomendada)
Se você usar a função
e_kv, alguns campos de log não poderão ser analisados.e_kv("f1", sep="eat") -
Resultado (não recomendado)
Log extraído:
content: rats eat rice, oil|chicks eat bugs, rice|kittens eat fish, mice| kittens: fish chicks: bugs rats: rice
-
Transformar palavras-chave
-
O exemplo a seguir mostra como usar a função
e_kvoue_kv_delimitpara transformar palavras-chave e valores ao configurar os parâmetros de prefixo e sufixo no formatoprefix="", suffix="".-
Log bruto
k1: q=asd&a=1&b=2 -
Regra de transformação
e_kv("k1", sep="=", quote='"', prefix="start_", suffix="_end") e_kv_delimit("k1", pair_sep=r"&", kv_sep="=", prefix="start_", suffix="_end") e_regex("k1",r"(\w+)=([a-zA-Z0-9]+)",{r"start_\1_end": r"\2"}) -
Resultado
Palavras-chave transformadas:
k1: q=asd&a=1&b=2 start_q_end: asd start_a_end: 1 start_b_end: 2
-
-
O exemplo a seguir mostra como usar a função
e_regexpara transformar palavras-chave. A função e_regex oferece recursos mais avançados para essa finalidade.-
Regra de transformação
e_regex("k1",r"(\w+)=([a-zA-Z0-9]+)",{r"\1_\1": r"\2"}) -
Resultado
Palavras-chave transformadas:
k1: q=asd&a=1&b=2 q_q: asd a_a: 1 a_a: 2
-
Transformar valores
-
O exemplo a seguir mostra como usar a função
e_kvpara transformar valores quando um log está no formatok1:"v1\"abc"e há aspas duplas no conteúdo do log. Nesse cenário, é difícil usar as outras duas funções para transformar valores.-
Log bruto
""" In this example, the backlash (\) character is not an escape character. """ content2: k1:"v1\"abc", k2:"v2", k3: "v3" -
Regra de transformação 1
e_kv("content2",sep=":", quote='"') -
Resultado 1
Log extraído:
content2: k1:"v1\"abc", k2:"v2", k3: "v3" k1: v1\ k2: v2 k3: v3 -
Regra de transformação 2
Use a função
e_kvpara aplicar escape ao caractere barra invertida (\) usando o parâmetroescape. Exemplo:e_kv("content2",sep=":", quote='"',escape=True) -
Resultado 2
Log extraído:
content2: k1:"v1\"abc", k2:"v2", k3: "v3" k1: v1"abc k2: v2 k3: v3
-
-
O exemplo a seguir mostra como usar a função
e_kvpara transformar valores quando um log está no formatoa='k1=k2\';k2=k3'. Nesse cenário, é difícil usar as outras duas funções para transformar valores.-
Log bruto
data: i=c10 a='k1=k2\';k2=k3' -
Regra de transformação 1
Na função
e_kv, o valor do parâmetroescapeé False por padrão.e_kv("data", quote="'") -
Resultado 1
Log extraído:
a: k1=k2\ i: c10 k2: k3 -
Regra de transformação 2
Use a função
e_kvpara aplicar escape ao caractere barra invertida (\) usando o parâmetroescape. Exemplo:e_kv("data", quote="'", escape=True) -
Resultado 2
Log extraído:
data: i=c10 a='k1=k2\';k2=k3' i: c10 a: k1=k2';k2=k3
-
-
O exemplo a seguir mostra como usar a função
e_regexpara transformar pares chave-valor complexos.-
Log bruto
content: rats eat rice|chicks eat bugs|kittens eat fish| -
Regra de transformação
e_regex("content", r"\b(\w+) eat ([^\|]+)", {r"\1": r"\2 by \1"}) -
Resultado
Log extraído:
content: rats eat rice|chicks eat bugs|kittens eat fish| kittens: fish by kittens chicks: bugs by chicks rats: rice by rats
-
Estudos de caso
Neste exemplo, sua empresa precisa extrair dados de URL dos logs do site. Especifique regras de transformação conforme necessário.
-
Transformação inicial
-
Requisitos
Requisito 1: Analisar um log e extrair os campos
proto,domaineparamdo log.Requisito 2: Expandir os pares chave-valor no campo
param.
-
Log bruto
__source__: 192.168.0.100 __tag__:__client_ip__: 192.168.0.200 __tag__:__receive_time__: 1563517113 __topic__: request: https://example.com/video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0 -
Funções
-
Orquestração geral
# Parse the request field. e_regex('request',grok("%{URIPROTO:uri_proto}://(?:%{USER:user}(?::[^@]*)?@)?(?:%{URIHOST:uri_domain})?(?:%{URIPATHPARAM:uri_param})?")) # Parse the uri_param field. e_regex('uri_param',grok("%{GREEDYDATA:uri_path}\?%{GREEDYDATA:uri_query}")) # Expand the key-value pairs. e_kv("uri_query") -
Orquestração específica e resultados da transformação
-
Use a função Grok para analisar o campo
request.Também é possível usar expressões regulares para analisar o campo request. Para obter mais informações, consulte Função Grok e Referência de padrões Grok.
e_regex('request',grok("%{URIPROTO:uri_proto}://(?:%{USER:user}(?::[^@]*)?@)?(?:%{URIHOST:uri_domain})?(?:%{URIPATHPARAM:uri_param})?"))Resultado:
uri_domain: example.com uri_param: /video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0 uri_proto: https -
Use a função Grok para analisar o campo
uri_param.e_regex('uri_param',grok("%{GREEDYDATA:uri_path}\?%{GREEDYDATA:uri_query}"))Resultado:
uri_path: /video/getlist/s uri_query: ver=3.2.3&app_type=supplier&os=Android8.1.0 -
Extraia o campo
uri_param.e_kv("uri_query")Resultado:
app_type: supplier os: Android8.1.0 ver: 3.2.3
-
-
-
-
Resultado
Visualize o log transformado:
__source__: 192.168.0.100 __tag__:__client_ip__: 192.168.0.200 __tag__:__receive_time__: 1563517113 __topic__: request: https://example.com/video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0 uri_domain: example.com uri_path: /video/getlist/s uri_proto: https uri_query: ver=3.2.3&app_type=supplier&os=Android8.1.0 app_type: supplier os: Android8.1.0 ver: 3.2.3Para analisar apenas o campo
request, use a função e_kv. Exemplo:e_kv("request")Visualize o log transformado:
__source__: 192.168.0.100 __tag__:__client_ip__: 192.168.0.200 __tag__:__receive_time__: 1563517113 __topic__: request: https://example.com/video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0 app_type: supplier os: Android8.1.0 ver: 3.2.3 -
Transformação avançada
Para extrair campos dinâmicos, como
ver,app_typeeos, use expressões regulares ou a função e_kv_delimit. Exemplo:-
Use expressões regulares.
e_regex("url", r"\b(\w+)=([^=&]+)", {r"\1": r"\2"}) -
Use a função
e_kv_delmit.e_kv_delimit("url", pair_sep=r"?&")
-
-
Conclusão
A maioria das URLs pode ser analisada com as funções anteriores. Use a função
e_kvpara analisar URLs de logs brutos.