Encaminhe uma única entrada de log para vários destinos de armazenamento, onde cada destino recebe apenas os campos necessários. Utilize o padrão tag-split-route na transformação de dados para crie cópias independentes do log original antes de modificar os campos.
Cenário
Um log bruto contém os campos f1, f2, f3, f4 e f5. Cada destino requer um subconjunto diferente desses campos:
target1: Exclui f1 e f2. Mantém f3, f4 e f5.
target2: Exclui f3 e f4. Mantém f1, f2 e f5.
Visão geral da solução
Exporte o mesmo log para múltiplos destinos com conjuntos de campos distintos aplicando o padrão tag-split-route:
Tag -- Adicione um campo
tagao log que liste todos os nomes dos destinos.Split -- Divida o log em cópias separadas, uma para cada destino.
Route -- Em cada cópia, remova os campos indesejados e envie o log para o destino correspondente.
Esse padrão gera cópias independentes do log original antes de aplicar qualquer modificação no nível de campo. Assim, cada destino recebe exatamente os campos necessários sem afetar as demais cópias.
Exemplo de configuração
Log bruto
__time__ : 1591754815
f1: GET
f2: https
f3: aliyun
f4: 200
f5: standard
Regras de transformação
Para obter mais informações sobre as funções de transformação de dados usadas neste exemplo, consulte Visão geral das funções.
As regras a seguir implementam o padrão tag-split-route:
Chame
e_setpara defina um campotagcom o valortarget1, target2.Utilize
e_splitpara dividir o log em duas cópias com base no campotag. Uma cópia contémtag: target1e a outra contémtag: target2.Na cópia
tag: target1, invoquee_composedentro dee_ifpara remover os campos f1 e f2 e, em seguida, envie o resultado para target1 come_output. Comoe_outputencerra o processamento dessa cópia, as regras subsequentes não se aplicam a ela.Para a cópia
tag: target2(que continua para a próxima regra), remova os campos f3 e f4 e envie o resultado para target2 usandoe_output.
e_set("tag", "target1, target2")
e_split("tag")
e_if(e_search("tag==target1"), e_compose(e_drop_fields("f1", "f2", regex=False), e_output("target1")))
e_drop_fields("f3", "f4", regex=False)
e_output("target2")
Resultado para target1
__time__ : 1591754815
f3: aliyun
f4: 200
f5: standard
Resultado para target2
__time__ : 1591754815
f1: GET
f2: https
f5: standard
Erro comum: usar e_coutput em vez de e_output
As regras de transformação abaixo produzem a saída correta para target1, mas causam perda de dados em target2:
e_drop_fields("f1", "f2", regex=False)
e_coutput("target1")
e_drop_fields("f3", "f4", regex=False)
e_output("target2")
Causa raiz
A função e_output encerra o processamento da entrada de log atual após enviá-la a um destino. Por outro lado, e_coutput envia uma cópia para o destino e continua executando as regras subsequentes no log já modificado.
Neste exemplo:
e_drop_fields("f1", "f2")remove f1 e f2 do log.e_coutput("target1")envia o log modificado (sem f1 e f2) para target1 — correto até aqui.O processamento continua com o mesmo log modificado (f1 e f2 já removidos).
e_drop_fields("f3", "f4")remove f3 e f4 desse log modificado.e_output("target2")envia um log contendo apenas f5 para target2 — perdendo tanto f1 quanto f2.
Resultado incorreto para target2
__time__ : 1591754815
f5: standard
Os campos esperados f1 e f2 estão ausentes porque já foram removidos na etapa 1.
Correção
Adote o padrão tag-split-route mostrado na seção Exemplo de configuração. Esse padrão cria cópias independentes do log original antes de aplicar modificações no nível de campo, garantindo que cada destino receba o conjunto correto de campos.