Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java公共记录器_Java_Logging - Fatal编程技术网

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注释。