作者: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,可以看到出错信息。