openTSDB查看日志

1.问题

openTSDB程序运行的日志在哪里呢?
今天发现自己的windows磁盘一直飙高100%,仔细定位之后,猜测是虚拟机中运行的openTSDB出现了问题,于是想查找openTSDB的运行日志,但却一直没有找到。

2.原因

定位问题的过程如下:

  • 搜索openTSDB安装目录下的日志文件
[root@server4 opentsdb-2.3.0]# find . -name "*log*"
./src/logback.xml
./build-aux/rpm/logback.xml
./third_party/slf4j/log4j-over-slf4j-1.7.7.jar.md5
./third_party/slf4j/log4j-over-slf4j-1.7.7.jar
./third_party/jexl/commons-logging-1.1.1.jar.md5
./third_party/jexl/commons-logging-1.1.1.jar
./third_party/logback
./third_party/logback/logback-core-1.0.13.jar
./third_party/logback/logback-classic-1.0.13.jar.md5
./third_party/logback/logback-classic-1.0.13.jar
./third_party/logback/logback-core-1.0.13.jar.md5
./build/third_party/slf4j/log4j-over-slf4j-1.7.7.jar.md5
./build/third_party/slf4j/log4j-over-slf4j-1.7.7.jar
./build/third_party/jexl/commons-logging-1.1.1.jar.md5
./build/third_party/jexl/commons-logging-1.1.1.jar
./build/third_party/logback
./build/third_party/logback/logback-core-1.0.13.jar
./build/third_party/logback/logback-classic-1.0.13.jar.md5
./build/third_party/logback/logback-classic-1.0.13.jar
./build/third_party/logback/logback-core-1.0.13.jar.md5
./build/config.log
./build/gwt/queryui/gwt/opentsdb/images/ie6/corner_dialog_topleft.png
./build/gwt/queryui/gwt/opentsdb/images/ie6/corner_dialog_topright.png
[root@server4 opentsdb-2.3.0]# find . -name "*.log*"
./build/config.log
[root@server4 opentsdb-2.3.0]# find . -name "*.log"
./build/config.log
[root@server4 opentsdb-2.3.0]# cd ./build-aux/rpm/logback.xml
-bash: cd: ./build-aux/rpm/logback.xml: Not a directory
[root@server4 opentsdb-2.3.0]#

大致猜测每个文件名之后,觉得./src/logback.xml最可疑,于是查看:

[root@server4 opentsdb-2.3.0]# cat ./src/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!--<jmxConfigurator/>-->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>
        %d{ISO8601} %-5level [%thread] %logger{0}: %msg%n
      </pattern>
    </encoder>
  </appender>
  
  <!-- This appender is responsible for the /logs endpoint. It maintains MaxSize 
       lines of the log file in memory. If you don't need the endpoint, disable
       this appender (by removing the line "<appender-ref ref="CYCLIC"/>" in
       the "root" section below) to save some cycles and memory. -->
  <appender name="CYCLIC" class="ch.qos.logback.core.read.CyclicBufferAppender">
    <MaxSize>1024</MaxSize>
  </appender>
  
  <!-- Appender to write OpenTSDB data to a set of rotating log files -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <file>/var/log/opentsdb/opentsdb.log</file>
      <append>true</append>
      <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <fileNamePattern>/home/y/logs/opentsdb2/opentsdb.log.%i</fileNamePattern>
         <minIndex>1</minIndex>
         <maxIndex>4</maxIndex>
      </rollingPolicy>
      <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
         <maxFileSize>512MB</maxFileSize>
      </triggeringPolicy>
      <!-- encoders are assigned the type
       ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
      <encoder>
         <pattern>%date{ISO8601} [%thread] %-5level [%logger{0}.%M] - %msg%n</pattern>
      </encoder>
   </appender>
  
  <!-- Appender for writing full and completed queries to a log file. To use it, make
       sure to set the "level" to "INFO" in QueryLog below. -->
  <appender name="QUERY_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/var/log/opentsdb/queries.log</file>
    <append>true</append>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>/var/log/opentsdb/queries.log.%i</fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>4</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>128MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
        <pattern>%date{ISO8601} [%logger.%M] %msg%n</pattern>
    </encoder>
  </appender>
  
  <!-- Per class logger levels -->
  <logger name="QueryLog" level="OFF" additivity="false">
    <appender-ref ref="QUERY_LOG"/>
  </logger>
  <logger name="org.apache.zookeeper" level="INFO"/>
  <logger name="org.hbase.async" level="INFO"/>
  <logger name="com.stumbleupon.async" level="INFO"/>
  
  <!-- Fallthrough root logger and router -->
  <root level="INFO">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="CYCLIC"/>
    <!-- Uncomment to log to file -->
    <!--<appender-ref ref="FILE"/>-->
  </root>
</configuration>

甚是惊讶,这不就是源码中的.xml配置文件嘛,于是顺便学习一下logback.xml文件的配置要素。主要如下:

2.1logback简介

logback的语法十分灵活。所以无法使用DTD或者XML schema进行定义。尽管如此,可以这样描述配置文件的基本结构:以开头,后面有零个或多个元素,有零个或多个元素,有最多一个元素。

2.2logback的默认配置
  • 01.尝试在 classpath下查找文件logback-test.xml;
  • 02.如果文件不存在,则查找文件logback.xml;
  • 03.如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台。
2.1logback 组件
  1. 子节点:负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名
  • ConsoleAppender 把日志输出到控制台,有以下子节点:
          :对日志进行格式化。(具体参数稍后讲解 )
          :字符串System.out(默认)或者System.err(区别不多说了)
  • FileAppender:把日志添加到文件,有以下子节点:
          :被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
          :如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
          :对记录事件进行格式化。(具体参数稍后讲解 )
          :如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
  • RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:
          :被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
          :如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
          :当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类
          class=“ch.qos.logback.core.rolling.TimeBasedRollingPolicy”: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
    :必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。
  1. 子节点:用来设置某一个包或具体的某一个类的日志打印级别、以及指定。仅有一个name属性,一个可选的level和一个可选的addtivity属性。可以包含零个或多个元素,标识这个appender将会添加到这个loger

通过上面的logback.xml文件,可以看到这个默认的openTSDB的日志目录是在/var/log/opentsdb/opentsdb.log中。查看结果如下:

[root@server4 opentsdb-2.3.0]# cd /var/log/opentsdb/
[root@server4 opentsdb]# ll
total 0
-rw-r--r--. 1 root root 0 Jul  9 22:30 opentsdb.log
-rw-r--r--. 1 root root 0 Jul  9 22:30 queries.log

同时,可以注意到这里面的日志大小是0,因为logback.xml文件中的配置有如下一行

  <!-- Fallthrough root logger and router -->
  <root level="INFO">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="CYCLIC"/>
    <!-- Uncomment to log to file -->
    <!--<appender-ref ref="FILE"/>-->
  </root>

其中<appender-ref ref="FILE"/>表示的就是将日志记录到文件中,但是却被注释掉了。去掉注释,启动openTSDB,再查看日志,如下:

[root@server4 opentsdb]# ll
total 36
-rw-r--r--. 1 root root 33932 Oct 28 22:25 opentsdb.log
-rw-r--r--. 1 root root     0 Jul  9 22:30 queries.log
[root@server4 opentsdb]# 

3.解决办法

看来只能是修改logback.xml文件来输出日志了。
<!--<appender-ref ref="FILE"/>--> 修改成<appender-ref ref="FILE"/>即可

4.参考文章