見 org.apache.log4j.spi.LocationInfo.LocationInfo(Throwable t, String fqnOfCallingClass)
從函數調用棧從下往上開始查找 Category ,若當前調用類為 Category, 則上層就是 Main 方法的調用信息。
函數調用信息
(類名、函數名、行號)上面獲取的行號只是 event.getLocationInformation() 的行數,所以要想獲得自己想要的行號,必須對以上操作進行包裝。
注意觀察 FQCN 的使用
import org.apache.log4j.Level;import org.apache.log4j.spi.LoggingEvent;/** * wrapper org.apache.log4j.Logger * * @author Jinpeng Cui * */public class Logger { public static final boolean enable = true; private static final String FQCN = Logger.class.getName(); private static org.apache.log4j.Logger proxy; public Logger(final String clazzName) { proxy = org.apache.log4j.Logger.getLogger(clazzName); } public static Logger getLogger(final Class<?> clazz) { return new Logger(clazz.getName()); } public void error(String message) { if (isErrorEnable()) { forceLog(Level.ERROR, message); } } public void info(String message) { if (isInfoEnabled()) { forceLog(Level.INFO, message); } } public void debug(String message) { if (isDebugEnabled()) { forceLog(Level.DEBUG, message); } } private void forceLog(Level level, String message) { proxy.callAppenders(new LoggingEvent(FQCN, proxy, level, message, null)); } public boolean isErrorEnable() { return enable && proxy.isEnabledFor(Level.ERROR); } public boolean isInfoEnabled() { return enable && proxy.isEnabledFor(Level.INFO); } public boolean isDebugEnabled() { return enable && proxy.isEnabledFor(Level.DEBUG); }}新聞熱點
疑難解答