更好的调试,分析问题。html
普通的一个请求处理10秒钟,日志10秒钟,总共就得20秒钟,这确定是不行的,由于日志严重影响了性能。因此,咱们就有必要了解日志的实现方式,以及它是如何下降IO的时间。java
java的有本身的日志输出,tomcat也有本身的日志输出,下面就让咱们简单了解下,以便整理思路。apache
1.可使用JDK自带的Log类,也可使用其余的日志框架,如log4j,Slf4j等日志框架tomcat
常见java日志框架: Log4j Apache Log4j是一个基于Java的日志记录工具。Log4j 是最经常使用的Java日志框架。 Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。 Commons Logging Apache基金会所属的项目,是一套Java日志接口,以前叫Jakarta Commons Logging,后改名为Commons Logging。 Slf4j 相似于Commons Logging,是一套简易Java日志门面,自己并没有日志的实现。(Simple Logging Facade for Java,缩写Slf4j)。 Logback 一套日志组件的实现(slf4j阵营)。 Jul (Java Util Logging),自Java1.4以来的官方日志实现,也就是JDK自带的实现。
1.JDK的实现:框架
因为JDK的内部,默认提供了关于Log的配置文件,文件位于:Java\jre1.8\lib\logging.properties,ide
而对比Tomcat的输出,咱们的内容并无输出到文件中。Log日志信息都输出到了Console中。工具
2.tomcat的实现:布局
tomcat默认使用JULI日志,也就是java本身的Log:java.util.logging.Logger。性能
项目中咱们可使用log4j来打印本身的日志。tomcat打印本身的系统日志,log4j打印项目中的日志,二者是不冲突的,能够同时工做,也就是说tomcat\logs目录下的日志是由他们两个共同打印出来的url
3.tomcat默认使用JULI日志,如何验证呢:
tomcat会加载\conf\logging.properties配置文件,在该配置文件中配置了java.util.logging.ConsoleHandler,使用的是java日志logging包下的类
Tomcat中增长自定义的logger配置文件,这一过程是经过启动脚本catalina.bat(目录:apache-tomcat-8.0.38\bin\catalina.bat)来实现的,因此咱们能够编辑catalina.bat文件,有两个参数:LOGGING_CONFIG、LOGGING_MANAGER --设置配置 if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
//此时咱们能够打开tomcat的安装目录,进入到conf\logging.properties文件中进行查看,就能够看到.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler,也就验证了tomcat默认使用java的Log来打印日志
if not "%LOGGING_MANAGER%" == "" goto noJuliManager set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 即启动参数中包含两个-D参数 java.util.logging.config.file,java.util.logging.manager。
4.Tomcat下默认的的配置文件:conf\logging.properties中,同时指定了多个handlers,分别对应的是tomcat\logs目录
5.Tomcat 日志信息分为两类 :
一是运行中的日志,它主要记录运行的一些信息,尤为是一些异常错误日志信息 。
二是访问日志信息,它记录的访问的时间,IP ,访问的资料等相关信息。
默认 tomcat 不记录访问日志,以下方法可使 tomcat 记录访问日志: 编辑 catalina/conf/server.xml文件: 注释掉<Valve className="org.apache.catalina.valves.AccessLogValve">以后,就看不到全部的请求参数了。 //server.xml的每个元素都对应了Tomcat中的一个组件
AccessLogValve的做用是经过日志记录其所在的容器中处理的全部请求,记录的日志就是访问日志,天天的请求会写到一个日志文件里
1.Tomcat内部的日志实现,是使用JULI,
Tomcat使用的日志配置文件:$CATALINA_BASE/conf/logging.properties
Tomcat日志管理类默认使用的是JULI:LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
2.Tomcat下相关的日志文件
Cataline引擎的日志文件,文件名catalina.日期.log
注:{catalina} 是 tomcat 的安装目录
3.Tomcat下Web应用程序可使用以下3种日志:
使用JDK提供的日志java.util.logging.
使用Java Servlets规范中定义的日志javax.servlet.ServletContext.log(...)
使用其余日志框架,如log4j
4.也可使用界面来管理tomcat的项目,此时须要在tomcat-user.xml中进行配置,而后访问:http://localhost:8081/manager/html
Log4j能够打印咱们项目中本身的日志信息,它有主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局),这里不作介绍。
实现原理:会自动帮咱们加载日志文件,只要咱们放到对应的目录下就能够,约定大于配置。
直接看源码:LogManager类:org.apache.log4j.LogManager
// By default we use a DefaultRepositorySelector which always returns 'h'.
Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG)); repositorySelector = new DefaultRepositorySelector(h);
//step1:先去找有没有覆盖的 /** Search for the properties file log4j.properties in the CLASSPATH. */ String override =OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY, null); // if there is no default init override, then get the resource // specified by the user or the default config file.
if(override == null || "false".equalsIgnoreCase(override)) { //step2:再找有咱们有没有本身配置 String configurationOptionStr = OptionConverter.getSystemProperty( DEFAULT_CONFIGURATION_KEY, null); String configuratorClassName = OptionConverter.getSystemProperty( CONFIGURATOR_CLASS_KEY, null); URL url = null; // if the user has not specified the log4j.configuration // property, we search first for the file "log4j.xml" and then // "log4j.properties"
if(configurationOptionStr == null) {
//step3:在系统的类路径下,尝试加载log4j.xml url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE); if(url == null) {
//step4:尝试去加载log4j.properties url = Loader.getResource(DEFAULT_CONFIGURATION_FILE); } } else { try { url = new URL(configurationOptionStr); } catch (MalformedURLException ex) { // so, resource is not a URL: // attempt to get the resource from the class path
url = Loader.getResource(configurationOptionStr); } } // If we have a non-null url, then delegate the rest of the // configuration to the OptionConverter.selectAndConfigure // method.
if(url != null) { LogLog.debug("Using URL ["+url+"] for automatic log4j configuration."); try { OptionConverter.selectAndConfigure(url, configuratorClassName, LogManager.getLoggerRepository()); } catch (NoClassDefFoundError e) { LogLog.warn("Error during default initialization", e); } } else { LogLog.debug("Could not find resource: ["+configurationOptionStr+"]."); } } else { LogLog.debug("Default initialization of overridden by " + DEFAULT_INIT_OVERRIDE_KEY + "property."); }
也就是说:
1. 获取系统属性,看是否用户设置了override。默认是不设置的。
2.查看咱们本身是否有配置
3. 若是确实没有设置,那么尝试找一下,有没有log4j.xml,有则加载。
4. 若是尚未,那么尝试找一下,有没有log4j.properites,有则加载。
因此,你把log4j.xml或log4j.properties放在这些目录下,那么log4j会“自动去加载”到,不用程序里手工写加载代码了。这也就“约定大于配置的好处”。
参考:
https://www.zhihu.com/question/40854079
https://www.cnblogs.com/alipayhutu/archive/2013/04/18/3028249.html
日志Log类:
===================================================
配置文件: 以log4j.properties文件为例