3.1 Lista de níveis de eventos
Logging é o processo de registro de quaisquer eventos que ocorrem durante a execução do programa. Seu dever como programador é record everything important
porque assim, quando production
houver erros estranhos e/ou graves, você não terá mais nada além desses logs.
Qualquer erro será eliminado muitas vezes mais rápido se você tiver todas as informações sobre ele e sobre todo o histórico das chamadas. Mas uma conclusão simples segue daqui - para registrar tudo em geral: chamadas de todos os métodos, valores de todos os parâmetros.
Isso também não é uma opção - muita informação é tão ruim quanto pouca. Precisamos de registro inteligente. Feito pelo homem para o homem. E aqui chegamos ao primeiro fato sobre o registro - todas as entradas no registro são divididas em categorias, mesmo no momento de sua criação.

O programador, ao escrever um evento no log, deve decidir por si mesmo a importância dessa informação. O nível de gravidade do evento é escolhido pelo autor da mensagem. Existem log4j
5 níveis de importância das informações registradas:
DEBUG
INFO
WARN
ERROR
FATAL
A seguir, falaremos sobre eles com mais detalhes.
3.2 DEBUGAR
O nível DEBUG
é considerado o menos importante. As informações gravadas no log com esse nível de importância são necessárias apenas durante a depuração do aplicativo. Para registrar as informações necessárias durante a depuração, o método é usado debug()
.
Exemplo:
class Manager {
private static final Logger logger = LoggerFactory.getLogger(Manager.class);
public boolean processTask(Task task) {
logger.debug("processTask id = " + task.getId());
try {
task.start();
task.progress();
task.complete();
return true;
} catch (Exception e) {
logger.error("Unknown error", e);
return false;
}
}
}
Preste atenção, o método debug
está bem no começo do método (o método ainda não teve tempo de fazer nada) e escreve no log o valor da variável passada para o método. Este é o caso de uso mais comum para o método debug()
.
3.3 INFORMAÇÕES e AVISOS
Os próximos dois níveis são INFO
e WARN
. Existem dois métodos para eles - info()
e warn()
.
O nível INFO
é usado simplesmente para mensagens informativas: isso e aquilo acontece. Quando você começa a analisar um erro no log, pode ser muito útil ler seu histórico. O método é perfeito para isso info()
.
O nível WARN
é usado para escrever avisos (da palavra warning ). Normalmente, com esse nível de importância, é escrita a informação de que algo deu errado, mas o programa sabe o que fazer nessa situação.
Por exemplo, no processo de gravação de um arquivo no disco, descobriu-se que esse arquivo já existe. Aqui o programa pode registrar um aviso (aviso), mas mostrar ao usuário uma caixa de diálogo e oferecer a seleção de um nome de arquivo diferente.
Exemplo:
class FileManager {
private static final Logger logger = LoggerFactory.getLogger(FileManager.class);
public boolean saveFile(FileData file) {
logger.info(“save the file ” + file.getName());
boolean resultOK = SaveUtils.save(file);
if (resultOK) return true;
logger.warn(“file writing problem ” + file.getName());
String filename = Dialog.selectFile();
boolean result = SaveUtils.save(file, filename);
return result;
}
3.4 ERRO e FATAL
Finalmente, os dois níveis de log mais importantes são ERROR
e FATAL
. Para eles, também existem métodos especiais com os mesmos nomes: error()
e fatal()
.
Eles também decidiram dividir os erros em duas categorias - erros comuns e erros fatais . Um erro fatal geralmente resulta em uma falha de aplicativo (para aplicativos de desktop) ou uma falha de serviço da web (para aplicativos da web).
Outro bom exemplo é o sistema operacional Windows. Se o seu programa acabou de travar, do ponto de vista do sistema operacional, isso é Error
. E se o próprio sistema operacional caiu e você vê a tela azul da morte do Windows, isso já é Fatal error
.
Em aplicativos Java, os eventos Error
são frequentemente Fatal
associados a exceções geradas. Exemplo:
class Manager {
private static final Logger logger = LoggerFactory.getLogger(Manager.class);
public boolean processTask(Task task) {
logger.debug("processTask id = " + task.getId());
try {
task.start();
task.progress();
task.complete();
return true;
} catch (Exception e) {
logger.error("Unknown error", e);
return false;
}
}
}
3.5 O que registrar
Claro, não vale a pena registrar tudo seguido. Na maioria dos casos, isso piora drasticamente a legibilidade do log e, afinal, o log é gravado em primeiro lugar para ser lido.
Além disso, você não pode gravar várias informações pessoais e financeiras no log. Agora com isso de forma estrita e fácil você pode incorrer em multas ou processos judiciais. Mais cedo ou mais tarde, esse log vazará para o lado e não haverá problemas.
Então, o que deve ser registrado?
Primeiro, você precisa registrar o início do aplicativo . Após o início do aplicativo, é recomendável registrar seu modo de operação e várias configurações importantes - isso facilitará a leitura do registro no futuro.
Em segundo lugar, você precisa registrar o status de todos os serviços de terceiros com os quais seu aplicativo funciona: sistemas de correspondência, quaisquer serviços externos. No mínimo, você precisa garantir o momento de conexão com eles para garantir que funcionem corretamente.
Em terceiro lugar, todas as exceções precisam ser registradas . Se forem esperados, as informações sobre eles podem ser escritas de forma compacta. Informações completas sobre exceções fornecem 50% a 80% das informações importantes ao procurar um bug.
Você também precisa registrar o desligamento do aplicativo . O aplicativo deve encerrar normalmente e não lançar dezenas de erros no log. Freqüentemente, neste local, você pode encontrar tarefas travadas, problemas com o pool de threads ou problemas com a exclusão de arquivos temporários.
Certifique-se de registrar tudo relacionado à segurança e autorização do usuário . Se um usuário tentar fazer login ou redefinir sua senha 10 vezes seguidas, essas informações devem ser refletidas nos logs.
Registre o máximo possível de informações sobre tarefas assíncronas - as exceções geralmente são perdidas nesses encadeamentos. Para uma tarefa assíncrona, certifique-se de registrar seu início e fim. A conclusão bem-sucedida deve ser registrada da mesma forma que uma problemática.
O que mais? Lançamento de tarefas cronometradas, lançamento de tarefas armazenadas SQL-procedures
, sincronização de dados, tudo relacionado a transações distribuídas. Acho que é o suficiente para começar. Você adicionará a esta lista no futuro.
GO TO FULL VERSION