tomcat--catalina-daemon.out日志分割和输出等级控制

为了更加安全,生产环境中我更加青睐把tomcat 使用 jsvc 以守护进程的方式启动(daemon.sh )。这样tomcat自身将会生成另外一个日志文件(catalina-daemon.out),而不是之前的catalina.out。但是随之出现2个问题:1.catalina-daemon.out这个文件不会自动切割,而且会无线增大。2.catalina-daemon.out里面log输出等级无法更改,大量info信息占据了磁盘。为了针对这两个问题特意研究了一番,研究过程因功力尚浅所以并不专业,敬请谅解。

一.catalina-daemon.out自动切割问题。

第一时间看到这个问题,首先想到的是类似于nginx的log切割方法。于是从daemon.sh里找到了它输出的路径,大约在136行。

test ".$CATALINA_OUT" = . && CATALINA_OUT="$CATALINA_BASE/logs/catalina-daemon.out"

可以直接更改到我们指定的目录下,并且用时间方式命名

test ".$CATALINA_OUT" = . && CATALINA_OUT="/XXX/catalina-daemon%Y-%m-%d.out"

但是使用这种方式每次更改需要重新启动tomcat才会生效。tomcat不像nginx拥有平滑重启的功能,每次重启都需要重新加载项目会直接导致项目中断,并不适合线上环境使用,故而pass掉。

于是百度了一下,但是并没有发现太好的解决办法。网上更多的是通过通过cronlog这个工具对catalina.out这个文件进行分割,死马当活马医于是尝试了一下仿照使用,把文件更改为

test ".$CATALINA_OUT" = . && CATALINA_OUT="|/usr/local/sbin/cronolog $CATALINA_BASE/logs/catalina-daemon%Y-%m-%d.out"

但是并没有生效,不知道是不是我用错了。

又想我重新生产成一个catalina-daemon.out,把之前的mv成123.log(随便起的名,方便后面更加直观说明,语文没学好)是否可以解决这个问题?但是我发现再不重启的前提下,tomcat会持续在123.log这个文件继续输出。当时便百度了一个linux文件标示的知识,发现也仅仅有inode,并不会产生一个唯一的文件标示符。google了一下大概意思是说tomcat启动后会把这个文件直接映射到内存中,也就是tomcat启动时的虚拟机里,不是按照路径+文件名的方式进行输出。那我要直接从内存这块里修改呢?因为确实能力有限,就没有做再深入的研究。

无奈之下只能选用一个最简单暴力的方法,算是临时解决了一下问题,发现网上有就给copy过来,具体如下:

#!/bin/bash
thedate=`date --rfc-3339=date`
predate=`date +%Y-%m-%d --date="-7 day"`

rmfile="/xxxx/server/tomcat/logs/catalina-daemon.${predate}.out"
outfile="/xxxx/server/tomcat/logs/catalina-daemon.out"
if [ -f ${rmfile} ];then
   rm -f ${rmfile}
fi

if [ -f ${outfile} ];then
   cp ${outfile} /xxxx/server/tomcat/logs/catalina-daemon.${thedate}.out
   echo "" > ${outfile}
fi

exit 0

不过这样做有可能会丢失一小部分日志,不知道有没有更好的解决办法。还看到有人用logrotate,不过这里就没有做实验。如果大家有更好的办法,欢迎指教。

二.catalina-daemon.out输出等级问题

catalina-daemon.out跟catalina.out文件一样,是存放着控制台输出的日志。但是默认情况是info级别,大量的info信息充斥着整个文件,所以我们应该把等级设置为WARNING来屏蔽掉这些输出信息。

SEVERE (highest value) >WARNING >INFO >CONFIG >FINE >FINER >FINEST  (lowest value)

一说到更改log第一反应是修改tomcat conf下的logging.properties的文件,但是发现更改后并没有生效。

返回来去读了一下deamon.sh,发现下面145行,log配置文件路径:

if [ -z "$LOGGING_CONFIG" ]; then
  if [ -r "$CATALINA_BASE/conf/logging.properties" ]; then
    LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
  else
    # Bugzilla 45585
    LOGGING_CONFIG="-Dnop"
  fi
fi

以及第200行,启动配置

     start   )
       "$JSVC" $JSVC_OPTS        -java-home "$JAVA_HOME"        -user $TOMCAT_USER        -pidfile "$CATALINA_PID"        -wait "$SERVICE_START_WAIT_TIME"        -outfile "$CATALINA_OUT"        -errfile "&1"        -classpath "$CLASSPATH"        "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS        -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS"        -Dcatalina.base="$CATALINA_BASE"        -Dcatalina.home="$CATALINA_HOME"        -Djava.io.tmpdir="$CATALINA_TMP"        $CATALINA_MAIN
       exit $?

发现启动的时候确实是读取了logging.properties这个文件,同时也发现了把控制台的标准输出跟错误输出一起都输出到$CATALINA_OUT下面,但是为什么更改后没有生效呢?无奈之下只能硬着头皮去看看tomcat源码。

说实话读源码真是要命,但是发现源码里有读取JDK下面的logging.properties,更改后发现无效。继续看

发现在源码里已经定了log输出等级为INFO,难道只能去修改源码重新编译tomcat才能生效么?

后来请教一位大神重新帮我解读源码,已经找到了问题所在,感谢大神小果儿。大致如下(个人理解)

首先 tomcat日志上有 目标源,同一个源可以有多个目标输出,同样多个源也可以对应一个输出。我们之前所更改的配置文件其实都生效了,只是对应的输出不对而已。在jsvc下定义的catalina-deamon.out的源是在tomcat项目(webapp)下,所以想要修改catalina-deamon.out的输出等级只需要更改项目下logging.properties文件就可以生效,如果有多个项目则需要到每个项目下修改。顺便一提。catalina.out对应的源是tomcat自身,所以更改tomcat下的配置文件就可以生效。

时间: 2024-08-06 18:49:14

tomcat--catalina-daemon.out日志分割和输出等级控制的相关文章

tomcat Catalina.ou按日保存日志文件分割方法

转:http://tanrishou.blog.163.com/blog/static/1502502009924112045630/ 一.本文基于的环境: 操作系统:Linux(redhat).Windows(XP.2003) JDK版本:j2sdk1.4.2_04 Tomcat版本:tomcat-5.0.28 Cronolog版本:cronolog-1.6.2.tar.gz cronolog-1.6.1-win32.zip 本文修改后的tomcat都是按日保存日志文件,文件格式如:catal

.NET Core下的日志(3):如何将日志消息输出到控制台上

当我们利用LoggerFactory创建一个Logger对象并利用它来实现日志记录,这个过程会产生一个日志消息,日志消息的流向取决于注册到LoggerFactory之上的LoggerProvider.说的更加具体一点,日志消息的归宿取决于注册到LoggerFactory的LoggerProvider究竟会提供怎样的Logger.微软提供了一系列原生的LoggerProvider,我们先来认识一下将控制台作为日志输出目的地的ConsoleLoggerProvider.ConsoleLoggerPr

Tomcat 的 catalina.out 日志分割

一.背景 Tomcat 的 catalina.out 日志量不断增加,占用空间较大,且默认是不滚动的.因此,需要对其进行日志分割,并进行清理. 本文选用 Cronolog 对其进行分割. 二.安装 1.下载 地址:http://cronolog.org/download/cronolog-1.6.2.tar.gz 2.安装 # tar zxvf cronolog-1.6.2.tar.gz # cd cronolog-1.6.2 # ./configure # make # make instal

Tomcat catalina.out日志使用log4j按天分割

由于tomcat catalina.out日志不会自动分割, 一.日志分割所需包在附近中 1. 压缩包中有三个jar包: log4j-1.2.16.jar tomcat-juli-adapters.jar tomcat-juli.jar 说明:如果不是tomcat7版本,请去官网下载对应版本的tomcat-juli.jar,tomcat-juli-adapters.jar类包, 下载地址: http://www.apache.org/dist/tomcat   在对应版本中的bin/extras

配置tomcat日志分割

由于Tomcat在默认情况下会将没有经过配置的web应用所产生的日志输出已及其本身的日志内容都输出到这个文件中,那么随着时间的推移,这个文件的尺寸将会越来越大,当需要检查日志内容时间会导致文件难以打开,而且同时tomcat依旧在不断的向文件中输入内容,这也会降低tomcat的性能.下面利用一个工具来将tomcat产生的catalina.out文件根据日期来分割,将每天产生的日志存放在一个独立的文件中,这样单个log文件就不会太大,而且过期的日志文件可以根据情况在不需要的时间删除掉,或者备份到其他

Tomcat 日志分割.

一.前言 随着每天业务的增长,Tomcat 的catalina.out日志 变得越来越大,占用磁盘空间不说.要查看某个时候的日志的时候,庞大的日志让你顿时无从下手,所以日志的切割的变得刻不容缓.而且,切割后的日志,还可以定期清理掉久远的日志...... 二.Tomcat 日志分割 我们采用日期形式切割catalina.out 日志,因此采用cronlog 软件切割: 1.安装 cronlog  yum install -y cronolog httpd 2.修改bin/catalina.sh文件

Tomcat7 catalina.out 日志分割

Tomcat7 catalina.out 日志分割 安装过程如下: 1.下载(最新版本) cronolog-1.6.2.tar.gz 2.解压缩 # tar zxvf cronolog-1.6.2.tar.gz 3.进入cronolog安装文件所在目录 # cd cronolog-1.6.2 4.运行安装 # yum –y install gcc # ./configure # make # make install 5.查看cronolog安装后所在目录(验证安装是否成功) # which c

Tomcat实现日志分割

Tomcat日志分割 实现目的: 由于现实生产中,Tomcat服务每天产生的日志文件中的数据特别庞大,服务器存储空间有限.为了解决空间不足问题,因此实现日志分割,添加日志压缩 环境:系统版本:CentOS Linux release 6.0 (Final) 软件版本:Cronolog-1.6.2.tar.gz Tomcat日志分割工具cronolog 1.下载cronolog-1.6.2.tar.gz 2.安装 # tar zxvf cronolog-1.6.2.tar.gz # ./confi

Tomcat日志分割

Tomcat日志分割 一.背景 Tomcat 日志如果长时间未处理,会有一个很大的log文件,查看不是很方便,如果根据时间每天记录一个日志,可以很方便的查看问题以及删除老旧的日志文件. 二.操作 我们采用日期形式切割catalina.out 日志,因此采用cronlog 软件切割: 1.安装 cronlog yum install -y cronolog httpd 2.修改bin/catalina.sh文件 (1) if [ -z "$CATALINA_OUT" ] ; then C