top of page

Debuggando Apex - Debug Logs

Atualizado: 11 de out. de 2023



Introdução

Nessa pequena série de posts iremos abordar as formas de debugar seu código, a iniciar por "Debug Logs"


Existem diversas formas de encontrar erros na execução do nosso código, uma delas sendo escrevendo classes de teste, que não só é uma boa prática, como também uma necessidade para que possamos dar deploy do nosso código para ambientes de homologação e produção. Isso posto, todo desenvolvedor já passou pela infeliz experiência de ter um código totalmente ou majoritariamente coberto e ainda assim um bug escapar. Nós gostamos de acreditar que as classes de teste e que a aprovação do QA nos garante um código o mais perto do perfeito, mas também sabemos que o usuário sempre pode encontrar algo que ninguém jamais imaginaria. O que fazer então?


Debug Logs

Os logs de debug são ferramentas extremamente poderosas, que nos mostram passo a passo o que aconteceu, desde a chamada da nossa classe até onde o erro foi causado e qual o erro resultante disso. Os debug logs podem conter informações sobre:

  • Alterações no banco de dados

  • Chamadas HTTP

  • Erros no Apex

  • Recursos utilizados pelo Apex

  • Processos automatizados como:

    • Workflow

    • Processos de Aprovação

    • Regras de Validação

    • Flows


Segue aqui um código bastante simples que será utilizado para esse exemplo:

public with sharing class CalcularMedia {
    public static void calcularMedia(Id studentId) {
        List<AggregateResult> result = [SELECT AVG(Grade__c) avgGrade 
                                        FROM Grade__c
                                        WHERE Student__c = :studentId
                                        AND Name LIKE 'Unit%'];
        if (!result.isEmpty()) {
            Decimal average = (Decimal)result[0].get('avgGrade');
            System.debug('Média: ' + average);
        } else {
            System.debug('Nenhum resultado encontrado para o cálculo da média.');
        }
    }
}

Para uma breve explicação de como utilizar, o caminho para gerar um Debug Log é:

Setup -> Debug Logs

Ao clicar em "New" podemos escolher o que será debugado e o nível de depuração. Você pode criar novos níveis.

Eles podem tanto ser vistos na plataforma quanto baixados.

Como podem ver, o nosso debug aparece após a execução do código.

Os mais experientes podem então falar do problema que é o System.debug() em ambientes produtivos, correndo o risco de vazar informações. Então segue aqui um snippet de código muito utilizado na empresa que trabalho para que possamos ter os debugs em nossos ambientes de sandbox sem correr esse risco

public static Boolean isSandbox(){
    Boolean isSandbox = [SELECT IsSandbox
                                             FROM Organization
                                             LIMIT 1].IsSandbox;
    return isSandbox;
}


Limites

Os Debug Logs tem os seguintes limites:

  • Cada log deve ter 20MB ou menos. Logs maiores terão seus tamanhos reduzidos removendo linhas como System.debug(), a se iniciar pelas mais antigas. Essas linhas podem ser removidas de qualquer parte do arquivo, não apenas do inicio.

  • System Debugs são mantidos por 24 horas. Monitoring Debugs são mantidos por sete dias.

  • Caso sejam gerados mais de 1.000MB de logs em uma janela de 15 minutos, a trace flag será desativada. A Salesforce envia um email para os usuários que modificaram a trace flag mais recentemente informando que a mesma pode ser ativa novamente em 15 minutos. Por essa razão é interessante evitar ativação de trace flags para classes muito utilizadas.

  • Quando a org atinge 1.000MB de logs, se torna impossível a adição ou edição de trace flags. Para a adição ou edição será então necessário deletar logs.


Seções

O tipo e quantidade de informações em um log depende dos filtros atribuídos a ele no entanto, o formato é sempre o mesmo.

Header

O Header (cabeçalho) contém as seguintes informações

  • Versão da API da transação

  • Categoria e nível usado para gerar o log.


Sendo:

Categoria

Nível

Apex Code

Finest

Apex Profiling

Info

Callout

Info

Database

Info

NBA

Info

System

Debug

Validation

Info

Visualforce

Info

Wave

Info

Workflow

Info


ATENÇÃO

Se "Apex Code" for Finest, o debug irá incluir detalhes de atribuição de variáveis. Certifique-se de que não existem dados sensíveis sendo utilizados.


Execution Units

Uma Execution Units (unidade de execução) nada mais é do que uma transação. Ela contém todas as ocorrências dentro da transação. Elas são delimitadas por "EXECUTION_STARTED" e "EXECUTION_FINISHED"


Code Units

Uma Code Unit (Unidade de código) é uma Unit of Work(unidade de trabalho) discreta, como uma trigger ou um método webservice. Segue uma lista com algumas Code Units, mas note que ela não é completa.

  • Triggers

  • Workflow invocations and time-based workflow

  • Validation rules

  • Approval processes

  • Apex lead convert

  • @future method invocations

  • Web service invocations

  • executeAnonymous calls

  • Visualforce property accesses on Apex controllers

  • Visualforce actions on Apex controllers

  • Execution of the batch Apex start and finish methods, and each execution of the execute method

  • Execution of the Apex System.Schedule execute method

  • Incoming email handling


Linhas

Dentro das Code Units as linhas tem uma Timestamp e um Event Identifier que são separados por um pipe (|).


Timestamp: Horário que um evento ocorreu. O horário é o mesmo do usuário e segue o formato de horas:minutos:segundos:milisegundos. O valor entre parênteses representa o tempo em nano segundos desde o inicio da requisição. Esse último valor não aparece quando vemos um log pelo Developer Console, mas pode ser visto ao ir na aba "Logs", clicar com o botão direito no log desejado e clicar em "Open Raw Log". Event Identifier: Representa o evento que criou aquele registro no log.


Outros dados

O log contém também as seguintes informações:


Uso de Recursos

Utilização de recursos da plataforma são mostrados aqui

Uso Cumulativo

Ao fim de cada transação temos esse log que contém informações acerca de invocações DML, queries pesadas e afins.



Encerramento

Espero que esse post tenha te ajudado a entender um pouco melhor dessa ferramenta muitas vezes deixada de lado por sua interface não muito amigável. Nos próximos posts seguiremos a documentação com debug logs no Developer Console, Debug de chamadas de API e Ordem de Precedência dos logs.

Até a Próxima!


Fonte



Posts recentes

Ver tudo

Comments


© 2023, BrazucaForce - Todos os direitos reservados

Políticas de Privacidade

bottom of page