如何在不丢失调用方方法名称的情况下为 Logger 包装日志记录方法?
How to wrap logging methods for Logger without lossing the name of the caller method?
我正在尝试向 java.util.Logger
添加一些方便的方法。我希望这些方法可以简化我的下一个 Java 应用程序的编码:
public void severeException(Exception e, String msg) {
super.severe(msg);
super.severe(e.getClass().getCanonicalName());
super.severe(e.getMessage());
}
public void severeLoadingFile(Exception e, String filePath) {
super.severe("Could not load file '" + filePath + "'");
super.severe(e.getClass().getCanonicalName());
super.severe(e.getMessage());
}
public void severeLoadingFile(String filePath) {
super.severe("Could not load file '" + filePath + "'");
}
它们代表了 1:2 与 1:3 的代码行数之比,每当我想报告异常时,我必须编写的代码行数。对于众所周知的异常,有一大堆类似的方法,比如 IOException
加载文件等
到目前为止,我已经尝试将 Logger
扩展为 CustomLogger
,这导致我在调用 getLogger()
方法时遇到 class 加载程序和模块的问题。然后我尝试通过其构造函数初始化 CustomLogger
...
除了构造函数和 class 加载程序的问题之外,这似乎不是办法,因为调用方方法被我的包装方法困住了。
我已经扫描了 Logger
源代码,但没有找到调用 log()
的简单方法,将调用者的姓名或类似的东西传递给它。
有什么想法吗?
并非不可能,但可能会影响性能。
在您的日志记录方法中,您可以通过堆栈跟踪元素 (https://docs.oracle.com/javase/8/docs/api/java/lang/StackTraceElement.html).
找到调用者的姓名
System.out.println(Thread.currentThread().getStackTrace()[1]);
我支持 Anders 正确使用日志框架的想法。
我正在尝试向 java.util.Logger
添加一些方便的方法。我希望这些方法可以简化我的下一个 Java 应用程序的编码:
public void severeException(Exception e, String msg) {
super.severe(msg);
super.severe(e.getClass().getCanonicalName());
super.severe(e.getMessage());
}
public void severeLoadingFile(Exception e, String filePath) {
super.severe("Could not load file '" + filePath + "'");
super.severe(e.getClass().getCanonicalName());
super.severe(e.getMessage());
}
public void severeLoadingFile(String filePath) {
super.severe("Could not load file '" + filePath + "'");
}
它们代表了 1:2 与 1:3 的代码行数之比,每当我想报告异常时,我必须编写的代码行数。对于众所周知的异常,有一大堆类似的方法,比如 IOException
加载文件等
到目前为止,我已经尝试将 Logger
扩展为 CustomLogger
,这导致我在调用 getLogger()
方法时遇到 class 加载程序和模块的问题。然后我尝试通过其构造函数初始化 CustomLogger
...
除了构造函数和 class 加载程序的问题之外,这似乎不是办法,因为调用方方法被我的包装方法困住了。
我已经扫描了 Logger
源代码,但没有找到调用 log()
的简单方法,将调用者的姓名或类似的东西传递给它。
有什么想法吗?
并非不可能,但可能会影响性能。 在您的日志记录方法中,您可以通过堆栈跟踪元素 (https://docs.oracle.com/javase/8/docs/api/java/lang/StackTraceElement.html).
找到调用者的姓名System.out.println(Thread.currentThread().getStackTrace()[1]);
我支持 Anders 正确使用日志框架的想法。