Funcionalidade que padroniza os códigos que são enviados para o Kibana e Auditoria.
- Esdras Castro esdras.castro@accenture.com
npm i oi-log-message
Cria um log padronizado para ser utilizado no Debug, Kibana e Auditoria. Para utilizá-lo basta importar a classe LogMessage da biblioteca oi-log-message
const { LogMessage } = require('oi-log-message');
Instanciá-la no construtor da classe que irá utilizar passando o escopo this e o nome do arquivo __filename, conforme exemplo abaixo:
class Exemplo {
contructor() {
super({
module: 'Nome da Funcionalidade - Outras informações',
});
this.log = new LogMessage(this, __filename);
}
}
-
__filname
é uma variável nativa do javascript -
this
contém o escopo do objeto corrente -
this.log
será o atributo da classe que vai conter a instância de LogMessage
const service = require('../service/minha-service.js');
class Exemplo extends BaseController {
contructor() {
super({
module: 'Nome da Funcionalidade - Outras informações',
});
this.log = new LogMessage(this, __filename);
}
teste(req, res, next) {
this.log.setRequest(req);
service.testaService(dados, req);
}
}
-
teste(req, res, next)
Método executado pelo route da aplicação -
setRequest(req)
Adiciona o escopo do request da API para dentro do LogMessage -
service.testaService(dados, ..., req)
Exemplo de chamada a método de uma service passando os dados necessários na service, e o request da API.
Quando uma classe não possui o request da API, este deve recebê-lo como parâmetro no método chamado.
// class Exemplo extends BaseRest {
class Exemplo extends BaseService {
contructor() { ... }
testaService(dados, req) {
// req recebido via parâmetro e adicionado ao escopo do LogMessage (this.log.setRequest(req))
this.log.setRequest(req);
}
}
-
dados
exemplo de parâmetros recebidos por um o método de uma service -
req
Requisição da API, ela vem como parâmetro no metodo do controller executado em Route
Quando não é necessário a inclusão do request no escopo da mensagem (Controller, Service ou Integration)
Quando o método que já adicionou o request, no escopo da mensagem, e depois chama outro método dentro da mesma classe, não é necessário adicionar novamente o escopo do request na mensagem. Porém, caso seja necessário trocar as informações do request, pode-se adicionar um novo escopo de request da API.
class Exemplo extends BaseService {
contructor() { ... }
// Método para uso apenas nesta classe, não é utilizado externamente ou por outra aplicação/funcionalidade
naoPrecisaDeRequest() {
// Exemplo de uso sem a adição do espoco do request.
// Neste caso, só utilizamos o LogMessage normalmente.
this.log.success('Mensagem do sucesso', objetoParaLog);
}
// Método executado pelo route.js
teste(dados, req) {
this.log.setRequest(req);
// Exemplo de chamada ao método local sem a passagem do parâmetro req
this.naoPrecisaDeRequest();
}
}
-
dados
exemplo de parâmetros recebidos por um método de uma service -
req
Requisição da API, ela vem como parâmetro no metodo do controller executado em Route
Todos os métodos abaixo serão exemplificados e mostrados suas saídas e ações requeridas antes de executá-los.
success(description, object) => void
- Imprime uma mensagem de sucesso
error(description, object) => void
- Imprime uma mensagem de erro
debug(description, object) => void
- Imprime uma mensagem de debug.
~ Devesse executar o setStatus(erro = false)
antes de rodar o debug()
. Caso contrário, irá imprimir o status da última mensagem executada.
catch(errorObject, description, object) => void
- Imprime uma mensagem de erro. Ele verifica se o erro captura está no escopo do método corrente, e se já foi tratado. Caso já tenha sido tratado, não imprime a mensagem, do contrário, imprime a mensagem description
definida e o objeto object
passado.
-
errorObject
Objeto de erro gerado por uma exceção na aplicação. Vêm notry{...}catch(
errorObject
){...}
do bloco try/catch. -
description
Mensagem descritiva a ser logada -
object
Objeto a ser apresentada no log do Kibana (pretty)
toString() => string
- Retorna a mensagem formatada da última mensagem e status definidos.
print(object) => void
- Retorna a mensagem formatada da última mensagem e status definidos. A diferênça dela para o toString()
é que, este possui métodos a serem executados antes de efetuar o print.
-
getCaller
- Utilizado para atribuir o nome da thread do método corrente -
useLastCaller
- Utilizando em conjunto com o getCaller quando se quer substituir o caller de um método pelo último método chamado.
Exemplo 1:
this.log.getCaller().useLastCaller();
Exemplo 2:this.log.useLastCaller(false);
sucesso
class Exemplo {
constructor() {...}
teste(req, res, next) {
...
this.log.success('Teste Sucesso', {
Request: { produto },
Response: response
});
/*
Exemplo de saída no Kibana:
msg: [minhaoi] [Minha Funcionalidade] [nome-arquivo] [teste] [sucesso] [00000000001] - Teste Sucesso
pretty: {
Request: {
produto: { ... }
},
Response: { ... },
APIRequest: { ... }
}
*/
}
}
erro
class Exemplo {
constructor() {...}
teste(req, res, next) {
...
this.log.error('Teste Erro', {
Request: { produto }
});
/*
Exemplo de saída no Kibana:
msg: [minhaoi] [Minha Funcionalidade] [nome-arquivo] [teste] [Erro] [00000000001] - Teste Erro
pretty: {
Request: {
produto: { ... }
},
APIRequest: { ... }
}
*/
}
}
catch
quando a mensagem do erro não foi formatada ou não pertence ao método corrente
class Exemplo {
constructor() {...}
teste(req, res, next) {
...
try {
// P1
this.log.error('Teste Erro no try/catch');
throw new Error('Exceção executada');
} catch (error) {
//P2
this.log.catch(error, 'Teste Catch', {
Request: { produto }
});
}
/*
Exemplo de saída no Kibana:
[P1]
msg: [minhaoi] [Minha Funcionalidade] [nome-arquivo] [teste] [erro] [00000000001] - Teste Erro no try/catch
pretty: null
[P2]
msg: [minhaoi] [Minha Funcionalidade] [nome-arquivo] [teste] [erro] [00000000001] - Teste Catch
pretty: {
Request: { produto: { ... } },
APIRequest: { ... },
StackTrace: { ... }
}
*/
}
}
catch
quando a mensagem do erro já foi formatada e pertence ao método corrente
class Exemplo {
constructor() {...}
teste(req, res, next) {
...
try {
// P1
this.log.error('Teste Erro no try/catch');
throw new Error(this.log.toString());
} catch (error) {
//P2
this.log.catch(error, 'Teste Catch', {
Request: { produto }
});
}
/*
Exemplo de saída no Kibana:
[P1]
msg: [minhaoi] [Minha Funcionalidade] [nome-arquivo] [teste] [erro] [00000000001] - Teste Erro no try/catch
pretty: null
[P2]
Não tem impressão
*/
}
}
toString
class Exemplo {
constructor() {...}
teste(req, res, next) {
...
this.log.error('Teste Erro', {
Request: { produto }
});
const errorMessage = this.log.toString();
// errorMessage: [minhaoi] [Minha Funcionalidade] [nome-arquivo] [teste] [Erro] [00000000001] - Teste Erro
}
}
setError
esetMessage
class Exemplo {
constructor() {...}
teste(req, res, next) {
...
const rand = Math.random() * 10;
this.log
.setError(false)
.setMessage('Número gerado é maior ou igual que 5');
if(rand < 5) {
this.log
.setError(true)
.setMessage('Número gerado é inferior a 5');
}
this.log.print({ random: rand });
/*
Exemplo de saída no Kibana:
[Caso 1] rand = 2
msg: [minhaoi] [Minha Funcionalidade] [nome-arquivo] [teste] [Erro] [00000000001] - Número gerado é inferior a 5
pretty: {
random: 2,
APIRequest: { ... }
}
[Caso 2] rand = 9
msg: [minhaoi] [Minha Funcionalidade] [nome-arquivo] [teste] [Sucesso] [00000000001] - Número gerado é maior ou igual que 5
pretty: {
random: 9,
APIRequest: { ... }
}
*/
}
}
then()
ecatch()
const service = require('./service');
class Exemplo {
constructor() {...}
teste(req, res, next) {
...
service.executaTeste(dados, req)
.then(response => {
this.log.addScope(this).setRequest(req);
this.log.success('Teste callback', {
Request: { dados },
Response: response
});
})
.catch(error => {
this.log.addScope(this).setRequest(req);
this.log.error('Teste callback 2', {
Request: { dados },
Response: response
});
});
/*
Exemplo de saída no Kibana:
msg: [minhaoi] [Minha Funcionalidade] [exemplo] [executaTeste.then] [Sucesso] [00000000001] - Teste callback
msg2: [minhaoi] [Minha Funcionalidade] [exemplo] [executaTeste.catch] [Erro] [00000000001] - Teste callback 2
pretty: {
Request: {
produto: { ... }
},
Response: { ... },
APIRequest: { ... }
}
*/
}
}