- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在阅读 Java 9 中引入的 System.Logger API。我无法理解为什么他们开发了如此奇怪
API:
System.Logger {
public default void log(Level level, String msg){...}
}
我称它为strange
,因为所有流行的日志记录框架(我知道)都没有将级别作为参数,而是通过级别名称命名调用方法。例如:
//Log4j
logger.error("This is error : " + parameter);
//SLF4J
logger.debug("Printing variable value: {}", variable);
//apache.commons.logging
log.debug(Object message);
//and even sun.util.logging.PlatformLogger
logger.warning(String msg)
怎么解释呢?
最佳答案
除非您是开发者,否则有关开发者意图的问题本来就很难回答。
也就是说,我们确实可以访问此功能的原始提案 - JEP 264 .
总结:
Define a minimal logging API which platform classes can use to log messages, together with a service interface for consumers of those messages. A library or application can provide an implementation of this service in order to route platform log messages to the logging framework of its choice. If no implementation is provided then a default implementation based upon the java.util.logging API is used.
来自目标:
Be easily adoptable by applications which use external logging framework, such as SLF4J or Log4J.
来自非目标:
It is not a goal to define a general-purpose interface for logging. The service interface contains only the minimal set of methods that the JDK needs for its own usage.
因此,我们这里所拥有的并不是像 SLF4J、Log4J 等那样的“又一个日志框架”。我们所拥有的是一个接口(interface),它允许您告诉 JVM 使用与您在你的应用程序,用于记录它自己的东西。
典型的使用场景是在 SLF4J 中进行复杂设置的应用程序,记录到控制台、文件、数据库或向手机发送文本。您希望 JVM 类使用相同的系统。因此,您使用 SLF4J 设置编写了一个适配器 - 一个实现 System.Logger
接口(interface)的类。
这并不是说您不能使用当前的系统记录器进行记录——您可以——但这不是创建它的目的。它是为您创建的,用于实现和设置系统记录器,以便它调用您选择的日志记录框架。
在目前的形式下,当你实现时,你只需要实现四个方法:
getName()
isLoggable(System.Logger.Level)
日志(System.Logger.Level、ResourceBundle、String、Object...)
日志 (System.Logger.Level、ResourceBundle、String、Throwable)
现在,System.Logger.Level
有七个级别。想象一下,如果您不必实现两种日志记录方法,而是必须实现 14 种日志记录方法,会怎样?通常情况下,这些实现看起来完全一样,只是名称稍有变化。这是不明智的。
就目前而言,几乎每个现有的日志记录框架都有一个log(level,...)
方法,然后是System.Logger
的的实现>log(...)
通常可以简单地通过从 System.Logger.Level
映射到框架的 Level 定义来完成。
如果您想记录一条消息?
好吧,如果您使用的是复杂的日志记录平台,您可以直接在那里记录消息,不需要通过系统记录器。如果您坚持使用它 - 您将需要使用级别作为参数或编写自己的包装器。这根本不是开发人员想到的用例。
关于java - 为什么在 System.Logger 中使用 log(DEBUG, msg) 而不是 debug(msg)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53300918/
注意:这与Determine number of bits in integral type at compile time非常相似,但是这是一个非常简化的版本,所有内容都包含在一个 .cpp 中 编
var err1 = Error('message'); var err2 = new Error('message'); 有什么区别?在 chrome 控制台中查看它们,它们看起来相同。对象上的相同
我有一些 jquery/php 代码,它使用 ajax 调用另一个页面。 var pall_id = $(this).attr('id'); $.ajax({ t
我当时正在开发一个在 Linux 上运行了 20 多年的遗留代码。它有3个模块,由3个不同的人处理。我只能更改一个模块。 现在我的任务是在 Windows 中构建具有最少功能的相同代码。 对于进程间通
public JsonResult Authe(string Email, string Password, bool ? Active) { var x = (from n in db.Au
var err1 = Error('message'); var err2 = new Error('message'); 有什么区别?在 Chrome 控制台中查看它们,它们看起来相同。对象上的相同
!!msg.message && msg.message 和 msg?.message 之间的区别? 第一个是当 msg 未定义时 msg.message 将不会被执行。 第二个是什么意思? 最佳答案
我正在做一个项目,我的队友和我正在讨论哪种方法更好。 在我看来Html msg似乎更通用,所以我认为我们应该尽可能使用它,但我不能给他其他理由。 另外,我来自 React 和 Redux,对我来说看起
您好,问题如下: 假设我们有链接的进程 A 和 B。进程的 A 标志 trap_exit 设置为 true。让 B 进程向 A 发送一个 msg 然后退出: PidA ! 'msg', exit(re
有没有人知道任何 JavaScript 库可以打开现有的 *.msg Outlook 文件,例如创建为模板,并可以使用代码将数据放入主题、任何其他 {} 数据并将其作为新数据保存到磁盘。消息文件? 详
我是 google protobuf 的新手,我想知道以下方法之间有什么不同: 1) foo.mutable_bar()->set_somefield(...) 和 2) nestedmsg = fo
如果我这样调用它,我会看到一个很好的差异: self.assertEqual(a, b) 如果我这样调用它,我只会看到消息: self.assertEqual(a, b, msg) 有没有简单的方法来
我是 akka 的初学者。有人可以向我解释为什么 tell 方法定义如下: receiver.tell(msg, sender); 在我看来,有人向其他人发送消息,在 OOP 中它会这样: sende
目前我的代码有 CString DisplayMessage,我的代码全部使用它在客户端和服务器之间交换 DisplayMessage。现在随着软件走向国际化,我希望 DisplayMessage 具
当我使用 Handler.dispatchMessage(msg) 时,handleMessage(Message msg) 将在新线程上运行,但是当我使用 Handler.sendMessage(
今天我遇到了一个事实,即从子线程调用的 sys.exit() 不会终止主进程。我以前不知道这一点,这没关系,但我需要很长时间才能意识到这一点。如果 sys.exit(msg) 会将 msg 打印到 s
我复制了 rabbitmq go example 并稍作改动以进行测试。 Example URL .正常工作 代码结构: func main() { //dial rabbit serve
我正在阅读 Java 9 中引入的 System.Logger API。我无法理解为什么他们开发了如此奇怪 API: System.Logger { public default void log
msg.chat.id 之间有什么区别和 msg.from.id在 Telegeram 机器人中? 显然,两者都是相同的并且返回用户ID。 bot.sendMessage(msg.chat.id, '
我目前正在学习 elm,我只是偶然发现了 div 返回 Html (String -> Msg) 而不是 Html Msg 的问题。 我收到的错误信息 这个 div 调用产生: Html (Strin
我是一名优秀的程序员,十分优秀!