Java公共记录器
允许为日志创建一个静态类吗Java公共记录器,java,logging,Java,Logging,允许为日志创建一个静态类吗 public final class Log { public static final Logger LOGGER = Logger.getLogger(Log.class.getName()); } 需要时随时打电话 Log.LOGGER.info("Let's log something!"); 而不是在每个类上添加这一行代码 private static final Logger LOGGER = Logger.getLogger(Log.cl
public final class Log {
public static final Logger LOGGER = Logger.getLogger(Log.class.getName());
}
需要时随时打电话
Log.LOGGER.info("Let's log something!");
而不是在每个类上添加这一行代码
private static final Logger LOGGER = Logger.getLogger(Log.class.getName());
我阅读了一些信息,您应该在每个类中初始化记录器
public static final Logger LOGGER = Logger.getLogger(ClassName.class.getName());
或者怎么走?我更喜欢一些静态方法,而不是在每个类中初始化记录器
我试过了,结果如下
预览:
日志
public class Log {
public static final Logger LOGGER = Logger.getLogger(Log.class.getName());
}
应用程序
final class App() {
public static void main(String[] args) {
start();
}
private static void start() {
Log.LOGGER.info("Starting the application.");
}
}
内核
public final class Kernel() {
public static void preload() {
Log.LOGGER.info("Preload kernel modules.");
}
}
输出:
如果您想采用类似的方法,我建议您使用静态方法进行日志记录,如以下示例所示:
public final class Log {
private static final Logger LOGGER = Logger.getLogger(Log.class.getName());
public void logError(String someText) {
LOGGER.error(someText);
}
public static LogInfo(String someText) {
LOGGER.info(someText);
}
}
然后在客户端类中调用它,只需使用:
private static void start() {
LogInfo("Starting the application.");
}
当然,在需要静态导入之前:
import static com.yourpackage.Log.*
这是一种可以遵循的方法,但我更愿意将记录器插入到需要记录某些内容的应用程序组件中,使这些内容更加解耦……您可能可以执行以下操作:
public static final class Logger {
public static Logger get() {
return Logger.getLogger(Thread.currentThread().getStackTrace()[1].getClassName());
}
}
Logger.get().log("Hello World!");
可以这样使用:
public static final class Logger {
public static Logger get() {
return Logger.getLogger(Thread.currentThread().getStackTrace()[1].getClassName());
}
}
Logger.get().log("Hello World!");
这将允许您保留诸如日志记录类的名称之类的信息,并且不要求您实际将调用类名称作为参数传递。不过,我不确定每次调用时获取stacktrace的性能,因此这可能不是很有效。这是允许的,但人们不这样做是有原因的
对于每个类都有一个单独的日志记录程序的常用方法,您可以根据希望在什么级别查看哪些包和类来过滤日志记录。这样,您就不必太担心是否向记录器插入调用,即使您不需要一直使用它,您也可以保留它,因为您可以过滤掉它。当出现问题时,您可以增加您感兴趣的类的日志级别。但是使用单日志类的方法,您根本无法做到这一点 您可以更进一步,在
Log
中实现info()
,error()
等,这样您就可以执行Log.info(…)
。搜索@slf4j注释当我这样做时,输出将始终来自Log类:2015年8月26日下午2:31:59 nl.nberlijn.powercontrol.kernel.Log信息:启动应用程序。2015年8月26日下午2:31:59 nl.nberlijn.powercontrol.kernel.Log info:预加载内核模块。
当然,如果您需要。。。无论如何,正如我在回答中所说的,最好将记录器封装到客户机类中,特别是如果您需要记录调用方的日志…将记录器封装到客户机类中,初始化所有类中的记录器变量是什么意思?也许你可以举个例子,你可以把它声明为客户端类的属性,然后用依赖注入容器注入它,我正试图这么做。目前,我为我想要注入记录器的类做了@Log注释。