我想在LogCat中插入一个日志,当我点击它时会跳转到它的行,就像系统生成的一些错误日志一样。
有可能吗?
答案 0 :(得分:14)
我找到了它:
public static void showLogCat(String tag, String msg) {
StackTraceElement[] stackTraceElement = Thread.currentThread()
.getStackTrace();
int currentIndex = -1;
for (int i = 0; i < stackTraceElement.length; i++) {
if (stackTraceElement[i].getMethodName().compareTo("showLogCat") == 0)
{
currentIndex = i + 1;
break;
}
}
String fullClassName = stackTraceElement[currentIndex].getClassName();
String className = fullClassName.substring(fullClassName
.lastIndexOf(".") + 1);
String methodName = stackTraceElement[currentIndex].getMethodName();
String lineNumber = String
.valueOf(stackTraceElement[currentIndex].getLineNumber());
Log.i(tag, msg);
Log.i(tag + " position", "at " + fullClassName + "." + methodName + "("
+ className + ".java:" + lineNumber + ")");
}
用法:
showLogCat("tag", "message");
答案 1 :(得分:4)
重要的是在您的日志消息中插入"(X:Y)"
,而X
是您想要的文件名,Y
是您想要的< X
中的em>行号。 (我是从@breceivemail's answer了解到的)。所以试试:
public static void log(final String tag, final String msg) {
final StackTraceElement stackTrace = new Exception().getStackTrace()[1];
String fileName = stackTrace.getFileName();
if (fileName == null) fileName=""; // It is necessary if you want to use proguard obfuscation.
final String info = stackTrace.getMethodName() + " (" + fileName + ":"
+ stackTrace.getLineNumber() + ")";
Log.LEVEL(tag, info + ": " + msg);
}
注意:LEVEL
是日志级别,可以是v
,d
,i
,w
,{ {1}}或e
。
现在,您可以使用wtf
代替log(tag, msg)
。
示例:
<强> MainActivity.java 强>:
Log.LEVEL(tag, msg)
输出:
...
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
log("Test Tag", "Hello World!");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
...
12-30 14:24:45.343 ? I/Test Tag: onCreate (MainActivity.java:10): Hello World!
自动成为link,您可以点击它!
如果您想要更详细的日志,还可以将以下值分配给MainActivity.java:10
变量:
info
所以上面例子的输出是:
final String info = stackTrace.getClassName() + "." + stackTrace.getMethodName() + " ("
+ fileName + ":" + stackTrace.getLineNumber() + ")\n";
答案 2 :(得分:0)
是的,你可以这样做。按照SO - logging
上的回答示例答案 3 :(得分:0)
respectercetterègle:
{FileName}.{ext}:{LigneNumber}
e.g. MainActivity.java:10
给出如下样本
Log.d(TAG, "onResume: MainActivity.java:10");
我希望这会对你有所帮助
答案 4 :(得分:0)
这并不是对问题的完全回答,但也许是“足够接近”的解决方法。
如果在按CTRL-SHIFT-F之前突出显示文本,则无需键入或复制/粘贴文本。
如果您的搜索倾向于产生太多结果,则可以使用实时模板来创建唯一的logcat条目:
创建一个实时模板以插入类,方法和行号(在编写本文时)。我使用“ logi”。是的,随着您继续写,行号将变得越来越不准确,但是它仍然可以用作使日志条目更“易于查找”的一种方式。
答案 5 :(得分:0)
请将此树与木材一起使用。
class MyLinkingTimberTree : Timber.DebugTree() {
override fun createStackElementTag(element: StackTraceElement): String? {
return makeClickableLineNumber(element)
}
private fun makeClickableLineNumber(
element: StackTraceElement
): String {
val className = element.fileName
val methodName = element.methodName
val lineNumber = element.lineNumber
val fileName = element.fileName
val stringBuilder = StringBuilder(className)
.append(".")
.append(methodName)
.append(" (")
.append(fileName)
.append(":")
.append(lineNumber)
.append(") ")
return stringBuilder.toString()
}
}
然后像这样实例化它:
class MyApplication: Application() {
override fun onCreate() {
super.onCreate()
if(BuildConfig.DEBUG) {
Timber.plant(MyLinkingTimberTree())
}
}
}
然后只需正常使用Timber:
Timber.d("Currently Signed in:")
这就是结果。很好,不是吗?希望您喜欢它,也喜欢它! ;)
答案 6 :(得分:-1)