A análise de logs de erro Java em cenários de big data e alta concorrência ajuda a reduzir custos de O&M. O Simple Log Service coleta logs de erro Java de serviços da Alibaba Cloud e os analisa por meio de transformação de dados.
Pré-requisitos
Os logs de erro Java do SLS, OSS, SLB e ApsaraDB RDS foram coletados e armazenados em um Logstore chamado cloud_product_error_log. Para mais informações, consulte Usar o Logtail para coletar logs.
Casos de uso
Por exemplo, suponha que você tenha desenvolvido uma aplicação Java chamada Aplicação A utilizando vários serviços da Alibaba Cloud, como OSS e SLS. Você criou um Logstore chamado cloud_product_error_log na região China (Hangzhou) para armazenar logs de erro Java gerados por chamadas de API a esses serviços. Para corrigir erros Java com eficiência, analise os logs de erro em intervalos regulares usando o Simple Log Service.
Para atender a esses requisitos, extraia dos logs coletados as seguintes informações: horário do log, código de erro, código de status, informações do serviço, mensagem de erro, método de requisição e número da linha do erro. Em seguida, armazene os logs analisados no Logstore de cada serviço para analisar os erros.
Veja abaixo um exemplo de log bruto:
__source__:192.0.2.10
__tag__:__client_ip__:203.0.113.10
__tag__:__receive_time__:1591957901
__topic__:
message: 2021-05-15 16:43:35 ParameterInvalid 400
com.aliyun.openservices.log.exception.LogException:The body is not valid json string.
at com.aliyun.openservice.log.Client.ErrorCheck(Client.java:2161)
at com.aliyun.openservice.log.Client.SendData(Client.java:2312)
at com.aliyun.openservice.log.Client.PullLogsk(Client.java:1397)
at com.aliyun.openservice.log.Client.SendData(Client.java:2265)
at com.aliyun.openservice.log.Client.GetCursor(Client.java:1123)
at com.aliyun.openservice.log.Client.PullLogs(Client.java:2161)
at com.aliyun.openservice.log.Client.ErrorCheck(Client.java:2426)
at transformEvent.main(transformEvent.java:2559)
Fluxo de trabalho
O Logtail coleta logs de erro da Aplicação A e os envia para um Logstore chamado cloud_product_error_log. Os logs são então processados por meio de transformação de dados e entregues aos respectivos Logstores para análise. O fluxo de trabalho geral é o seguinte:
Elaborar uma instrução de transformação de dados: analise os dados e escreva a instrução de transformação.
Crie um job de transformação de dados: distribua os logs para os Logstores com base no serviço para análise de erros.
Consultar e analisar dados: examine os logs de erro no Logstore de cada serviço.
Etapa 1: Elaborar uma instrução de transformação de dados
Transformation process
Para analisar logs de erro:
Extraia o carimbo de data/hora, código de erro, código de status, informações do serviço, mensagem de erro, método de requisição e número da linha do erro do campo
message.Armazene os logs de erro no Logstore de cada serviço.

Transformation logic
Analise o carimbo de data/hora, código de erro, código de status, informações do serviço, mensagem de erro, método de requisição e número da linha do erro nos logs brutos. Em seguida, crie uma expressão regular para extrair esses campos.
Syntax reference
Utilize a função
regex_matchpara verificar se uma entrada de log contémLogException. Para mais informações, consulte regex_match.Caso um log corresponda a
LogException, ele será processado conforme as regras de análise para logs de erro do SLS. Se corresponder aOSSException, seguirá as regras para logs de erro do OSS. Para mais detalhes, veja e_switch.Aplique a função
e_regexpara analisar os logs de erro correspondentes com uma expressão regular. Consulte e_regex para mais informações.Exclua o campo
messageoriginal e entregue os dados analisados ao Logstore do serviço apropriado. Veja e_drop_fields e e_output para detalhes adicionais.Para saber mais sobre grupos em expressões regulares, consulte Grupos em expressões regulares.
Syntax analysis
O exemplo a seguir demonstra como analisar um log de erro do SLS usando uma expressão regular:
A sintaxe completa de transformação é a seguinte:
e_switch(
regex_match(v("message"), r"LogException"),
e_compose(
e_regex(
"message",
"(?P<data_time>\S+\s\S+)\s(?P<error_code>[a-zA-Z]+)\s(?P<status>[0-9]+)\scom\.aliyun\.openservices\.log\.exception\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9:,\-\s]+)\.(\s+\S+\s\S+){5}\s+\S+\scom\.aliyun\.openservices\.log\.Client\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java\:(?P<error_line>[0-9]+)\)",
),
e_drop_fields("message"),
e_output("sls-error"),
),
regex_match(v("message"), r"OSSException"),
e_compose(
e_regex(
"message",
"(?P<data_time>\S+\s\S+)\scom\.aliyun\.oss\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9,\s]+)\.\n\[ErrorCode\]\:\s(?P<error_code>[a-zA-Z]+)\n\[RequestId\]\:\s(?P<request_id>[a-zA-Z0-9]+)\n\[HostId\]\:\s(?P<host_id>[a-zA-Z-.]+)\n\S+\n\S+(\s\S+){3}\n\s+\S+\s+(.+)(\s+\S+){24}\scom\.aliyun\.oss\.OSSClient\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java:(?P<error_line>[0-9]+)\)",
),
e_drop_fields("message"),
e_output("oss-error"),
),
)
Etapa 2: Crie um job de transformação de dados
-
Acesse a página de transformação de dados.
Na seção Projects, clique em no projeto desejado.
Na aba , clique em no Logstore desejado.
Na página de consulta e análise, clique em Data Transformation.
-
No canto superior direito da página, selecione um intervalo de tempo para os dados de log.
Certifique-se de que haja logs disponíveis na aba Raw Logs.
-
No editor, insira a instrução de transformação de dados.
e_switch( regex_match(v("message"), r"LogException"), e_compose( e_regex( "message", "(?P<data_time>\S+\s\S+)\s(?P<error_code>[a-zA-Z]+)\s(?P<status>[0-9]+)\scom\.aliyun\.openservices\.log\.exception\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9:,\-\s]+)\.(\s+\S+\s\S+){5}\s+\S+\scom\.aliyun\.openservices\.log\.Client\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java\:(?P<error_line>[0-9]+)\)", ), e_drop_fields("message"), e_output("sls-error"), ), regex_match(v("message"), r"OSSException"), e_compose( e_regex( "message", "(?P<data_time>\S+\s\S+)\scom\.aliyun\.oss\.(?P<product_exception>[a-zA-Z]+)\:(?P<error_message>[a-zA-Z0-9,\s]+)\.\n\[ErrorCode\]\:\s(?P<error_code>[a-zA-Z]+)\n\[RequestId\]\:\s(?P<request_id>[a-zA-Z0-9]+)\n\[HostId\]\:\s(?P<host_id>[a-zA-Z-.]+)\n\S+\n\S+(\s\S+){3}\n\s+\S+\s+(.+)(\s+\S+){24}\scom\.aliyun\.oss\.OSSClient\.(?P<method>[a-zA-Z]+)\S+\s+\S+\stransformEvent\.main\(transformEvent\.java:(?P<error_line>[0-9]+)\)", ), e_drop_fields("message"), e_output("oss-error"), ), ) -
Clique em Preview Data.
__source__: xxx __tag__:__client_ip__: xxx __tag__:__receive_time__: 1590978615 __topic__: data_time: 2020-05-16 18:30:06 error_code: AccessDenied error_line: 399 error_message: You are forbidden to list buckets host_id: xxx.oss-cn-hangzhou.aliyuncs.com method: getBucket product_exception: OSSException request_id: YGYLUM9LG2USA6M7HYUBT1L0 -
Crie o job de transformação de dados.
Clique em Save as Transformation Job.
-
No painel Create Data Transformation Job, configure os parâmetros a seguir e clique em OK.
Parâmetro
Descrição
Job name
Nome do job de transformação de dados. Por exemplo, insira test.
Authorization method
Selecione Default Role para conceder permissões de leitura de dados do Logstore de origem.
Storage target
Target name
Nome do destino de armazenamento. Por exemplo, insira sls-error e oss-error.
Target region
Região do projeto de destino. Por exemplo, selecione China (Hangzhou).
Target project
Projeto de destino para os dados transformados.
Target store
Logstore de destino para os dados transformados. Por exemplo, insira sls-error e oss-error.
Authorization method
Selecione default role para conceder permissões de escrita dos resultados da transformação de dados no Logstore de destino.
Processing range
Time range
Selecione All para o intervalo de tempo.
Após criar o job de transformação de dados, o Simple Log Service gera automaticamente um painel para monitoramento. Nesse painel, visualize as métricas do job.
O gráfico Exception Detail exibe quais entradas de log falharam na análise, auxiliando no ajuste da expressão regular.
Um log de nível WARNING indica uma falha de análise que não interrompe o job.
Um log de nível ERROR interrompe o job. Identifique e resolva o problema e modifique a expressão regular até que o job consiga analisar todos os tipos de logs de erro.
Etapa 3: Analisar dados de logs de erro
Depois que os logs de erro brutos forem transformados, analise os dados estruturados. Esta seção utiliza logs de erro Java do Simple Log Service como exemplo.
-
Na seção Projects, clique em no projeto desejado.

-
Na aba , clique em no Logstore desejado.

-
Na caixa de pesquisa, insira uma instrução de consulta.
-
Conte o número de erros por método.
* | SELECT COUNT(method) as m_ct, method GROUP BY method -
Identifique a mensagem de erro mais comum para o método
PutLogs.* | SELECT error_message,COUNT(error_message) as ct_msg, method WHERE method LIKE 'PutLogs' GROUP BY error_message,method -
Conte as ocorrências de cada código de erro.
* | SELECT error_code,COUNT(error_code) as count_code GROUP BY error_code -
Crie uma linha do tempo de erros para visualizar informações de erros de chamadas de API em tempo real.
* | SELECT date_format(data_time, '%Y-%m-%d %H:%m:%s') as date_time,status,product_exception,error_line, error_message,method ORDER BY date_time desc
-
-
Clique em 15Minutes(Relative) para definir o intervalo de tempo da consulta.
É possível especificar um tempo relativo, um período fixo ou um intervalo de tempo personalizado.
NotaO resultado da consulta pode apresentar uma margem de erro de até um minuto.
Clique em Search & Analyze para visualizar os resultados da consulta e análise.