这个是程序员的核心工作,程序不是开发出来的是debug出来的,生产不是搭建出来的,是通过日志追踪来的。
日志是一个系统的核心,sout自己看看还可以,真实项目尽量忘记这个内置API,否则代码扫描就是给自己挖坑。
日志很重要,正式发布的应用日志一般都要有几个要求:
- 可定向输出,可能是catlina.out,也可能是ln 后的某个磁盘文件,也许在nas盘,也许被agent抓取到云日志平台。
- 有日志级别,日志分级很重要。
- 日志可以格式化,可读性永远是程序员必须遵守的规则。
- 可配置可控制,这个更是日志的核心,本地开发,甚至在测试VM上调试,都可以开启debug模式,但是到生产环境可能是海量的日志,运行稳定我们一般都只到info级别。这个需要动态配置控制,因为那天生产临时出问题,我们还有临时修改为debug,找到问题然后再改为info。如果用sout肯定完蛋。
基本日志
public static void main(String[] args) {
Logger.getGlobal().setLevel(Level.ALL);
Logger.getGlobal().info("123");
}
最简单的demo,使用JDK自带的Logger类,可以通过在main方法设置,控制日志输出级别。
高级日志
通常日志有以下7个级别:
- SERVERE
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
修改日志管理配置
jre/lib/logging.properties
要替代原始配置文件:
java -Djava.util.logging.config.file=configFile MainClass
JDK日志配置文件会在VM启动过程中初始化,所有不能main方法中进行设置,没有意义。
当然这个目前也没有意义,我们做javaweb开发,都会使用第三方日志。
常用的就是log4j工具,和对应的配置文件。
本地化
也就是格式化问题,只是为了可读性。
处理器
在默认情况下,日志及其将记录发送到ConsoleHandler中,并由它输入到System.err流中。
我们可以了解文件处理器配置参数和自定义处理器,这个也是第三方日志的核心。
我们可以通过扩展Handler 类或StreamHandler类自定义处理器。
有空了再补充吧。
可以参考
通过这些基础,只是想说明一件事,JVM是核心,JDK提供了N多本地方法和可继承类,很多三方工具都是通过JDK API扩展来的,只我们一直在玩业务,对于N多API我们闻所未闻,更是没有深入了解过。
过滤器
在默认情况下,过滤器根据日志记录的级别进行过滤。
过滤器有一个熟悉的名称,当初加班两天一夜做安全加固,其核心工作离不开过滤器。
中美贸易战,入侵害人不浅。
每个日志记录器和处理器都可以有一个可选的过滤器来完成附加的过滤。
另外,可以通过实现Filter接口并定义下列方法来自定义过滤器。
bolean isLoggabble(LogRecord record)
格式化器
ConsoleHandler类和FileHandler类可以生成文本和XML格式的日志记录。
但是,也可以自定义格式。
这需要扩展Formatter类并覆盖下面这个方法:
String format(LogRecord record);
日志记录说明
- 为一个简单的应用程序,选择一个日志记录器,并且按照类命名。
- 最好在应用程序中安装一个更加适宜的默认配置。
- 合理利用日志级别。