terça-feira, 16 de dezembro de 2008

Configurando o Log4j para gerar múltiplas saídas

Configurando o Log4j para gerar múltiplas saídas.

Uma explicação rápida.
Enquanto estudava o hibernate vi a necessidade de criar mensagens de log para melhor acompanhar o funcionamento do sistema. Vi que já tinha importado a biblioteca do log4j e resolvi entender o mesmo.
Para que o hibernate funcione corretamente é necessária a importação da biblioteca log4j, a versão utilizada por mim “log4j-1.2.11”. Para configurar o funcionamento do log4j a forma mais fácil e comum é atravéz de um arquivo “properties” o nome padrão é “log4j.properties” e deve estar de preferência na raiz da sua aplicação.
Vou colocar aqui um exemplo de configuração do arquivo, serve como fonte de pesquisa.

log4j.rootLogger= stdout, erros, info
### ordem || levels ALL <>

#mostra o log4j se configurando no console...
#log4j.debug=true

## direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=ERROR
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file erros.log ###
log4j.appender.erros=org.apache.log4j.DailyRollingFileAppender
log4j.appender.erros.File=./logs/erros.log
log4j.appender.erros.DatePattern='.'yyyy-MM-dd
log4j.appender.erros.layout=org.apache.log4j.PatternLayout
log4j.appender.erros.layout.ConversionPattern=%5p %d{dd MMM HH:mm:ss} [%t] %c - %m%n
log4j.appender.erros.Threshold=ERROR
log4j.appender.erros.FILE.MaxFileSize=10000KB

### direct messages to file info.log ###
log4j.appender.info=org.apache.log4j.FileAppender
log4j.appender.info.File=./logs/info.log
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.info.FILE.MaxBackupIndex=4
log4j.appender.info.Threshold=info
log4j.appender.info.FILE.MaxFileSize=5KB

Explicando o arquivo:

Na primeira linha são criadas tres saidas de informações os “appenders”, eu dei os nomes de stdout, erros e info.

Na segunda linha deixei um comentário tendo a ordem dos levels dos logs:
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
Caso queira testar se o seu arquivo de configuração do log4j esteja sendo carregado com sucesso habilite o debug do log4j “#log4j.debug=true”;

Aqui estou gerando saídas no console para todos os logs de level ERROR ou superior, notem o começo de cada linha especificando qual appender esta sendo configurado” log4j.appender.(stdout)”. O ConversionPattern pode ser alterado de acordo com a necessidade.

## direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=ERROR
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

Aqui estou gerando um arquivo de logs com o nome erros.log dentro do diretório logs, netem que o tipo desse appender e “org.apache.log4j.DailyRollingFileAppender”. Esse arquivo será salvo diariamente com a data no formato especificado no DatePattern. Após a virada do dia quando ocorrer algum log será renomeado o arquivo erros.log acrecentando-se a data e será criado um novo arquivo erros.log.

### direct messages to file erros.log ###
log4j.appender.erros=org.apache.log4j.DailyRollingFileAppender
log4j.appender.erros.File=./logs/erros.log
log4j.appender.erros.DatePattern='.'yyyy-MM-dd
log4j.appender.erros.layout=org.apache.log4j.PatternLayout
log4j.appender.erros.layout.ConversionPattern=%5p %d{dd MMM HH:mm:ss} [%t] %c - %m%n
log4j.appender.erros.Threshold=ERROR
log4j.appender.erros.FILE.MaxFileSize=10000KB

E por ultimo crio um arquivo de log para todas as mensagens de level “INFO” geradas pelo sistema.

### direct messages to file info.log ###
log4j.appender.info=org.apache.log4j.FileAppender
log4j.appender.info.File=./logs/info.log
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.info.FILE.MaxBackupIndex=4
log4j.appender.info.Threshold=info
log4j.appender.info.FILE.MaxFileSize=5KB

Tentei controlar o tamanho do arquivo colocando 5KB para ver o que o log4j faria, mas realmente ele não fez nada. Caso descubra algo crio um novo post aqui.

segunda-feira, 15 de dezembro de 2008

GeneratedValue com Hibernate no Firebird

Estou desenvolvendo um novo sistema em java e estou utilizando o Hibernate annotations, tive muitas dificuldades para aprender a utilizar as funcionalidades disponibilizadas pelo Hibernate, uma delas foi a utilização de autoincremento (Generators) do Firebird. Por isso estou postando aqui um exemplo.

Digamos que você queira criar uma tabela que ira salvar dados de uma conexão.

DDL do ibExpert:

CREATE TABLE TCPIP (

CODTCPIP INTEGER NOT NULL,

IP VARCHAR(100),

PORTA INTEGER,

GATEWAY VARCHAR(23),

MASCARA VARCHAR(30),

EQUIPSERIAL INTEGER,

MAC VARCHAR(30)

);

ALTER TABLE TCPIP ADD CONSTRAINT PK_TCPIP PRIMARY KEY (CODTCPIP);

Lembre de gerar o Generator para o CODTCPIP. O nome padrão gerado pelo ibExpert seria “GEN_TCPIP_ID”

A sua classe modelo devera ficar parecida com a seguinte:

@Entity

@Table(name = "TCPIP", catalog = "", schema = "")

@SequenceGenerator(name = "INC_TCPIP", sequenceName = "GEN_TCPIP_ID")

public class Tcpip implements Serializable {

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy = GenerationType.AUTO, generator = "INC_TCPIP")

@Column(name = "CODTCPIP")

private Integer codtcpip;


Dois detalhes importantes das anotações feitas são @SequenceGenerator e @GeneratedValue, lembrando que o type do generator deve ser AUTO, pra utilizar o generator criado no Firebird.