You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by fr...@apache.org on 2021/12/03 13:32:24 UTC

[druid] branch master updated: Support rolling log files (#10147)

This is an automated email from the ASF dual-hosted git repository.

frankchen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 4631a66  Support rolling log files (#10147)
4631a66 is described below

commit 4631a66723d9a4123a92c61cab5b7fbf4b81153e
Author: Frank Chen <fr...@outlook.com>
AuthorDate: Fri Dec 3 21:32:01 2021 +0800

    Support rolling log files (#10147)
    
    * apply log file rolling strategy
    
    * fix doc
    
    Signed-off-by: frank chen <fr...@outlook.com>
    
    * Use absolute log path and allow spaces in log path
    
    * Update log4j2 configuration
    
    * apply FileAppender to ZooKeeper
    
    * DO NOT redirect application's console log to file in supervisor
---
 docs/configuration/logging.md                      | 44 +++++++++++++++------
 examples/bin/node.sh                               | 13 +++++--
 examples/bin/run-druid                             | 13 ++++++-
 examples/bin/run-zk                                | 12 +++++-
 examples/bin/supervise                             |  8 ++--
 examples/conf/druid/cluster/_common/log4j2.xml     | 39 +++++++++++++++----
 .../druid/single-server/large/_common/log4j2.xml   | 40 +++++++++++++++----
 .../druid/single-server/medium/_common/log4j2.xml  | 40 +++++++++++++++----
 .../micro-quickstart/_common/log4j2.xml            | 40 +++++++++++++++----
 .../nano-quickstart/_common/log4j2.xml             | 40 +++++++++++++++----
 .../druid/single-server/small/_common/log4j2.xml   | 40 +++++++++++++++----
 .../druid/single-server/xlarge/_common/log4j2.xml  | 40 +++++++++++++++----
 examples/conf/zk/log4j2.xml                        | 45 ++++++++++++++++------
 13 files changed, 333 insertions(+), 81 deletions(-)

diff --git a/docs/configuration/logging.md b/docs/configuration/logging.md
index 3512df5..e0fc63a 100644
--- a/docs/configuration/logging.md
+++ b/docs/configuration/logging.md
@@ -25,34 +25,54 @@ title: "Logging"
 
 Apache Druid processes will emit logs that are useful for debugging to the console. Druid processes also emit periodic metrics about their state. For more about metrics, see [Configuration](../configuration/index.md#enabling-metrics). Metric logs are printed to the console by default, and can be disabled with `-Ddruid.emitter.logging.logLevel=debug`.
 
-Druid uses [log4j2](http://logging.apache.org/log4j/2.x/) for logging. Logging can be configured with a log4j2.xml file. Add the path to the directory containing the log4j2.xml file (e.g. the _common/ dir) to your classpath if you want to override default Druid log configuration. Note that this directory should be earlier in the classpath than the druid jars. The easiest way to do this is to prefix the classpath with the config dir.
+Druid uses [log4j2](http://logging.apache.org/log4j/2.x/) for logging. The default configuration file log4j2.xml ships with Druid under conf/druid/{config}/_common/log4j2.xml .
 
-To enable java logging to go through log4j2, set the `-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager` server parameter.
+By default, Druid uses `RollingRandomAccessFile` for rollover daily, and keeps log files up to 7 days. 
+If that's not suitable in your case, you could modify the log4j2.xml to meet your need.
 
-An example log4j2.xml ships with Druid under config/_common/log4j2.xml, and a sample file is also shown below:
+An example log4j2.xml file is shown below:
 
 ```
 <?xml version="1.0" encoding="UTF-8" ?>
 <Configuration status="WARN">
-  <Appenders>
-    <Console name="Console" target="SYSTEM_OUT">
-      <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
-    </Console>
-  </Appenders>
+  <Console name="Console" target="SYSTEM_OUT">
+    <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+  </Console>
+    
+  <RollingRandomAccessFile name="FileAppender"
+                           fileName="${sys:druid.log.path}/${sys:druid.node.type}.log"
+                           filePattern="${sys:druid.log.path}/${sys:druid.node.type}.%d{yyyyMMdd}.log">
+    <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+    <Policies>
+        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
+    </Policies>
+    <DefaultRolloverStrategy>
+      <Delete basePath="${sys:druid.log.path}/" maxDepth="1">
+        <IfFileName glob="*.log" />
+        <IfLastModified age="7d" />
+      </Delete>
+    </DefaultRolloverStrategy>
+  </RollingRandomAccessFile>
   <Loggers>
     <Root level="info">
-      <AppenderRef ref="Console"/>
+      <AppenderRef ref="FileAppender"/>
     </Root>
 
     <!-- Uncomment to enable logging of all HTTP requests
     <Logger name="org.apache.druid.jetty.RequestLog" additivity="false" level="DEBUG">
-        <AppenderRef ref="Console"/>
+        <AppenderRef ref="FileAppender"/>
     </Logger>
     -->
   </Loggers>
 </Configuration>
 ```
 
+## How to change log directory
+By default, Druid outputs the logs to a directory `log` under the directory where Druid is launched from.
+For example, if Druid is started from its `bin` directory, there will be a subdirectory `log` generated under `bin` directory to hold the log files.
+If you want to change the log directory, set environment variable `DRUID_LOG_DIR` to the right directory before you start Druid.
+
+
 ## My logs are really chatty, can I set them to asynchronously write?
 
 Yes, using a `log4j2.xml` similar to the following causes some of the more chatty classes to write asynchronously:
@@ -65,7 +85,9 @@ Yes, using a `log4j2.xml` similar to the following causes some of the more chatt
       <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
     </Console>
   </Appenders>
-  <Loggers>
+  
+<Loggers>
+    <!-- AsyncLogger instead of Logger -->
     <AsyncLogger name="org.apache.druid.curator.inventory.CuratorInventoryManager" level="debug" additivity="false">
       <AppenderRef ref="Console"/>
     </AsyncLogger>
diff --git a/examples/bin/node.sh b/examples/bin/node.sh
index 991375e..db51ba7 100644
--- a/examples/bin/node.sh
+++ b/examples/bin/node.sh
@@ -37,12 +37,18 @@ command=$1
 
 LIB_DIR="${DRUID_LIB_DIR:=lib}"
 CONF_DIR="${DRUID_CONF_DIR:=conf/druid}"
-LOG_DIR="${DRUID_LOG_DIR:=log}"
 PID_DIR="${DRUID_PID_DIR:=var/druid/pids}"
 WHEREAMI="$(dirname "$0")"
 WHEREAMI="$(cd "$WHEREAMI" && pwd)"
 JAVA_BIN_DIR="$(source "$WHEREAMI"/java-util && get_java_bin_dir)"
 
+# Remove possilble ending slash
+LOG_DIR="${DRUID_LOG_DIR:=${WHEREAMI}/log}"
+if [[ $LOG_DIR == */ ]];
+then
+  LOG_DIR=${LOG_DIR%?}
+fi
+
 pid=$PID_DIR/$nodeType.pid
 
 case $command in
@@ -64,10 +70,11 @@ case $command in
     fi
     JAVA="$JAVA_BIN_DIR/java"
 
-    nohup $JAVA `cat $CONF_DIR/$nodeType/jvm.config | xargs` -cp $CONF_DIR/_common:$CONF_DIR/$nodeType:$LIB_DIR/*:$HADOOP_CONF_DIR org.apache.druid.cli.Main server $nodeType >> $LOG_DIR/$nodeType.log 2>&1 &
+    nohup $JAVA -Ddruid.node.type=$nodeType "-Ddruid.log.path=$LOG_DIR" `cat $CONF_DIR/$nodeType/jvm.config | xargs` -cp $CONF_DIR/_common:$CONF_DIR/$nodeType:$LIB_DIR/*:$HADOOP_CONF_DIR org.apache.druid.cli.Main server $nodeType >> /dev/null 2>&1 &
     nodeType_PID=$!
     echo $nodeType_PID > $pid
-    echo "Started $nodeType node ($nodeType_PID)"
+    echo "Started $nodeType node, pid: $nodeType_PID"
+    echo "Logging to default file[$LOG_DIR/$nodeType.log] if no changes made to log4j2.xml"
     ;;
 
   (stop)
diff --git a/examples/bin/run-druid b/examples/bin/run-druid
index 003824e..c9f2a70 100755
--- a/examples/bin/run-druid
+++ b/examples/bin/run-druid
@@ -41,7 +41,18 @@ if [ -z "$JAVA_BIN" ]; then
   >&2 echo "Could not find java - please run $WHEREAMI/verify-java to confirm it is installed."
   exit 1
 fi
+
+LOG_DIR="${DRUID_LOG_DIR:=${WHEREAMI}/log}"
+# Remove possible ending slash
+if [[ $LOG_DIR == */ ]];
+then
+  LOG_DIR=${LOG_DIR%?}
+fi
+if [ ! -d "$LOG_DIR" ]; then mkdir -p $LOG_DIR; fi
+
+echo "Running [$1], logging to [$LOG_DIR/$1.log] if no changes made to log4j2.xml"
+
 cd "$WHEREAMI/.."
-exec "$JAVA_BIN"/java `cat "$CONFDIR"/"$WHATAMI"/jvm.config | xargs` \
+exec "$JAVA_BIN"/java -Ddruid.node.type=$1 "-Ddruid.log.path=$LOG_DIR" `cat "$CONFDIR"/"$WHATAMI"/jvm.config | xargs` \
   -cp "$CONFDIR"/"$WHATAMI":"$CONFDIR"/_common:"$CONFDIR"/_common/hadoop-xml:"$CONFDIR"/../_common:"$CONFDIR"/../_common/hadoop-xml:"$WHEREAMI/../lib/*" \
   `cat "$CONFDIR"/$WHATAMI/main.config | xargs`
diff --git a/examples/bin/run-zk b/examples/bin/run-zk
index 4fd30f6..169e30a 100755
--- a/examples/bin/run-zk
+++ b/examples/bin/run-zk
@@ -41,8 +41,18 @@ if [ -z "$JAVA_BIN" ]; then
   exit 1
 fi
 
+LOG_DIR="${DRUID_LOG_DIR:=${WHEREAMI}/log}"
+# Remove possible ending slash
+if [[ $LOG_DIR == */ ]];
+then
+  LOG_DIR=${LOG_DIR%?}
+fi
+if [ ! -d "$LOG_DIR" ]; then mkdir -p $LOG_DIR; fi
+
+echo "Running [ZooKeeper], logging to [$LOG_DIR/zookeeper.log] if no changes made to log4j2.xml"
+
 cd "$WHEREAMI/.."
-exec "$JAVA_BIN"/java `cat "$CONFDIR"/jvm.config | xargs` \
+exec "$JAVA_BIN"/java "-Ddruid.log.path=$LOG_DIR" `cat "$CONFDIR"/jvm.config | xargs` \
   -cp "$WHEREAMI/../lib/*:$CONFDIR" \
   -Dzookeeper.jmx.log4j.disable=true \
   org.apache.zookeeper.server.quorum.QuorumPeerMain \
diff --git a/examples/bin/supervise b/examples/bin/supervise
index 413d019..5b178f8 100755
--- a/examples/bin/supervise
+++ b/examples/bin/supervise
@@ -237,8 +237,6 @@ while (1) {
       if ($command->{down} < time) {
         my $logfile = sprintf("%s%s", "$svdir/$command->{name}", defined $opt{'svlogd'} ? "" : ".log");
 
-        logit "Running command[" . pretty($command->{name}, 'bold') . "], logging to[$logfile]: $command->{command}";
-
         if (my $pid = fork) {
           $command->{pid} = $pid;
           $command->{logfile} = $logfile;
@@ -260,7 +258,9 @@ while (1) {
 
             open STDOUT, "|svlogd $logfile" or logdie "pipe to svlogd $logfile failed: $!\n";
           } else {
-            open STDOUT, ">>", $logfile or logdie "open $logfile failed: $!\n";
+            # Since the log4j2 is configured to write log to file, which means there's no application log output to the console,
+            # We don't need to redirect the STDOUT of application to a file
+            # open STDOUT, ">>", $logfile or logdie "open $logfile failed: $!\n";
           }
 
           open STDERR, ">&STDOUT" or logdie "redirecting stderr failed: $!\n";
@@ -281,7 +281,7 @@ while (1) {
       logit "Command[" . pretty($command->{name}, 'bold') . "] exited (pid = $pid, " . stringify_exit_status($status) . ")";
       if ($status && !$killed && !$command->{restarting}) {
         # Unexpected exit
-        logit "Command[" . pretty($command->{name}, 'bold') . "] " . pretty("failed", "red") . ", see logfile for more details: $command->{logfile}";
+        logit "Command[" . pretty($command->{name}, 'bold') . "] " . pretty("failed", "red") . ", see its logfile for more details";
       }
       $command->{restarting} = 0;
     } else {
diff --git a/examples/conf/druid/cluster/_common/log4j2.xml b/examples/conf/druid/cluster/_common/log4j2.xml
index 93e7ebd..66dc13d 100644
--- a/examples/conf/druid/cluster/_common/log4j2.xml
+++ b/examples/conf/druid/cluster/_common/log4j2.xml
@@ -19,45 +19,68 @@
 -->
 
 <Configuration status="WARN">
+  <Properties>
+    <!-- to change log directory, set DRUID_LOG_DIR environment variable to your directory before launching Druid -->
+    <Property name="druid.log.path" value="log" />
+  </Properties>
+
   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
       <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
     </Console>
+
+    <!-- Rolling Files-->
+    <RollingRandomAccessFile name="FileAppender"
+                             fileName="${sys:druid.log.path}/${sys:druid.node.type}.log"
+                             filePattern="${sys:druid.log.path}/${sys:druid.node.type}.%d{yyyyMMdd}.log">
+      <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+      <Policies>
+        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
+      </Policies>
+      <DefaultRolloverStrategy>
+        <Delete basePath="${sys:druid.log.path}/" maxDepth="1">
+          <IfFileName glob="*.log" />
+          <IfLastModified age="7d" />
+        </Delete>
+      </DefaultRolloverStrategy>
+    </RollingRandomAccessFile>
+
   </Appenders>
+
   <Loggers>
     <Root level="info">
-      <AppenderRef ref="Console"/>
+      <AppenderRef ref="FileAppender"/>
     </Root>
 
     <!-- Set level="debug" to see stack traces for query errors -->
     <Logger name="org.apache.druid.server.QueryResource" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
     <Logger name="org.apache.druid.server.QueryLifecycle" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" or "trace" to see more Coordinator details (segment balancing, load/drop rules, etc) -->
     <Logger name="org.apache.druid.server.coordinator" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see low-level details about segments and ingestion -->
     <Logger name="org.apache.druid.segment" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see more information about extension initialization -->
     <Logger name="org.apache.druid.initialization" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Quieter logging at startup -->
     <Logger name="org.skife.config" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
     <Logger name="com.sun.jersey.guice" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
   </Loggers>
 </Configuration>
diff --git a/examples/conf/druid/single-server/large/_common/log4j2.xml b/examples/conf/druid/single-server/large/_common/log4j2.xml
index 2f88d04..66dc13d 100644
--- a/examples/conf/druid/single-server/large/_common/log4j2.xml
+++ b/examples/conf/druid/single-server/large/_common/log4j2.xml
@@ -19,42 +19,68 @@
 -->
 
 <Configuration status="WARN">
+  <Properties>
+    <!-- to change log directory, set DRUID_LOG_DIR environment variable to your directory before launching Druid -->
+    <Property name="druid.log.path" value="log" />
+  </Properties>
+
   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
       <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
     </Console>
+
+    <!-- Rolling Files-->
+    <RollingRandomAccessFile name="FileAppender"
+                             fileName="${sys:druid.log.path}/${sys:druid.node.type}.log"
+                             filePattern="${sys:druid.log.path}/${sys:druid.node.type}.%d{yyyyMMdd}.log">
+      <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+      <Policies>
+        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
+      </Policies>
+      <DefaultRolloverStrategy>
+        <Delete basePath="${sys:druid.log.path}/" maxDepth="1">
+          <IfFileName glob="*.log" />
+          <IfLastModified age="7d" />
+        </Delete>
+      </DefaultRolloverStrategy>
+    </RollingRandomAccessFile>
+
   </Appenders>
+
   <Loggers>
     <Root level="info">
-      <AppenderRef ref="Console"/>
+      <AppenderRef ref="FileAppender"/>
     </Root>
 
     <!-- Set level="debug" to see stack traces for query errors -->
+    <Logger name="org.apache.druid.server.QueryResource" level="info" additivity="false">
+      <Appender-ref ref="FileAppender"/>
+    </Logger>
     <Logger name="org.apache.druid.server.QueryLifecycle" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" or "trace" to see more Coordinator details (segment balancing, load/drop rules, etc) -->
     <Logger name="org.apache.druid.server.coordinator" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see low-level details about segments and ingestion -->
     <Logger name="org.apache.druid.segment" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see more information about extension initialization -->
     <Logger name="org.apache.druid.initialization" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Quieter logging at startup -->
     <Logger name="org.skife.config" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
     <Logger name="com.sun.jersey.guice" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
   </Loggers>
 </Configuration>
diff --git a/examples/conf/druid/single-server/medium/_common/log4j2.xml b/examples/conf/druid/single-server/medium/_common/log4j2.xml
index 2f88d04..66dc13d 100644
--- a/examples/conf/druid/single-server/medium/_common/log4j2.xml
+++ b/examples/conf/druid/single-server/medium/_common/log4j2.xml
@@ -19,42 +19,68 @@
 -->
 
 <Configuration status="WARN">
+  <Properties>
+    <!-- to change log directory, set DRUID_LOG_DIR environment variable to your directory before launching Druid -->
+    <Property name="druid.log.path" value="log" />
+  </Properties>
+
   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
       <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
     </Console>
+
+    <!-- Rolling Files-->
+    <RollingRandomAccessFile name="FileAppender"
+                             fileName="${sys:druid.log.path}/${sys:druid.node.type}.log"
+                             filePattern="${sys:druid.log.path}/${sys:druid.node.type}.%d{yyyyMMdd}.log">
+      <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+      <Policies>
+        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
+      </Policies>
+      <DefaultRolloverStrategy>
+        <Delete basePath="${sys:druid.log.path}/" maxDepth="1">
+          <IfFileName glob="*.log" />
+          <IfLastModified age="7d" />
+        </Delete>
+      </DefaultRolloverStrategy>
+    </RollingRandomAccessFile>
+
   </Appenders>
+
   <Loggers>
     <Root level="info">
-      <AppenderRef ref="Console"/>
+      <AppenderRef ref="FileAppender"/>
     </Root>
 
     <!-- Set level="debug" to see stack traces for query errors -->
+    <Logger name="org.apache.druid.server.QueryResource" level="info" additivity="false">
+      <Appender-ref ref="FileAppender"/>
+    </Logger>
     <Logger name="org.apache.druid.server.QueryLifecycle" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" or "trace" to see more Coordinator details (segment balancing, load/drop rules, etc) -->
     <Logger name="org.apache.druid.server.coordinator" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see low-level details about segments and ingestion -->
     <Logger name="org.apache.druid.segment" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see more information about extension initialization -->
     <Logger name="org.apache.druid.initialization" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Quieter logging at startup -->
     <Logger name="org.skife.config" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
     <Logger name="com.sun.jersey.guice" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
   </Loggers>
 </Configuration>
diff --git a/examples/conf/druid/single-server/micro-quickstart/_common/log4j2.xml b/examples/conf/druid/single-server/micro-quickstart/_common/log4j2.xml
index 2f88d04..66dc13d 100644
--- a/examples/conf/druid/single-server/micro-quickstart/_common/log4j2.xml
+++ b/examples/conf/druid/single-server/micro-quickstart/_common/log4j2.xml
@@ -19,42 +19,68 @@
 -->
 
 <Configuration status="WARN">
+  <Properties>
+    <!-- to change log directory, set DRUID_LOG_DIR environment variable to your directory before launching Druid -->
+    <Property name="druid.log.path" value="log" />
+  </Properties>
+
   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
       <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
     </Console>
+
+    <!-- Rolling Files-->
+    <RollingRandomAccessFile name="FileAppender"
+                             fileName="${sys:druid.log.path}/${sys:druid.node.type}.log"
+                             filePattern="${sys:druid.log.path}/${sys:druid.node.type}.%d{yyyyMMdd}.log">
+      <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+      <Policies>
+        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
+      </Policies>
+      <DefaultRolloverStrategy>
+        <Delete basePath="${sys:druid.log.path}/" maxDepth="1">
+          <IfFileName glob="*.log" />
+          <IfLastModified age="7d" />
+        </Delete>
+      </DefaultRolloverStrategy>
+    </RollingRandomAccessFile>
+
   </Appenders>
+
   <Loggers>
     <Root level="info">
-      <AppenderRef ref="Console"/>
+      <AppenderRef ref="FileAppender"/>
     </Root>
 
     <!-- Set level="debug" to see stack traces for query errors -->
+    <Logger name="org.apache.druid.server.QueryResource" level="info" additivity="false">
+      <Appender-ref ref="FileAppender"/>
+    </Logger>
     <Logger name="org.apache.druid.server.QueryLifecycle" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" or "trace" to see more Coordinator details (segment balancing, load/drop rules, etc) -->
     <Logger name="org.apache.druid.server.coordinator" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see low-level details about segments and ingestion -->
     <Logger name="org.apache.druid.segment" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see more information about extension initialization -->
     <Logger name="org.apache.druid.initialization" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Quieter logging at startup -->
     <Logger name="org.skife.config" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
     <Logger name="com.sun.jersey.guice" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
   </Loggers>
 </Configuration>
diff --git a/examples/conf/druid/single-server/nano-quickstart/_common/log4j2.xml b/examples/conf/druid/single-server/nano-quickstart/_common/log4j2.xml
index 2f88d04..66dc13d 100644
--- a/examples/conf/druid/single-server/nano-quickstart/_common/log4j2.xml
+++ b/examples/conf/druid/single-server/nano-quickstart/_common/log4j2.xml
@@ -19,42 +19,68 @@
 -->
 
 <Configuration status="WARN">
+  <Properties>
+    <!-- to change log directory, set DRUID_LOG_DIR environment variable to your directory before launching Druid -->
+    <Property name="druid.log.path" value="log" />
+  </Properties>
+
   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
       <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
     </Console>
+
+    <!-- Rolling Files-->
+    <RollingRandomAccessFile name="FileAppender"
+                             fileName="${sys:druid.log.path}/${sys:druid.node.type}.log"
+                             filePattern="${sys:druid.log.path}/${sys:druid.node.type}.%d{yyyyMMdd}.log">
+      <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+      <Policies>
+        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
+      </Policies>
+      <DefaultRolloverStrategy>
+        <Delete basePath="${sys:druid.log.path}/" maxDepth="1">
+          <IfFileName glob="*.log" />
+          <IfLastModified age="7d" />
+        </Delete>
+      </DefaultRolloverStrategy>
+    </RollingRandomAccessFile>
+
   </Appenders>
+
   <Loggers>
     <Root level="info">
-      <AppenderRef ref="Console"/>
+      <AppenderRef ref="FileAppender"/>
     </Root>
 
     <!-- Set level="debug" to see stack traces for query errors -->
+    <Logger name="org.apache.druid.server.QueryResource" level="info" additivity="false">
+      <Appender-ref ref="FileAppender"/>
+    </Logger>
     <Logger name="org.apache.druid.server.QueryLifecycle" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" or "trace" to see more Coordinator details (segment balancing, load/drop rules, etc) -->
     <Logger name="org.apache.druid.server.coordinator" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see low-level details about segments and ingestion -->
     <Logger name="org.apache.druid.segment" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see more information about extension initialization -->
     <Logger name="org.apache.druid.initialization" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Quieter logging at startup -->
     <Logger name="org.skife.config" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
     <Logger name="com.sun.jersey.guice" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
   </Loggers>
 </Configuration>
diff --git a/examples/conf/druid/single-server/small/_common/log4j2.xml b/examples/conf/druid/single-server/small/_common/log4j2.xml
index 2f88d04..66dc13d 100644
--- a/examples/conf/druid/single-server/small/_common/log4j2.xml
+++ b/examples/conf/druid/single-server/small/_common/log4j2.xml
@@ -19,42 +19,68 @@
 -->
 
 <Configuration status="WARN">
+  <Properties>
+    <!-- to change log directory, set DRUID_LOG_DIR environment variable to your directory before launching Druid -->
+    <Property name="druid.log.path" value="log" />
+  </Properties>
+
   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
       <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
     </Console>
+
+    <!-- Rolling Files-->
+    <RollingRandomAccessFile name="FileAppender"
+                             fileName="${sys:druid.log.path}/${sys:druid.node.type}.log"
+                             filePattern="${sys:druid.log.path}/${sys:druid.node.type}.%d{yyyyMMdd}.log">
+      <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+      <Policies>
+        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
+      </Policies>
+      <DefaultRolloverStrategy>
+        <Delete basePath="${sys:druid.log.path}/" maxDepth="1">
+          <IfFileName glob="*.log" />
+          <IfLastModified age="7d" />
+        </Delete>
+      </DefaultRolloverStrategy>
+    </RollingRandomAccessFile>
+
   </Appenders>
+
   <Loggers>
     <Root level="info">
-      <AppenderRef ref="Console"/>
+      <AppenderRef ref="FileAppender"/>
     </Root>
 
     <!-- Set level="debug" to see stack traces for query errors -->
+    <Logger name="org.apache.druid.server.QueryResource" level="info" additivity="false">
+      <Appender-ref ref="FileAppender"/>
+    </Logger>
     <Logger name="org.apache.druid.server.QueryLifecycle" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" or "trace" to see more Coordinator details (segment balancing, load/drop rules, etc) -->
     <Logger name="org.apache.druid.server.coordinator" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see low-level details about segments and ingestion -->
     <Logger name="org.apache.druid.segment" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see more information about extension initialization -->
     <Logger name="org.apache.druid.initialization" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Quieter logging at startup -->
     <Logger name="org.skife.config" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
     <Logger name="com.sun.jersey.guice" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
   </Loggers>
 </Configuration>
diff --git a/examples/conf/druid/single-server/xlarge/_common/log4j2.xml b/examples/conf/druid/single-server/xlarge/_common/log4j2.xml
index 2f88d04..66dc13d 100644
--- a/examples/conf/druid/single-server/xlarge/_common/log4j2.xml
+++ b/examples/conf/druid/single-server/xlarge/_common/log4j2.xml
@@ -19,42 +19,68 @@
 -->
 
 <Configuration status="WARN">
+  <Properties>
+    <!-- to change log directory, set DRUID_LOG_DIR environment variable to your directory before launching Druid -->
+    <Property name="druid.log.path" value="log" />
+  </Properties>
+
   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
       <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
     </Console>
+
+    <!-- Rolling Files-->
+    <RollingRandomAccessFile name="FileAppender"
+                             fileName="${sys:druid.log.path}/${sys:druid.node.type}.log"
+                             filePattern="${sys:druid.log.path}/${sys:druid.node.type}.%d{yyyyMMdd}.log">
+      <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+      <Policies>
+        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
+      </Policies>
+      <DefaultRolloverStrategy>
+        <Delete basePath="${sys:druid.log.path}/" maxDepth="1">
+          <IfFileName glob="*.log" />
+          <IfLastModified age="7d" />
+        </Delete>
+      </DefaultRolloverStrategy>
+    </RollingRandomAccessFile>
+
   </Appenders>
+
   <Loggers>
     <Root level="info">
-      <AppenderRef ref="Console"/>
+      <AppenderRef ref="FileAppender"/>
     </Root>
 
     <!-- Set level="debug" to see stack traces for query errors -->
+    <Logger name="org.apache.druid.server.QueryResource" level="info" additivity="false">
+      <Appender-ref ref="FileAppender"/>
+    </Logger>
     <Logger name="org.apache.druid.server.QueryLifecycle" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" or "trace" to see more Coordinator details (segment balancing, load/drop rules, etc) -->
     <Logger name="org.apache.druid.server.coordinator" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see low-level details about segments and ingestion -->
     <Logger name="org.apache.druid.segment" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Set level="debug" to see more information about extension initialization -->
     <Logger name="org.apache.druid.initialization" level="info" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
 
     <!-- Quieter logging at startup -->
     <Logger name="org.skife.config" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
     <Logger name="com.sun.jersey.guice" level="warn" additivity="false">
-      <Appender-ref ref="Console"/>
+      <Appender-ref ref="FileAppender"/>
     </Logger>
   </Loggers>
 </Configuration>
diff --git a/examples/conf/zk/log4j2.xml b/examples/conf/zk/log4j2.xml
index 0ad3c40..ada12f3 100644
--- a/examples/conf/zk/log4j2.xml
+++ b/examples/conf/zk/log4j2.xml
@@ -19,14 +19,37 @@
 -->
 
 <Configuration status="WARN">
-  <Appenders>
-    <Console name="Console" target="SYSTEM_OUT">
-      <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
-    </Console>
-  </Appenders>
-  <Loggers>
-    <Root level="info">
-      <AppenderRef ref="Console"/>
-    </Root>
-  </Loggers>
-</Configuration>
+<Properties>
+  <!-- to change log directory, set DRUID_LOG_DIR environment variable to your directory before launching Druid -->
+  <Property name="druid.log.path" value="log" />
+</Properties>
+
+<Appenders>
+  <Console name="Console" target="SYSTEM_OUT">
+    <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+  </Console>
+
+  <!-- Rolling Files-->
+  <RollingRandomAccessFile name="FileAppender"
+                           fileName="${sys:druid.log.path}/zookeeper.log"
+                           filePattern="${sys:druid.log.path}/zookeeper.%d{yyyyMMdd}.log">
+    <PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/>
+    <Policies>
+      <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
+    </Policies>
+    <DefaultRolloverStrategy>
+      <Delete basePath="${sys:druid.log.path}/" maxDepth="1">
+        <IfFileName glob="*.log" />
+        <IfLastModified age="7d" />
+      </Delete>
+    </DefaultRolloverStrategy>
+  </RollingRandomAccessFile>
+
+</Appenders>
+
+<Loggers>
+  <Root level="info">
+    <AppenderRef ref="FileAppender"/>
+  </Root>
+</Loggers>
+</Configuration>
\ No newline at end of file

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org