在Log日誌檔裡的每行加上Transaction 的狀態
[+] or [-] ,
主要是透過Reflect 的機制去取TransactionSynchronizationManager class
再取得isActualTransactionActive 屬性,來決定Transaction的狀態,
這邊log4j要使用xml格式,不能使用properties檔
TransactionIndicatingFilter.java
import static com.gfactor.emaildiscovery.utils.TransactionIndicatingUtil.getTransactionStatus; import org.apache.log4j.spi.Filter; import org.apache.log4j.spi.LoggingEvent; public class TransactionIndicatingFilter extends Filter { @Override public int decide(LoggingEvent loggingEvent) { loggingEvent.setProperty("xaName", getTransactionStatus(true) ); loggingEvent.setProperty("xaStatus", getTransactionStatus(false) ); return Filter.NEUTRAL; } }
TransactionIndicatingUtil.java
package com.gfactor.emaildiscovery.utils; public class TransactionIndicatingUtil { private final static String TSM_CLASSNAME = "org.springframework.transaction.support.TransactionSynchronizationManager"; public static String getTransactionStatus(boolean verbose) { String status = null; try { ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); if (contextClassLoader != null) { Class tsmClass = contextClassLoader.loadClass(TSM_CLASSNAME); Boolean isActive = (Boolean) tsmClass.getMethod("isActualTransactionActive", null).invoke(null, null); if (!verbose) { status = (isActive) ? "[ ] " : "[-] "; } else { String transactionName = (String) tsmClass.getMethod("getCurrentTransactionName", null).invoke(null,null); status = (isActive) ? "[" transactionName "] " : "[no transaction] "; } } else { status = (verbose) ? "[ccl unavailable] " : "[x ]"; } } catch (Exception e) { status = (verbose) ? "[spring unavailable] " : "[x ]"; } return status; } }
log4j.xml 在appender裡面加上filter class, param name加上[%X{xaStatus}]
<appender name="stdout" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{HH:mm:ss} [%-5p] %F:%L - %m%n Ts-[%X{xaStatus}] ," /> </layout> <filter class="com.gfactor.emaildiscovery.utils.TransactionIndicatingFilter" /> </appender>
沒有留言:
張貼留言