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"/>​​即可