- 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/
不同的 LogCat 方法是: Log.v(); // Verbose Log.d(); // Debug Log.i(); // Info Log.w(); // Warning Log.e();
在android群里,经常会有人问我,android log是怎么用的,今天我就把从网上以及sdk里东拼西凑过来,让大家先一睹为快,希望对大家入门android log有一定的帮助. android
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 社区 12
我正在尝试使用 sonarlint 检查代码质量.上面的问题概要,我不明白为什么它要说要大写。但是 this discussion与上述建议相反。哪一个应该被认为是正确的? 最佳答案 这没有正确答案,
随着 n 变大,log*(log n) 和 log(log* n) 这两个函数会更快吗? 这里,log* 函数是迭代对数,定义如下: 我怀疑它们是相同的,只是写法不同,但它们之间有什么区别吗? 最佳答
作为家庭作业,我被要求在 O(log(n)) 中编写一个算法,我可以计算出我编写的算法的复杂度为 O(log(n) + log(n/2) + log(n/4) + log(n/8) + ... + l
我正在使用 Tomee。日志文件夹包含这样的文件 localhost_access_log.2016-12-02.txt localhost.2016-12-02.log catalina.2016-
Android Log.v、Log.d、Log.i、Log.e 等的 ios 等效项是什么?同样在 android 上,我使用 Android 设备监视器和 logcat 来访问我的手机日志,我需要在
我认为下面的代码是 O(log log n) 因为它里面有 i*i 但我对 log n 感到困惑> 和 log (log n)。 for (i=2; i*i<=number; i++) { if
我正在修改 kvm 模块,并在内核代码中添加了 printk 语句。运行虚拟机后,printk 为我提供了错误地址和有关 guest 操作系统的其他信息。 我需要从这个信息中生成统计信息。当我使用 d
我有一个部署为 Windows Azure Web 角色的 WCF 服务。 我正在使用 Enterprise Library 进行异常处理,并且在我的本地 Development Fabric 中,似
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
在 Go 的生产中使用 log.SetFlags(log.LstdFlags | log.Lshortfile) 是好的做法(至少是一般做法)吗?我想知道在生产中这样做是否存在性能或安全问题。因为它不
我想知道什么更快: double value = Math.log(a) - Math.log(b); 或 double value = Math.log(a/b); 我计算值的方式是否会对性能产生影
我有数百个子例程使用 log.Println() 写入日志文件 我正在使用 log.Println 写入 error.log 文件。 func main() { e, err := os.Open
我将 Nuxt 与 SSR 一起使用,并希望有类似于 apaches 的 access.log 和 error.log 的东西 我特别感兴趣的是每次调用的响应时间。 我在 nuxt 文档中找不到任何内
我知道以前有人问过这个问题,但我相信这是一个不同的问题。 Nginx 在 www-data 下运行: $ ps -eo "%U %G %a" | grep nginx root root
我在我的日志文件中发现了一个非常奇怪的条目 Jan 29 01:35:30 vs-proj-handy sshd[5316]: Received disconnect from 130.207.203
对于我正在开发的应用程序,我希望在开发过程中和发布时简化故障排除。我希望能够检索到对 Log 的调用,以了解在 USB 调试中没有连接手机的情况下运行应用程序时的调用,以便可以检索并发送给我。例如,当
我试图捕获 panic 并记录错误: func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloRep
我是一名优秀的程序员,十分优秀!