0


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"fiif["x${ZOO_LOG4J_PROP}"="x"]then# 指定日志生成规则ZOO_LOG4J_PROP="INFO,ROLLINGFILE"fiif["$JAVA_HOME"!=""];thenJAVA="$JAVA_HOME/bin/java"elseJAVA=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 propertieszookeeper.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 filelog4j.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$1in
start)echo-n"Starting zookeeper ... "if[-f"$ZOOPIDFILE"];thenifkill-0`cat"$ZOOPIDFILE"`> /dev/null 2>&1;thenecho$command already running as process `cat"$ZOOPIDFILE"`.exit0fifinohup"$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=10log4j.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=10log4j.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级别,这样可以更方便定位问题。


本文转载自: https://blog.csdn.net/SaberJYang/article/details/141693327
版权归原作者 玉梅小洋 所有, 如有侵权,请联系我们删除。

“Zookeeper 日志输出到指定文件夹,并按照日期轮循输出”的评论:

还没有评论