Ste*_*epp 19 java logging portability
我正在寻找一种__LINE__在输出消息中包含编译时常量的方法.
似乎存在各种解决方案,但是__LINE__在JS和__LINE__C#中建议的运行时损失很大.它们通常始终基于运行时对象StackFrame作为log4j.
使用log4j在所需的基础上启用/禁用的可能性也不是一种选择,因为通常在发生错误时,启用行号为时已晚,并且内联代码似乎不再具有任何行号..是否有可能:
1.实际上我确实使用了一个丑陋的黑客:在构建服务器上通过ANT技巧结账后调用自定义预处理器
ZZ *_*der 13
__LINE__在编译时发生C 的效果是不可能的.
您可以通过在运行时调用这样的函数来获取行号,
public static int lineNumber() {
return Thread.currentThread().getStackTrace()[2].getLineNumber();
}
Run Code Online (Sandbox Code Playgroud)
如果使用该debug=line选项进行编译,则行信息中存在行信息,但VM可以在运行时将其丢弃.这取决于您在启动Java程序时可以指定的一些选项.通常,使用调试信息运行的性能损失约为5%,加上perm gen空间中的更多内存.由于这些信息非常宝贵,我认为没有理由删除这些信息.
您的评论(Util.java(Inlined Compiled Code))表明您正在使用积极的优化.如果可以,请关闭它们.这样,您可以简单地:
// For Java 1.4, use new Exception().getStackTrace()
int line = Thread.currentThread().getStackTrace()[0].getLineNumber();
Run Code Online (Sandbox Code Playgroud)
当你需要它时(即在里面catch或if (log.isInfoEnabled())).
至于__LINE__,Java编译器不支持这一点.您唯一的选择是使用一些黑客来过滤源.我建议在int __LINE__某处定义一个变量,并在需要时将其设置为某个随机值(0足够随机).然后编写一个过滤器,用__LINE__ = \d+当前行号替换数字.这允许将行号固定到位.
我发现如果你正在寻找"到这里,到达这里"类型记录,这个课程会让事情变得简单.我有一个文件Here.java,我添加到我的项目,只包含以下类定义:
public class Here {
public static String at () {
StackTraceElement ste = Thread.currentThread().getStackTrace()[3];
String where = ste.getClassName() + " " + ste.getMethodName() + " " + ste.getLineNumber() + " ";
return where;
}
}
Run Code Online (Sandbox Code Playgroud)
以最简单的形式使用它:
Log.v(TAG, Here.At());
Run Code Online (Sandbox Code Playgroud)
或者,如果你想看到其他东西:
Log.v(TAG, Here.At() + String.format("interesting value = %d", my_val));
Run Code Online (Sandbox Code Playgroud)
这将在第一种情况下给出"com.otherpackagenamestuff.MyClass myMethod 225",并且相同但在第二种情况下附加"有趣值= 123".
| 归档时间: |
|
| 查看次数: |
10792 次 |
| 最近记录: |