Registro de Logs dos Sistemas

Possibilita gravar os logs que foram registrados por classes dos sistemas em banco de dados e consultá-lo através de uma ferramenta no SIGAdmin. Com esse recurso, o log do servidor, além de ser gravado em arquivo e exibido no console, é também gravado em banco de dados utilizando um JDBCAppender. São armazenadas informações como timestamp do log, classe em que foi realizado o log, o servidor, a mensagem e o nível de log. Os níveis de log podem ser vistos abaixo.

  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

O sistema de consulta do log pode consultar o log por servidor, classe, nível de log, intervalo de datas e intervalo de horas.

O DDL necessário para registrar os logs no banco de dados pode ser visto na listagem abaixo.

CREATE TABLE log_servidor
(
  id INTEGER NOT NULL,
  nivel CHARACTER VARYING(15), -- Nível do log. Pode ser DEBUG, INFO, WARN, ERROR ou FATAL.
  classe CHARACTER VARYING(255), -- Classe na qual o log foi registrado.
  thread CHARACTER VARYING(30), -- Thread do servidor em que o log foi registrado.
  msg CHARACTER VARYING(255), -- Mensagem do log.
  layout_msg CHARACTER VARYING(255), -- Mensagem após a aplicação do layout do log4j.
  DATA DATE, -- Data do log.
  hora TIME WITHOUT TIME zone, -- Hora do log.
  servidor CHARACTER VARYING(50), -- Servidor em que o log foi registrado.
  CONSTRAINT logtest_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
 
ALTER TABLE log_servidor OWNER TO comum_user;
COMMENT ON TABLE log_servidor IS 'Classe que armazena as informações registradas em logs criados por classes dos sistemas.';
COMMENT ON COLUMN log_servidor.nivel IS 'Nível do log. Pode ser DEBUG, INFO, WARN, ERROR ou FATAL.';
COMMENT ON COLUMN log_servidor.classe IS 'Classe na qual o log foi registrado.';
COMMENT ON COLUMN log_servidor.thread IS 'Thread do servidor em que o log foi registrado.';
COMMENT ON COLUMN log_servidor.msg IS 'Mensagem do log.';
COMMENT ON COLUMN log_servidor.layout_msg IS 'Mensagem após a aplicação do layout do log4j.';
COMMENT ON COLUMN log_servidor.data IS 'Data do log.';
COMMENT ON COLUMN log_servidor.hora IS 'Hora do log.';
COMMENT ON COLUMN log_servidor.servidor IS 'Servidor em que o log foi registrado.';

Para o log ser registrado no banco de dados é necessário adicionar a biblioteca do JDBCAppender (jdbcappender.jar) ao diretório JBOSS_DIR/server/default/lib e configurar o JDBCAppender no arquivo de configuração do Log4J do JBoss. Este arquivo está localizado em JBOSS_DIR/server/default/conf/jboss-log4j.xml. Nesse arquivo é necessário realizar duas alterações. A primeira é adicionar a configuração do JDBCAppender, a segunda é informar ao logger que o JDBC appender será utilizado. Essas configurações podem ser vistas nos códigos abaixo.

Configurando o JDBCAppender

Os campos que necessitam de uma maior atenção são o dbclass, que representa a classe do driver JDBC do banco de dados; url, que representa a URL para acesso ao banco; username e password representam o usuário e senha de acesso; e sql, que precisa da informação de qual servidor está inserindo o log. Deve-se trocar o valor “nome_servidor”, presente na listagem abaixo, pelo nome do servidor que está gravando os logs.

Esse trecho deve ficar junto com os demais appenders do log4j, antes da declaração das categorias.

<appender name="JDBC" class="org.apache.log4j.jdbcplus.JDBCAppender">
		<param name="Threshold" value="DEBUG"/>
		<param name="dbclass" value="org.postgresql.Driver"/>
		<param name="url" value="jdbc:postgresql://desenvolvimento.info.ufrn.br:5432/sistemas_comum"/>
		<param name="username" value="comum_user"/>
		<param name="password" value="comum_user"/>
		<param name="buffer" value="1"/>
		<param name="commit" value="true"/>
		<param name="quoteReplace" value="true"/>
		<param name="throwableMaxChars" value="3000"/>
		<param name="sql" value="INSERT INTO LOG_SERVIDOR (id, nivel, classe, thread, msg, layout_msg, data, hora, servidor) VALUES (@INC@, '@PRIO@', '@CAT@', '@THREAD@', '@MSG@', '@LAYOUT:1@', cast ('@LAYOUT:3@' as date), cast ('@LAYOUT:4@' as time), 'nome_servidor')"/>
		<param name="layoutPartsDelimiter" value="#-#"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%t] %m#-##-#%d{dd.MM.yyyy}#-#%d{HH:mm:ss}"/>
		</layout>
   </appender>

Adicionando o appender ao logger

<category name="br.ufrn">
   <priority value="DEBUG"/>
   <appender-ref ref="JDBC"/>
</category>

Foi criada na arquitetura a classe br.ufrn.arq.seguranca.log.Logger que pode ser utilizada para registro de logs no sistema. A classe possibilita criar logs nos cinco níveis descritos acima através dos métodos estáticos debug(), info(), warn(), error() e fatal(). Um exemplo de uso pode ser encontrado na classe br.ufrn.services.wireless.AutenticaServlet, onde um log é criado quando uma tentativa de autenticação na rede Wireless falha.

// verifica se pode autorizar
autorizado = ConexaoWAS.autenticar(req.getRemoteAddr(), idUsuario);
 
if (autorizado) {
	res.sendRedirect("/admin/wireless/autenticado.jsf");
	return;
} else {
	Logger.error("Falha na autorização Wireless (IP: " + req.getRemoteAddr() + ")");
}

A consulta aos logs gerados na aplicação pode ser realizada pelo SIGAdmin, através do menu Auditoria, conforme pode ser visto na figura abaixo.

Podemos consultar por servidor, nível de log, classe que gerou o log, intervalo de datas e intervalo de horas. Os resultados são exibidos em uma listagem na mesma página e maiores detalhes de cada log podem ser vistos clicando na lupa (ver ilustração abaixo).

Sistema: SIGAdmin

Usuário: david, gleydson

Link: Auditoria → Consultar Log do Servidor

Descrição

  1. Configurar o Log4J no JBoss conforme descrição acima.
  2. Acessar a consulta de log no SIGAdmin e realizar consultas.
  3. Verificar se os dados retornados são válidos e se a consulta está de acordo com os padrões.
  • desenvolvimento/especificacoes/sigadmin/casos_de_uso/portal_da_administracao/auditoria/consular_logs/log_do_servidor.txt
  • Última modificação: 2017/04/03 18:15
  • (edição externa)