Arquivo de configuração para Log [RESOLVIDO]

Boa tarde,

Estou com o seguinte problema, estou usando JPA no meu projeto Swing e tudo funciona, cria a tabela no banco, salva os dados na tabela
porem aparece o seguinte erro no console >>

log4j:WARN No appenders could be found for logger (org.hibernate.type.BasicTypeRegistry).
log4j:WARN Please initialize the log4j system properly.

Pede pra inicializar corretamente o log4j, andei pesquisando e sei que é necessário (porem não obrigatório) um arquivo de configuração
para o Log, se alguem ja lidou com essa situação ou alguem tiver como dar uma idéia…

Agradeço

Tarde o/

se voce nao utilizar o BasicConfigurator.configure() vai ter que usar um arquivo de configuracao, segue um exemplo:

log4j.rootLogger=INFO, FILE log4j.appender.FILE=org.apache.log4j.RollingFileAppender log4j.appender.FILE.file=[path.do.arquivo] log4j.appender.FILE.MaxFileSize=100KB log4j.appender.FILE.MaxBackupIndex=10 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=%p [%t] (%F:%L) %c - %m%n

espero ter ajudado em algo :slight_smile:

[quote=guijocargo]Tarde o/

se voce nao utilizar o BasicConfigurator.configure() vai ter que usar um arquivo de configuracao, segue um exemplo:

log4j.rootLogger=INFO, FILE log4j.appender.FILE=org.apache.log4j.RollingFileAppender log4j.appender.FILE.file=[path.do.arquivo] log4j.appender.FILE.MaxFileSize=100KB log4j.appender.FILE.MaxBackupIndex=10 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=%p [%t] (%F:%L) %c - %m%n

espero ter ajudado em algo :)[/quote]

Onde eu deveria criar esse arquivo?

dentro do seu projeto mesmo :slight_smile:

Mas, um arquivo txt, xml…? ai eu apenas me baseio no seu exemplo acima?!
E usando o metodo BasicConfigurator.configure(), é só eu chamar ele antes de ‘criar’ as tabelas (no caso, antes do metodo…)?,
ai se for assim, eu fiz aqui e nao apareceu mais o aviso em vermelho, mas carrega uma triparada de configuração, cada vez que salva algum dado faz isso denovo…
se tiver complicado pra entender minha duvida, posso postar trechos do meu codigo…

Abraço

o BasicConfigurator voce pode por colocar no comeco da sua aplicacao, geralmente uma das primeiras coisas a serem feitas, da uma lida aqui: http://logging.apache.org/log4j/1.2/, la tem tudo o q vc precisar sobre o Log4J :slight_smile:

perdao, falta de informaca :S a extensao do arquivo é .properties :slight_smile:

[]s

[quote=guijocargo]o BasicConfigurator voce pode por colocar no comeco da sua aplicacao, geralmente uma das primeiras coisas a serem feitas, da uma lida aqui: http://logging.apache.org/log4j/1.2/, la tem tudo o q vc precisar sobre o Log4J :slight_smile:

perdao, falta de informaca :S a extensao do arquivo é .properties :slight_smile:

[]s[/quote]

Só mais uma coisa, to com um pé atras porque tipo, isso não vai ser ruim pro cliente/usuário… por ex: quando clico no botão (da minha tela Frame) pra salvar os dados na tabela
o botão fica parado até carregar todas as configurações, é isso toda a vez que salva…
Tem alguma forma de carregar essas configurações apenas 1 vez? ou eu que provavelmente to fazendo algo de errado? ou é alguma configuração no arquivo.properties que controla isso…?
Enfim, tava lendo a documentação do log4j mas acho que ainda não entendi direito

Vlw pela força

entao, a configuracao é feita apenas uma unica vez, tipo, a configuracao pode ser a primeira coisa a ser feita no seu main, toda vez que o sistema iniciar ele vai configurar o Log4J, mas somente desta vez :slight_smile:

magina, tamo ai :smiley:

[quote=guijocargo]entao, a configuracao é feita apenas uma unica vez, tipo, a configuracao pode ser a primeira coisa a ser feita no seu main, toda vez que o sistema iniciar ele vai configurar o Log4J, mas somente desta vez :slight_smile:

magina, tamo ai :D[/quote]

Sim, mas no caso eu chamo o método BasicConfigurator.configure e toda a vez que salva carrega uma tripa de configurações e fica lento demais pra salvar… é assim mesmo se usa esse metodo?, tipo se eu configurar o arquivo.properties corretamente não aconteceria isso? no caso seria o mais correto?

perdão a demora, ele vai carregar o .properties toda vez que sua aplicação iniciar, não vai atrapalhar de nada a execução, carregar é coisa de uns milissegundos :slight_smile:

Ok obrigado msm, mas se não for abusar… tem como vc me dar uma ajuda pra montar meu arquivo.properties? é que agora que to começando a entender esse log4j e preciso muito usar JPA na minha aplicação, tentei me basiar no seu exemplo que vc postou acima mas deve estar faltando alguma coisa, e tambem no console ele informa um erro no arquivo porem o estranho é que diz que não localiza o arquivo

aah, tipo explicando cada item que vc colocou no seu arquivo de exemplo também ajuda muito

agradeço, abrss

achei melhor postar o meu codigo tambem, caso seja mais facil (só pra constar, esse não é meu projeto principal, ele é só pra testar o funcionamento do JPA mesmo :slight_smile: )

Model

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name="Produto")
@SequenceGenerator(name="S_id", sequenceName="S_id")
public class Produto{
	
	@Id
	@GeneratedValue(generator="S_id", strategy= GenerationType.AUTO)
	private int id;
	
	@Column(name="nome")
	private String nome;
	
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}

	
	
}

Dao’s

//Cria as tabelas no banco
public class EntityManagerUtil {
	private static EntityManagerFactory emf;
	
	public static EntityManager getEntityManager(){
		if(emf == null){
			emf = Persistence.createEntityManagerFactory("testejpa");
		}
		return emf.createEntityManager();
	}

}

GenericDao

import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;

public class GenericDao<T> {
	
	private final static String UNIT_NAME = "testejpa";
	
	@PersistenceContext(unitName = UNIT_NAME)
	private EntityManager em;
	private Class<T> entityClass;
	
	@SuppressWarnings("unchecked")
	public GenericDao() {
		this.em = EntityManagerUtil.getEntityManager(); 
		this.entityClass = (Class<T>) ((ParameterizedType) 
				getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}
	
	public EntityManager getEntityManager(){
		return em;
	}
	
        //Metodo para salvar..
	public void save(T entity){
		EntityTransaction tx = getEntityManager().getTransaction();
		
		try {
			tx.begin();
			getEntityManager().persist(entity);
			tx.commit();
		} catch (Throwable t) {
			t.printStackTrace();
			tx.rollback();
		}
	}

//[...]

ProdutoDao

import jpaTesteSwing.Model.Produto;

public class ProdutoDao extends GenericDao<Produto>{


	public void salvar(Produto produto) {
		save(produto);
	}

}

Controller

import jpaTesteSwing.Dao.ProdutoDao;
import jpaTesteSwing.Model.Produto;

public class ProdutoController {
	
	public void salvar(String nome){
		Produto produto = new Produto();
		produto.setNome(nome);
		
		new ProdutoDao().salvar(produto);
	}
	
}

Tela

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import org.apache.log4j.BasicConfigurator;



import jpaTesteSwing.Controller.ProdutoController;

public class FrameCadastro extends JFrame {
	private static final long serialVersionUID = 1L;

	private JTextField txtSalvar;
	private JButton btnSalvar;
	
	
	public FrameCadastro() {
		super("Teste JPA");
		Container tela = getContentPane();
		setLayout(null);
		
		txtSalvar = new JTextField();
		txtSalvar.setBounds(10, 10, 80, 20);
		
		tela.add(txtSalvar);
		
		btnSalvar = new JButton("Salvar");
		btnSalvar.setBounds(80, 100, 100, 20);
		
		tela.add(btnSalvar);
		
		setSize(200, 250);
		setLocationRelativeTo(null);
		
		btnSalvar.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent a) {
				onClickSalvar();
			}
		});
		
	}
	
	public void onClickSalvar(){
		ProdutoController pc = new ProdutoController();
		
		try {
			pc.salvar(txtSalvar.getText());
			JOptionPane.showMessageDialog(this, "Salvo com sucesso!!!");
			dispose();
		} catch (Exception e) {
			System.out.println("Não foi possivel salvar. " + e.getLocalizedMessage());
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		 
                 BasicConfigurator.configure(); //<<<<<<<<<<<<
		
                 FrameCadastro fc = new FrameCadastro();
		 fc.setVisible(true);
		 fc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
}

Ai quando clico no Button Salvar, carrega aquelas quase 300 linhas de configurações e o botão fica travado alguns segundos(esse é o grave problema, essa travada de botão, acho q o cliente não gostaria disso néh)

Por isso queria que me ajudasse com o arquivo… conforme pedi no post acima

Agradeço desde já pela paciencia ; )

Resolvi jogar o seu erro do primeiro post no google (devia ter feito isso antes --), veja se resolve seu problema:

http://www.guj.com.br/java/223753-apostila-caelum-erro-configuracao-hibernate

Para fazer a configuracao do log4j voce vai precisar usar o PropertyConfigurator.configure(), passando um objeto Properties, uma InputStream ou uma string contendo o caminho do seu arquivo, nele voce vai ter uma primeira linha:

log4j.rootLogger=[NIVEL.LOGGER], [appender.1], ... , [appender.n]

no [NIVEL.LOGGER] é o nivel minimo da mensagem a ser logada, crescentemente sao TRACE, DEBUG, INFO, WARN, ERROR, FATAL; depois voce define um ou mais appenders (que serao responsaveis pela saida dos logs), dando apenas nomes, como por exemplo console, arquivo, saida, etc…

log4j.appender.[appender]=[caminho.classe.appender]

depois de ter defido os appenders vc tem que inicia-los, para dar um saida no console voce usaria org.apache.log4j.ConsoleAppender no lugar de [caminho.classe.appender], tem outros tipos de appenders, o que utilizei no meu exemplo ali em cima é um appender para arquivo, depois disso voce vai setando algumas informacoes (atributos) do appender, não tem muito segredo, basicamente é apenas ler o javadoc :slight_smile:

voce pode atribuir um logger para um pacote, ao inves de:

log4j.rootLogger=[NIVEL.LOGGER], [appender.1], ... , [appender.n]

voce utilizara:

log4j.logger.[caminho.pacote]=[NIVEL.LOGGER], [appender.1], ... , [appender.n]

o resto nao muda em nada :slight_smile:

[quote=guijocargo]Resolvi jogar o seu erro do primeiro post no google (devia ter feito isso antes --), veja se resolve seu problema:

http://www.guj.com.br/java/223753-apostila-caelum-erro-configuracao-hibernate

Para fazer a configuracao do log4j voce vai precisar usar o PropertyConfigurator.configure(), passando um objeto Properties, uma InputStream ou uma string contendo o caminho do seu arquivo, nele voce vai ter uma primeira linha:

log4j.rootLogger=[NIVEL.LOGGER], [appender.1], ... , [appender.n]

no [NIVEL.LOGGER] é o nivel minimo da mensagem a ser logada, crescentemente sao TRACE, DEBUG, INFO, WARN, ERROR, FATAL; depois voce define um ou mais appenders (que serao responsaveis pela saida dos logs), dando apenas nomes, como por exemplo console, arquivo, saida, etc…

log4j.appender.[appender]=[caminho.classe.appender]

depois de ter defido os appenders vc tem que inicia-los, para dar um saida no console voce usaria org.apache.log4j.ConsoleAppender no lugar de [caminho.classe.appender], tem outros tipos de appenders, o que utilizei no meu exemplo ali em cima é um appender para arquivo, depois disso voce vai setando algumas informacoes (atributos) do appender, não tem muito segredo, basicamente é apenas ler o javadoc :slight_smile:

voce pode atribuir um logger para um pacote, ao inves de:

log4j.rootLogger=[NIVEL.LOGGER], [appender.1], ... , [appender.n]

voce utilizara:

log4j.logger.[caminho.pacote]=[NIVEL.LOGGER], [appender.1], ... , [appender.n]

o resto nao muda em nada :)[/quote]

da uma olhada

log4j.rootLogger=[NIVEL.INFO],[appender.console] --&gt; ??  
log4j.appender.[appender]=[org.apache.log4j.ConsoleAppender]  
log4j.appender.FILE.file=[path.do.arquivo]
log4j.appender.FILE.MaxFileSize=100KB  
log4j.appender.FILE.MaxBackupIndex=10  
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout  
log4j.appender.FILE.layout.ConversionPattern=%p [%t] (%F:%L) %c - %m%n

onde chamo o metodo PropertyConfigurator

public static void main(String[] args) {
		 PropertyConfigurator.configure(&quot;log4j.properties&quot;);
		 FrameCadastro fc = new FrameCadastro();
		 fc.setVisible(true);
		 fc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

Não importa o caminho que coloco ele não acha o arquivo

esse é o erro /

log4j:ERROR Could not find value for key log4j.appender.[appender.console]
log4j:ERROR Could not instantiate appender named &quot;[appender.console]&quot;.
log4j:ERROR Could not read configuration file [log4j.properties].
java.io.FileNotFoundException: log4j.properties (O sistema não pode encontrar o arquivo especificado)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.&lt;init&gt;(Unknown Source)
	at java.io.FileInputStream.&lt;init&gt;(Unknown Source)
	at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:306)
	at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:324)
	at jpaTesteSwing.View.FrameCadastro.main(FrameCadastro.java:66)
log4j:ERROR Ignoring configuration file [log4j.properties].

perdao, tenho o habito de colocar as coisas pra substituir entre chaves, retire elas :oops:

Ok, porem continua o mesmo erro, eu tava pesquisando outras pessoas com o mesmo problema mas nada q eu faça ta resolvendo, parece que não ta localizando o arquivo

log4j:ERROR Could not find value for key log4j.appender.appender.console
log4j:ERROR Could not instantiate appender named "appender.console".
log4j:ERROR Could not read configuration file [log4j.properties].
java.io.FileNotFoundException: log4j.properties (O sistema não pode encontrar o arquivo especificado)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.&lt;init&gt;(Unknown Source)
	at java.io.FileInputStream.&lt;init&gt;(Unknown Source)
	at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:306)
	at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:324)
	at jpaTesteSwing.View.FrameCadastro.main(FrameCadastro.java:66)
log4j:ERROR Ignoring configuration file [log4j.properties].

nao use ponto, tente consoleAppender por exemplo, um exemplo:

log4j.rootLogger=INFO, appenderConsole log4j.appender.appenderConsole=org.apache.log4j.ConsoleAppender

veja no javadoc do log4j os atributos da classe ConsoleAppender, é quase a mesma coisa que escrever codigo java ‘-’

no caso da Exception, tem certeza que o caminho é este? faz um teste com um arquivo fora do seu projeto no seu pc msm, como C:/log4j.properties

[quote=guijocargo]nao use ponto, tente consoleAppender por exemplo, um exemplo:

log4j.rootLogger=INFO, appenderConsole log4j.appender.appenderConsole=org.apache.log4j.ConsoleAppender

veja no javadoc do log4j os atributos da classe ConsoleAppender, é quase a mesma coisa que escrever codigo java ‘-’

no caso da Exception, tem certeza que o caminho é este? faz um teste com um arquivo fora do seu projeto no seu pc msm, como C:/log4j.properties[/quote]

Ae mano, funcionou certinho aqui, tava faltando só eu adicionar um layout /

log4j.appender.appenderConsole.layout=org.apache.log4j.PatternLayout

deeemorei, apanhei pra pega a coisa, mas entendi agora como funciona
Obrigadão ai mesmo :wink:

ai sim hein :smiley:

parabens ^^

magina, qlqr coisa tamo ai, nos esbarramos pelo GUJ :lol:

[]s