如何在日志中打印行号。当输出一些信息到日志时,我也想打印该输出在源代码中的行号。正如我们在堆栈跟踪中所看到的,它显示了异常发生的行号。堆栈跟踪可以在异常对象上获得。
另一种选择是在打印到日志时手动包含行号。是否还有其他方法?
另一种选择是在打印到日志时手动包含行号。是否还有其他方法?
来自Angsuman Chakraborty的信息(已存档):
/** Get the current line number.
* @return int - Current line number.
*/
public static int getLineNumber() {
return Thread.currentThread().getStackTrace()[2].getLineNumber();
}
getStackTrace()
的代价是多少。它似乎过于复杂。我希望有编译器解决方案/宏,可以在编译时硬编码数字,就像c++一样。
不过,这仍然是可用答案中最好的一个。 - Jim我们最终使用了一个自定义类来完成我们的Android工作:
import android.util.Log;
public class DebugLog {
public final static boolean DEBUG = true;
public static void log(String message) {
if (DEBUG) {
String fullClassName = Thread.currentThread().getStackTrace()[2].getClassName();
String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
int lineNumber = Thread.currentThread().getStackTrace()[2].getLineNumber();
Log.d(className + "." + methodName + "():" + lineNumber, message);
}
}
}
getStackTrace()[3]
而不是 getStackTrace()[2]
。 - user5480949快速并简单的方法:
System.out.println("I'm in line #" +
new Exception().getStackTrace()[0].getLineNumber());
更详细一些:
StackTraceElement l = new Exception().getStackTrace()[0];
System.out.println(
l.getClassName()+"/"+l.getMethodName()+":"+l.getLineNumber());
那将输出类似于这样的内容:
com.example.mytest.MyClass/myMethod:103
with(Exception().stackTrace[0]) { println("$className/$methodName:$lineNumber") }
。 - AbstractVoid
logger.debug("一个非常描述性的消息")
而不是
System.out.println("一个非常描述性的消息")
Log4J允许你将行号作为输出模式的一部分。详见http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html了解如何实现(在转换模式中的关键元素是“L”)。然而,Javadoc 包含以下警告:
警告:生成调用位置信息会非常缓慢。除非执行速度不重要,否则应避免使用。
我建议使用日志记录工具,例如log4j。在运行时,可以通过属性文件配置日志记录,并且您可以打开/关闭功能,例如行号/文件名记录。
查看PatternLayout的javadoc将为您提供完整的选项列表 - 您需要的是%L。
@simon.buchan发布的代码将会起作用...
Thread.currentThread().getStackTrace()[2].getLineNumber()
但是如果你在一个方法中调用它,它总是会返回该方法中的行号,因此最好直接内联使用代码片段。
Log.d(TAG, "Where did i put this debug code again? " + Utils.lineOut());
双击输出即可跳转至源代码行!
根据您放置代码的位置,您可能需要调整级别值。
public static String lineOut() {
int level = 3;
StackTraceElement[] traces;
traces = Thread.currentThread().getStackTrace();
return (" at " + traces[level] + " " );
}
Util
是从哪里来的? - Benj在编写代码时,特别是在发布时进行编译,无法保证行号的一致性。我不建议使用行号来实现这个目的,最好的方法是提供异常抛出的位置信息(最简单的方法是将消息设置为包含方法调用详细信息的内容)。
您可能想要查看异常增强作为一种改进异常处理的技术 http://tutorials.jenkov.com/java-exception-handling/exception-enrichment.html
这是打印行号的代码。
Thread.currentThread().getStackTrace()[2].getLineNumber()
public static void Loge(Context context, String strMessage, int strLineNumber) {
Log.e(context.getClass().getSimpleName(), strLineNumber + " : " + strMessage);
}