国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

關于log4j

2019-11-11 01:40:26
字體:
來源:轉載
供稿:網友

Log4j 是如何獲取 類名、函數名、行數的

見 org.apache.log4j.spi.LocationInfo.LocationInfo(Throwable t, String fqnOfCallingClass)

源碼分析

Object[] noArgs = null; // 獲取函數調用棧 Object[] elements = (Object[]) getStackTraceMethod.invoke(t, noArgs); String PRevClass = NA; for(int i = elements.length - 1; i >= 0; i--) { String thisClass = (String) getClassNameMethod.invoke(elements[i], noArgs); // 判斷當前調用的類是否為 Category if(fqnOfCallingClass.equals(thisClass)) { int caller = i + 1; if (caller < elements.length) { className = prevClass; methodName = (String) getMethodNameMethod.invoke(elements[caller], noArgs); fileName = (String) getFileNameMethod.invoke(elements[caller], noArgs); if (fileName == null) { fileName = NA; } int line = ((Integer) getLineNumberMethod.invoke(elements[caller], noArgs)).intValue(); if (line < 0) { lineNumber = NA; } else { lineNumber = String.valueOf(line); } StringBuffer buf = new StringBuffer(); buf.append(className); buf.append("."); buf.append(methodName); buf.append("("); buf.append(fileName); buf.append(":"); buf.append(lineNumber); buf.append(")"); this.fullInfo = buf.toString(); } return; } prevClass = thisClass; }

函數調用棧

org.apache.log4j.spi.LoggingEvent.getLocationInformation(LoggingEvent.java:253)↓org.apache.log4j.helpers.PatternParser$LocationPatternConverter.convert(PatternParser.java:500)↓org.apache.log4j.helpers.PatternConverter.format(PatternConverter.java:65)↓org.apache.log4j.PatternLayout.format(PatternLayout.java:506)↓org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:310)↓org.apache.log4j.WriterAppender.append(WriterAppender.java:162)↓org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)↓org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)↓org.apache.log4j.Category.callAppenders(Category.java:206)↓xxx.xxx.Main(args:line)

從函數調用棧從下往上開始查找 Category ,若當前調用類為 Category, 則上層就是 Main 方法的調用信息。

如何手動獲取 函數調用信息(類名、函數名、行號)

// 指定 fqnOfCategoryClass 為 LoggingEvent.class.getName()LoggingEvent event = new LoggingEvent(LoggingEvent.class.getName(), logger, Level.DEBUG, "i am message", null);// 然后手動獲取 LocationInfo,這時函數調用棧的倒數第二層就是// org.apache.log4j.spi.LoggingEvent.getLocationInformation(:line)// 此時的 line 就是下面這行代碼的 行號LocationInfo info = event.getLocationInformation();

上面獲取的行號只是 event.getLocationInformation() 的行數,所以要想獲得自己想要的行號,必須對以上操作進行包裝。

獻上一個包裝的 Logger

maven

<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency>

wrapper Logger

注意觀察 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); }}
上一篇:HDU杭電acm2086-A1=?

下一篇:大數階乘

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 佛教| 樟树市| 南岸区| 中山市| 井陉县| 华池县| 德庆县| 吕梁市| 贡觉县| 宝清县| 安阳县| 玉屏| 西林县| 南京市| 滁州市| 平定县| 响水县| 白玉县| 阳信县| 紫阳县| 民丰县| 佛坪县| 安福县| 收藏| 明溪县| 岫岩| 南雄市| 石柱| 镇安县| 襄垣县| 乌拉特后旗| 怀安县| 海丰县| 射洪县| 沐川县| 连山| 营山县| 偏关县| 方城县| 陕西省| 汾西县|