Repository: samza Updated Branches: refs/heads/master 220cfce5c -> 0cdc31e5d
SAMZA-954: Improving startup logging for Samza Project: http://git-wip-us.apache.org/repos/asf/samza/repo Commit: http://git-wip-us.apache.org/repos/asf/samza/commit/0cdc31e5 Tree: http://git-wip-us.apache.org/repos/asf/samza/tree/0cdc31e5 Diff: http://git-wip-us.apache.org/repos/asf/samza/diff/0cdc31e5 Branch: refs/heads/master Commit: 0cdc31e5d4720b78b6b763b83935bdbeb9f2c912 Parents: 220cfce Author: Jacob Maes <[email protected]> Authored: Mon Aug 1 11:48:17 2016 -0700 Committer: Yi Pan (Data Infrastructure) <[email protected]> Committed: Mon Aug 1 11:48:17 2016 -0700 ---------------------------------------------------------------------- .../documentation/versioned/jobs/logging.md | 18 ++++++++++ .../apache/samza/container/SamzaContainer.scala | 7 ++-- .../org/apache/samza/metrics/JmxServer.scala | 4 +-- .../scala/org/apache/samza/util/Logging.scala | 12 +++++-- samza-test/src/main/resources/log4j.xml | 36 ++++++++++++++------ 5 files changed, 59 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/samza/blob/0cdc31e5/docs/learn/documentation/versioned/jobs/logging.md ---------------------------------------------------------------------- diff --git a/docs/learn/documentation/versioned/jobs/logging.md b/docs/learn/documentation/versioned/jobs/logging.md index 0726d37..6d65984 100644 --- a/docs/learn/documentation/versioned/jobs/logging.md +++ b/docs/learn/documentation/versioned/jobs/logging.md @@ -77,6 +77,24 @@ These settings are very useful if you're using a file-based appender. For exampl Setting up a file-based appender is recommended as a better alternative to using standard out. Standard out log files (see below) don't roll, and can get quite large if used for logging. +#### Startup logger +When using a rolling file appender, it is common for a long-running job to exceed the max file size and count. In such cases, the beginning of the logs will be lost. Since the beginning of the logs include some of the most critical information like configuration, it is important to not lose this information. To address this issue, Samza logs this critical information to a "startup logger" in addition to the normal logger. You can write these log messages to a separate, finite file by including the following snippet in your log4j.xml: + +{% highlight xml %} +<appender name="StartupAppender" class="org.apache.log4j.RollingFileAppender"> + <param name="File" value="${samza.log.dir}/${samza.container.name}-startup.log" /> + <param name="MaxFileSize" value="256MB" /> + <param name="MaxBackupIndex" value="1" /> + <layout class="org.apache.log4j.PatternLayout"> + <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} [%p] %m%n" /> + </layout> +</appender> +<logger name="STARTUP_LOGGER" additivity="false"> + <level value="info" /> + <appender-ref ref="StartupAppender"/> +</logger> +{% endhighlight %} + #### Changing log levels Sometimes it's desirable to change the Log4J log level from `INFO` to `DEBUG` at runtime so that a developer can enable more logging for a Samza container that's exhibiting undesirable behavior. Samza provides a Log4j class called JmxAppender, which will allow you to dynamically modify log levels at runtime. The JmxAppender class is located in the samza-log4j package, and can be turned on by first adding a runtime dependency to the samza-log4j package: http://git-wip-us.apache.org/repos/asf/samza/blob/0cdc31e5/samza-core/src/main/scala/org/apache/samza/container/SamzaContainer.scala ---------------------------------------------------------------------- diff --git a/samza-core/src/main/scala/org/apache/samza/container/SamzaContainer.scala b/samza-core/src/main/scala/org/apache/samza/container/SamzaContainer.scala index a37f353..f786fc0 100644 --- a/samza-core/src/main/scala/org/apache/samza/container/SamzaContainer.scala +++ b/samza-core/src/main/scala/org/apache/samza/container/SamzaContainer.scala @@ -143,9 +143,10 @@ object SamzaContainer extends Logging { val containerPID = Util.getContainerPID info("Setting up Samza container: %s" format containerName) - info("Samza container PID: %s" format containerPID) - info("Using configuration: %s" format config) - info("Using container model: %s" format containerModel) + + startupLog("Samza container PID: %s" format containerPID) + startupLog("Using configuration: %s" format config) + startupLog("Using container model: %s" format containerModel) val registry = new MetricsRegistryMap(containerName) val samzaContainerMetrics = new SamzaContainerMetrics(containerName, registry) http://git-wip-us.apache.org/repos/asf/samza/blob/0cdc31e5/samza-core/src/main/scala/org/apache/samza/metrics/JmxServer.scala ---------------------------------------------------------------------- diff --git a/samza-core/src/main/scala/org/apache/samza/metrics/JmxServer.scala b/samza-core/src/main/scala/org/apache/samza/metrics/JmxServer.scala index ad00ca0..021ca77 100644 --- a/samza-core/src/main/scala/org/apache/samza/metrics/JmxServer.scala +++ b/samza-core/src/main/scala/org/apache/samza/metrics/JmxServer.scala @@ -99,8 +99,8 @@ class JmxServer(requestedPort: Int) extends Logging { } jmxServer.start - info("Started " + toString) - info("If you are tunneling, you might want to try " + toString.replaceAll("localhost", hostname)) + startupLog("Started " + toString) + startupLog("If you are tunneling, you might want to try " + toString.replaceAll("localhost", hostname)) /** * Get RMI registry port http://git-wip-us.apache.org/repos/asf/samza/blob/0cdc31e5/samza-core/src/main/scala/org/apache/samza/util/Logging.scala ---------------------------------------------------------------------- diff --git a/samza-core/src/main/scala/org/apache/samza/util/Logging.scala b/samza-core/src/main/scala/org/apache/samza/util/Logging.scala index 250de1e..9a4ed89 100644 --- a/samza-core/src/main/scala/org/apache/samza/util/Logging.scala +++ b/samza-core/src/main/scala/org/apache/samza/util/Logging.scala @@ -19,13 +19,21 @@ package org.apache.samza.util -import org.slf4j.LoggerFactory -import org.slf4j.MDC +import org.slf4j.{LoggerFactory, MDC} trait Logging { val loggerName = this.getClass.getName lazy val logger = LoggerFactory.getLogger(loggerName) + val startupLoggerName = "STARTUP_LOGGER" + lazy val startupLogger = LoggerFactory.getLogger(startupLoggerName) + + def startupLog(message: => Any): Unit = { + logger.info(message) + startupLogger.info(message) + } + + def trace(message: => Any): Unit = { if (logger.isTraceEnabled()) { logger.trace(message.toString) http://git-wip-us.apache.org/repos/asf/samza/blob/0cdc31e5/samza-test/src/main/resources/log4j.xml ---------------------------------------------------------------------- diff --git a/samza-test/src/main/resources/log4j.xml b/samza-test/src/main/resources/log4j.xml index 29345f3..7b4fb82 100644 --- a/samza-test/src/main/resources/log4j.xml +++ b/samza-test/src/main/resources/log4j.xml @@ -12,13 +12,23 @@ <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> - <appender name="RollingAppender" class="org.apache.log4j.RollingFileAppender"> - <param name="File" value="${samza.log.dir}/${samza.container.name}.log" /> - <param name="DatePattern" value="'.'yyyy-MM-dd" /> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} [%p] %m%n" /> - </layout> - </appender> + <appender name="RollingAppender" class="org.apache.log4j.RollingFileAppender"> + <param name="File" value="${samza.log.dir}/${samza.container.name}.log" /> + <param name="MaxFileSize" value="256MB" /> + <param name="MaxBackupIndex" value="20" /> + <layout class="org.apache.log4j.PatternLayout"> + <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} [%p] %m%n" /> + </layout> + </appender> + + <appender name="StartupAppender" class="org.apache.log4j.RollingFileAppender"> + <param name="File" value="${samza.log.dir}/${samza.container.name}-startup.log" /> + <param name="MaxFileSize" value="256MB" /> + <param name="MaxBackupIndex" value="1" /> + <layout class="org.apache.log4j.PatternLayout"> + <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} [%p] %m%n" /> + </layout> + </appender> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" /> @@ -27,14 +37,18 @@ </layout> </appender> - <logger name="org.apache.hadoop"> - <level value="off"/> - </logger> - <root> <priority value="info" /> <appender-ref ref="console" /> <appender-ref ref="RollingAppender" /> </root> + <logger name="STARTUP_LOGGER" additivity="false"> + <level value="info" /> + <appender-ref ref="StartupAppender"/> + </logger> + + <logger name="org.apache.hadoop"> + <level value="off"/> + </logger> </log4j:configuration>
