作者:fbysss
关键字:Tomcat日志
环境:linux
前言:采用默认的tomcat日志,无法解决中文信息输出乱码的问题。tomcat5 中,可以使用log4j或者java logging配置文件对日志输出进行配置。以下是相关试验记录。
如果common/lib下没有common-logging.jar和log4j.jar
输出正常的日志。catalina.out记录控制台信息,否则,会产生tomcat.log,其内容和catalina.out格式不一样。
如果是bin/catalina.sh start,会记录catalina.out文件
如果是bin/catalina.sh run,则会把内容输出到控制台,不产生catalina.out,产生
catalina.2008-08-04.log这样的文件,但是里面的内容要比catalina.out少。
实验用的文件内容如下
log4j.properties
log4j.rootLogger=info,Console,R
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.Console.layout.ConversionPattern=%d{yy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n
#保证中文无乱码
log4j.appender.Console.Encoding=GBK
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=${catalina.home}/logs/tomcat.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy.MM.dd HH:mm:ss} %5p %c{1}(%L):? %m%n
log4j.appender.R.Encoding=GBK
#log4j.logger.org.apache=info, R
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=DEBUG, R
log4j.logger.org.apache.catalina.core=info, R
log4j.logger.org.apache.catalina.session=info, R
导致的结果是tomcat.log输出了两遍,即每一条都重复输出
后来发现,重复输出的元凶,实际上是这个配置文件本身有问题。红色字体这几句有重叠的成分,注释掉第一句,INFO不重复了。
还要注意一点:如果应用目录下有log4j.properties文件(具体目录,实验时就是在应用的根目录下,比如fbysssProject/log4j.properties),当删除tomcat/common/classes/log4j.properties之后,只要lib里面那两个包还在,tomcat会在应用目录里面找log4j.properites。这样,还会生成tomcat.log。
注意:虽然文档中有log4j.appender.R.File=${catalina.home}/logs/tomcat.log ,但实际上这个文件是固定的,改了没有用,始终会生成到tomcat.log里面。
还有就是tomcat.log尚不能替代catalina.out,因为其不能输出各应用的日志。
进一步的实验,事情变得越来越离谱:把tomcat/common/classes和应用根目录的log4j.properties都删除之后,tomcat.log还在更新!为何?
后来发现,在应用目录的上级目录里面还有一个log4j.properties,tomcat居然找到这里去了?真是匪夷所思,删除这个文件之后,tomcat.log终于消失了。而且,这里的配置文件,可以修改tomcat.log为其他文件名。
回头一想,是不是开始应用根目录的那个文件实际上没作用?实验表明,的确,也就是说上面的斜体字部分是误解。正确的是:两个包在,还要能够找到log4j.properties,才会生成指定的log文件(不一定是要tomcat.log)。
想把应用的类日志也输出到tomcat.log,尝试把应用里面。
增加
log4j.logger.org.apache.jsp=info, R
log4j.logger.org.hibernate=info,R
log4j.logger.com.fbysssProject=info,R
log4j.logger.org.apache.commons = ERROR,R
log4j.rootLogger=info, R
log4j.logger.org.dom4j=info
log4j.logger.JDBCExceptionReporter=info
没有成功
结论:tomcat日志只能记录tomcat本身的日志,要做到日志与控制台显示完全一样,几乎不可能,(当然,如果不要求看控制台,用catalina.sh start方式,可以查看catalina.out,这个和控制台内容一样。)折衷办法是在各自的应用中自己写日志配置,结合起来看。
java logging方式:
tomcat/conf/logging.properties:
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4adimin.org.apache.juli.FileHandler, 5host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler ,org.apache.juli.FileHandler
.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler ,org.apache.juli.FileHandler
#这句可以保证输出中文没有乱码
java.util.logging.ConsoleHandler.encoding=GBK
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = sout.
org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
4admin.org.apache.juli.FileHandler.level = FINE
4admin.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4admin.org.apache.juli.FileHandler.prefix = admin.
写入文件sout.log,但是还是不全。
编辑conf/logging.properties
handlers节加入org.apache.juli.FileHandler
.handlers节加入org.apache.juli.FileHandler
任意位置写入:
org.apache.juli.FileHandler.level = FINE
#位置
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
#日志前缀
org.apache.juli.FileHandler.prefix = sout.
org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter
“ 一闪而过”错误
在windows下,有时候tomcat出错,一闪而过,还看不到信息,解决办法是使用catalina.bat run,可以看到出错信息。