Zookeeper 日志输出到指定文件夹,并按照日期轮循输出

更改日志输出路径

如果不做修改,zookeeper的日志信息默认都打印到了zookeeper.out文件中,这样输出路径和大小没法控制,因为日志文件没有轮转。所以需要修改日志输出方式。具体操作如下:

1.修改${zkhome}/bin/zkEnv.sh

ZOO_LOG_DIR指定想要输出到哪个目录,ZOO_LOG4J_PROP指定INFO,ROLLINGFILE的日志APPENDER.

if [ "x${ZOO_LOG_DIR}" = "x" ]
then
	# 指定想要输出到哪个目录
    ZOO_LOG_DIR="/apps/logs/zookeeper"
fi

if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
	# 指定日志生成规则
    ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi

if [ "$JAVA_HOME" != "" ]; then
  JAVA="$JAVA_HOME/bin/java"
else
  JAVA=java
fi

2.修改$ZOOKEEPER_HOME/conf/log4j.properties文件

zookeeper.root.logger的值与前一个文件的ZOO_LOG4J_PROP 保持一致,该日志配置是以日志文件大小轮转的,如果想要按照天轮转,可以修改为DaliyRollingFileAppender.
RollingFileAppender按log文件最大长度限度生成新文件,DailyRollingFileAppender按日期生成新文件。

# Define some default values that can be overridden by system properties
zookeeper.root.logger=INFO,ROLLINGFILE 
zookeeper.console.threshold=INFO
zookeeper.log.dir=.
zookeeper.log.file=zookeeper-1.log
zookeeper.log.threshold=DEBUG
zookeeper.tracelog.dir=.
zookeeper.tracelog.file=zookeeper_trace.log
#
#
# Add ROLLINGFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}

# Max log file size of 10MB
#log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# uncomment the next line to limit number of backup files
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10

3.去掉zookeeper.out文件

美中不足的是在你设定的目录中, 仍会有zookeeper.out文件存在, 虽然它的size=0, 但是仍让我感到不爽.
究其原因是因为zkServer.sh会使用nohup进行zookeeper的启动, 然而nohup必然会输出一个日志文件到你设置的目录中。需要将此处的逻辑修改掉, 就可以将zookeeper.out移除啦, 如果你不是处女座当然可以省略这一步。
相关代码如下:

_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"

case $1 in
start)
    echo  -n "Starting zookeeper ... "
    if [ -f "$ZOOPIDFILE" ]; then
      if kill -0 `cat "$ZOOPIDFILE"` > /dev/null 2>&1; then
         echo $command already running as process `cat "$ZOOPIDFILE"`.
         exit 0
      fi
    fi
    nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &

按照日期轮循输出

log4j提供RollingFileAppenderDailyRollingFileAppender将日志记录输出到文件。RollingFileAppender按log文件最大长度限度生成新文件,DailyRollingFileAppender按日期生成新文件。

log4j.rootCategory=INFO, CONSOLE,R

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.base}/logs/portal.log
log4j.appender.R.Encoding=GBK
log4j.appender.R.MaxFileSize=256KB
log4j.appender.R.Append=true 
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d %t %-5p [%c{1}:%L] %m%n

上面是使用RollingFileAppender的写法,将会在Tomcat的logs目录下,生成portal.log文件,当文件大小超过256KB时,将原来的文件更名为portal.log.1,再使用portal.log接收新的日志记录。
log4j.appender.R.MaxBackupIndex=10表示只保存10个备份文件。

下面是使用DailyRollingFileAppender的写法,配置完成的当天, 会在Tomcat的logs目录下,生成名为portal.log的文件,比如今天是2010-01-13, 到明天这个文件将更名为portal.log2010-01-13.log

log4j.rootCategory=INFO, CONSOLE,DailyRolling

log4j.appender.DailyRolling=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DailyRolling.File=${catalina.base}/logs/portal.log
log4j.appender.DailyRolling.DatePattern=yyyy-MM-dd'.log'  
log4j.appender.DailyRolling.layout=org.apache.log4j.PatternLayout
log4j.appender.DailyRolling.layout.ConversionPattern=%-d %t %-5p [%c{1}:%L] %m%n

ZooKeeper使用的log4j.properties的主要部分:

[java] view plain copy
	zookeeper.root.logger=INFO, CONSOLE  (1)  
	zookeeper.console.threshold=INFO  
	zookeeper.log.dir=.  
	zookeeper.log.file=zookeeper.log  
	zookeeper.log.threshold=DEBUG  
	zookeeper.tracelog.dir=.  
	zookeeper.tracelog.file=zookeeper_trace.log  
	log4j.rootLogger=${zookeeper.root.logger} (2)  
	log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender (3)  
	log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold} (4)  
	log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout (5)  
	log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] -  
	...  
	log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender (6)  
	log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold} (7)  
	log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}  
	log4j.appender.ROLLINGFILE.MaxFileSize=10MB  
	log4j.appender.ROLLINGFILE.MaxBackupIndex=10  
	log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout                  
	log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] -  
	...   

(1) 第一组设置以zookeeper开头,它们实际上是Java system property,可以被-D形式的命令行参数覆盖。第一行配置了日志级别,默认的设置是说在INFO级别以下的日志会被丢弃,并且日志会使用CONSOLE appender输出。你可以指定多个appender,例如如果你想使用CONSOLE appender和ROLLINGFILE appender输出日志,那么可以配置zookeeper.logger为INFO,CONSOLE,ROLLINGFILE。

(2) rootLogger处理所有日志的logger,因为我们没有定义其他logger。

(3) 这一行把CONSOLE appender和实际上处理日志输出的类绑定在一起,这里是ConsoleAppender类。

(4) appender也可以过滤日志。这一行将过滤任何在INFO级别之下的日志,因为这是在zookeeper.root.logger设置的threshold。

(5) appender使用一个布局(layout)类在输出前对日志进行格式化。我们使用pattern layout来记录日志的级别,日期,线程信息和调用位置信息以及消息本身。

(6) RollingFileAppender实现了rolling日志文件的功能,而不是持续的写到一个单独的文件或者控制台。如果rootLogger没有关联ROLLINGFILE,则此appender会被忽略。

(7) ROLLINGFILE的threshold设置成DEBUG。因为rootLogger过滤了所有在INFO级别之下的日志,没有DEBUG日志会输出到ROLLINGFILE。如果你想要看到DEBUG日志,你必须把zookeeper.root.logger从INFO改成DEBUG。

打日志会影响到进程的性能,尤其是在DEBUG级别下。同时日志会提供有价值的信息为诊断错误提供线索。一个平衡性能开销的有效方式是把appender的threshold设成DEBUG,并把rootLogger设成WARN级别,这在一般的情况都适用,一般只需要关注WARNING和它之上的日志。当你需要诊断问题时可以使用JMX动态设置为INFO或DEBUG级别,这样可以更方便定位问题。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值