Tomcat日志与Log4j日志
一:日志作用
更好的调试,分析问题。
普通的一个请求处理10秒钟,日志10秒钟,总共就得20秒钟,这肯定是不行的,因为日志严重影响了性能。所以,我们就有必要了解日志的实现方式,以及它是如何降低IO的时间。
java的有自己的日志输出,tomcat也有自己的日志输出,下面就让我们简单了解下,以便整理思路。
二:java日志的实现方式:
1.可以使用JDK自带的Log类,也可以使用其他的日志框架,如log4j,Slf4j等日志框架
常见java日志框架: Log4j Apache Log4j是一个基于Java的日志记录工具。Log4j 是最常用的Java日志框架。 Log4j 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自带的实现。
三:Tomcat日志:
1.JDK的实现:
由于JDK的内部,默认提供了关于Log的配置文件,文件位于:Java\jre1.8\lib\logging.properties,
而对比Tomcat的输出,我们的内容并没有输出到文件中。Log日志信息都输出到了Console中。
2.tomcat的实现:
tomcat默认使用JULI日志,也就是java自己的Log:java.util.logging.Logger。
项目中我们可以使用log4j来打印自己的日志。tomcat打印自己的系统日志,log4j打印项目中的日志,两者是不冲突的,可以同时工作,也就是说tomcat\logs目录下的日志是由他们两个共同打印出来的
3.tomcat默认使用JULI日志,如何验证呢:
tomcat会加载\conf\logging.properties配置文件,在该配置文件中配置了java.util.logging.ConsoleHandler,使用的是java日志logging包下的类
Tomcat中增加自定义的logger配置文件,这一过程是通过启动脚本catalina.bat(目录:apache-tomcat-8.0.\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的日志实现
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文件为例
Tomcat日志与Log4j日志的更多相关文章
- tomcat 6.x + log4j日志配置并按天(或大小)生成文件
tomcat日志,默认路径在${catalina.home}/logs目录下,默认使用的是tomcat自己封装的logging工具类,默认配置文件使用的${catalina.home}/conf/ ...
- spring boot日志及Log4j日志配置
1.默认实现的日志配置 Spring boot默认已经集成了logging,同时也是默认开启的,如果想根据自己的需求对日志进行配置,方法很简单--只需要在配置文件中进行相应设置,这里提供我自己的配置如 ...
- Tomcat catalina.out日志使用log4j按天分割
由于tomcat catalina.out日志不会自动分割, 一.日志分割所需包在附近中 1. 压缩包中有三个jar包: log4j-1.2.16.jar tomcat-juli-adapters.j ...
- 解决IntelliJ IDEA控制台乱码问题[包含程序运行时的log4j日志以及tomcat日志乱码]
这里使用的IntelliJ IDEA版本为[IntelliJ IDEA 14.1.4]: 一.控制台打印的程序运行时的log4j日志中包含中文乱码 在IDEA安装目录的bin目录下找到名为" ...
- log4j日志相对路径,Tomcat(第三方和Springboot内置)参数catalina.home和catalina.base的设置
关于Log4j日志相对路径的配置请看:log4j 产生的日志位置设置 和 catalina.home.catalina.base . 由于我们在Log4j的配置中引入了系统属性${catalina.b ...
- 成功配置TOMCAT的LOG4J日志系统,格式:HTML+每天以YYYY-MM-DD.LOG命名的日志文件
关于log4j.properties文件在web项目中放的位置,找过很多,最后实践结果是: 一.web项目 二.放在src的目录里面,然后项目生成后会自动在\WEB-INF\classes文件里有份l ...
- Log4j 输出的日志中时间比系统时间少了8小时的解决方法,log4j日志文件重复输出
1. 第一个问题:时间少了8小时 Log4j 输出的日志中,时间比系统时间少了8小时,但是 eclipse 控制台输出的日志的时间却是对的. log4j配置如下: #all logger output ...
- log4j配置日志文件log4j.appender.R.File相对路径方法
方法一. 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs ...
- 日志配置log4j 打印线程号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # Set root logger level to WARN and a ...
随机推荐
- Codefoces 723A The New Year: Meeting Friends
A. The New Year: Meeting Friends time limit per test:1 second memory limit per test:256 megabytes in ...
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- BZOJ 2257: [Jsoi2009]瓶子和燃料【数论:裴蜀定理】
2257: [Jsoi2009]瓶子和燃料 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1326 Solved: 815[Submit][Stat ...
- ZOJ 1002 DFS
Fire Net Time Limit: 2 Seconds Memory Limit: 65536 KB Suppose that we have a square city with s ...
- Codeforces Round #280 (Div. 2)_C. Vanya and Exams
C. Vanya and Exams time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Linux shell编程命令-Linux基础环境命令学习笔记
1.正则表达式 1)^开始 *前一个字符重复0次以上 + 1次以上 ? 0次或者1次 . 一个任意字符(.*连用) {m,n} m到n次 [0-9][a-z] 任意数字或字母 $结束字符 2)sed和 ...
- Qt 共享库(动态链接库)和静态链接库的创建及调用
前言: 编译器 Qt Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sh ...
- 基于逆波兰式的JAVA计算器
请看下方↓↓
- Spark算子--first、count、reduce、collect、lookup
转载请标明出处http://www.cnblogs.com/haozhengfei/p/4b8582c8dde1529abb11e4ccc8296171.html first.count.reduce ...
- Algorithms code
一些值得回看的小算法. 最长的连续子数组 子数组数字不重复 int [] arr={1,2,3,4,7}; //输出4 int [] arr1={1,2,3,4,1,2,3,4,5,1}; //输出5 ...