1 什么是日志?
日志:顾名思义就是我们程序在运行时一些状态信息,需要显示出来,供我们程序员查看,了解程序在运行过程中出现的种种问题,以便通过这些信息寻找bug,调试项目等等。一个良好的项目,日志是不可或缺的一部分,关于日志的行为标准可查看《阿里巴巴Java开发手册》。
那么回想一下,我们之前是怎么查看变量信息或者查看某些内容的?就是它 System.out.println();
使用它有什么不好的呢?
-
不能自定义样式
-
不能自动携带时间戳
-
输出的信息单一,想要更多的信息,只能自己动手添加
-
最重要的一点,只能输出到控制台,一旦项目上线后,它输出的内容就看不到了。
想要实现上面这几点功能,我们就要借助日志框架了。使用这些日志框架,
-
可以设置输出样式,避免自己每次都写
"ERROR: " + var
; -
可以设置输出级别,禁止某些级别输出。例如,只输出错误日志;
-
可以被重定向到文件,这样可以在程序运行结束后查看日志文件;
-
可以按包名控制日志级别,只输出某些包打的日志;
-
可以……总之好处多多,方便多多。
2 JDK Logging
JDK Logging,看到这个名字,应该能想象到,这个是JDK提供的日志打印工具,位于java.util.logging
包下。
入门案例:
public class Demo {
public static void main(String[] args) {
Logger log = Logger.getGlobal();
log.finest("finest");
log.finer("finer");
log.fine("fine");
log.config("config");
log.info("info");
log.warning("warning");
log.severe("server");
}
}
输出的内容中,不光包含了我们想要打印的信息,还包含着日期时间,哪个类,哪个方法,错误级别等信息。
再仔细观察发现,7条日志,只打印了3条,其余四条并没有打印。这是因为,日志的输出可以设定级别,通过级别过滤可以控制哪些信息输出,哪些信息不输出。JDK的Logging
定义了7个日志级别,从严重到普通:
因为默认级别是INFO
,因此,INFO
级别以下的日志,不会被打印出来。使用日志级别的好处在于,调整级别,就可以屏蔽掉很多调试相关的日志输出。
如果想要修改日志级别就有点麻烦了,需要找到JDK的安装目录,目录下的conf目录下的logging.properties文件,将文件中下列行的参数进行修改:
java.util.logging.ConsoleHandler.level = INFO
# ALL→FINEST→FINER→FINE→CONFIG→INFO→WARNING→EERVER→OFF
# ALL 全部显示,OFF关闭日志打印
log.setLevel(Level.ALL);
并在代码中,设置日志级别。两个设置缺一不可,否则级别设置不生效。
JDK Logging 不好用的地方不仅修改配置麻烦,系统在JVM启动时读取配置文件并完成初始化,一旦开始运行main()
方法,就无法修改配置;而且想要输出打印到文件中,还需要在JVM启动时传递参数-Djava.util.logging.config.file=<config-file-name>
。
因此JDK Logger除了不需要任何类库支持这个优点之外,相对于其他的日志框架,可谓是鸡肋,无论易用性,功能还是扩展性都要稍逊一筹,所以在商业系统中很少直接使用。
3 Commons Logging
和Java标准库提供的日志不同,Commons Logging
是一个第三方日志库,它是由Apache
创建的日志模块。
Commons Logging
的特色是,它可以挂接不同的日志系统,并通过配置文件指定挂接的日志系统。默认情况下,Commons Logging
自动搜索并使用Log4j
(Log4j
是另一个流行的日志系统),如果没有找到Log4j
,再使用JDK Logging
。
使用 C