Respostas:
em seu log4j.properties
(para loggers alternativos ou formato xml do log4j, verifique os documentos)
Dependendo do seu gerenciador de transações, você pode definir o nível de registro do framework spring para que ele forneça mais informações sobre as transações. Por exemplo, no caso de usar JpaTransactionManager
, você define
log4j.logger.org.springframework.orm.jpa=INFO
(este é o pacote do seu gerenciador de transações), e também
log4j.logger.org.springframework.transaction=INFO
Se INFO
não for o suficiente, useDEBUG
Para mim, uma boa configuração de registro para adicionar foi:
log4j.logger.org.springframework.transaction.interceptor = trace
Ele vai me mostrar o log assim:
2012-08-22 18: 50: 00,031 TRACE - Obtendo transação para [com.MyClass.myMethod]
[minhas próprias declarações de log do método com.MyClass.myMethod]
2012-08-22 18: 50: 00,142 TRACE - Concluindo transação para [com.MyClass.myMethod]
Para aplicação Spring Boot com application.properties
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
ou se você preferir Yaml ( application.yaml
)
logging:
level:
org.springframework.orm.jpa: DEBUG
org.springframework.transaction: DEBUG
Informações de registro mais interessantes de JtaTransactionManager.java
(se esta questão ainda for sobre JtaTransactionManager
) são registradas em DEBUG
prioridade. Supondo que você tenha um log4j.properties
lugar no caminho de classe, sugiro usar:
log4j.logger.org.springframework.transaction=DEBUG
Como você pode acessar classes Spring em tempo de execução, pode determinar o status da transação. Este artigo pode ajudá-lo:
isActualTransactionActive()
vez de recuperá-la em cada chamada de registro.
Aqui está algum código que eu uso na minha implementação de Layout de Logback, derivado de ch.qos.logback.core.LayoutBase .
Eu crio uma variável thread-local para armazenar a referência ao método org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
. Sempre que uma nova linha de log é impressa,getSpringTransactionInfo()
é chamada e retorna uma string de um caractere que irá para o log.
Referências:
Código:
private static ThreadLocal<Method> txCheckMethod;
private static String getSpringTransactionInfo() {
if (txCheckMethod == null) {
txCheckMethod = new ThreadLocal<Method>() {
@Override public Method initialValue() {
try {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Class<?> tsmClass = contextClassLoader.loadClass("org.springframework.transaction.support.TransactionSynchronizationManager");
return tsmClass.getMethod("isActualTransactionActive", (Class<?>[])null);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
};
}
assert txCheckMethod != null;
Method m = txCheckMethod.get();
String res;
if (m == null) {
res = " "; // there is no Spring here
}
else {
Boolean isActive = null;
try {
isActive = (Boolean) m.invoke((Object)null);
if (isActive) {
res = "T"; // transaction active
}
else {
res = "~"; // transaction inactive
}
}
catch (Exception exe) {
// suppress
res = "?";
}
}
return res;
}
INFO
nível não mostrará nenhuma atividade tx, seria muito prolixo.DEBUG
será necessário lá.