Samza 使用 SLF4J 進行所有日志記錄。默認情況下,Samza 只依賴于 slf4j-api ,所以您必須將 SLF4J 運行時的依賴關系添加到您的 Samza 軟件包中,以用于任何您希望使用的基礎日志平臺。
該 HELLO-samza 項目展示了如何使用 log4j 與 Samza。要打開 log4j 日志記錄,您只需要確保 slz4j-log4j12 在您的 SamzaContainer 的類路徑中。在 Maven 中,可以通過在Samza 包項目中添加以下依賴關系來實現。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>runtime</scope>
<version>1.6.2</version>
</dependency>
如果您不使用 Maven,請確保 slf4j-log4j12 最終在 Samza 軟件包的 lib 目錄中。
如果 Samza包 的 lib 目錄中存在 log4j.xml,Samza 的 run-class.sh 腳本將自動設置以下設置。
-Dlog4j.configuration=file:$base_dir/lib/log4j.xml
該 run-class.sh 腳本還將設置以下 Java 系統屬性:
-Dsamza.log.dir=$SAMZA_LOG_DIR
該 run-container.sh 還將設置:
-Dsamza.container.id=$SAMZA_CONTAINER_ID -Dsamza.container.name=samza-container-$SAMZA_CONTAINER_ID"
同樣,run-am.sh 設置:
-Dsamza.container.name=samza-application-master
如果您使用基于文件的 appender,這些設置非常有用。例如,當通過配置 log4j.xml 達到一定大小時,您可以使用滾動追加程序分隔日志文件:
<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 作為使用標準輸出的是一個更好的方法。標準的日志文件(見下文)不要滾動,如果用于日志記錄,可能會變得非常大。
當使用滾動文件追加程序時,長時間運行的作業(yè)通常超過最大文件大小和計數。在這種情況下,日志的開始將丟失。由于日志的開頭包括一些最關鍵的信息,如配置,重要的是不要丟失此信息。為了解決這個問題,Samza 除了正常的記錄器之外,還將這些關鍵信息記錄到“啟動記錄器”中。您可以通過在 log4j.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>
有時候,將 Log4J 日志級別從 INFO 更改為在運行時進行調試,以便開發(fā)人員可以為展示不良行為的 Samza 容器啟用更多日志記錄。Samza 提供了一個名為 JmxAppender 的 Log4j 類,它將允許您在運行時動態(tài)修改日志級別。JmxAppender 類位于 samza-log4j 包中,可以通過首先向 samza-log4j 包添加運行時依賴關系來打開它:
<dependency>
<groupId>org.apache.samza</groupId>
<artifactId>samza-log4j</artifactId>
<scope>runtime</scope>
<version>${samza.version}</version>
</dependency>
然后更新您的 log4j.xml 以包含 appender:
<appender name="jmx" class="org.apache.samza.logging.log4j.JmxAppender" />
Samza 提供了一個 StreamAppender 來將日志發(fā)布到特定的系統中。您可以使用 “task.log4j.system” 指定系統名稱,并使用參數 “StreamName” 更改日志流的名稱。此外,我們還有 MDC 密鑰 “containerName”,“jobName” 和 “jobId”,幫助您識別日志源。為了使用這個 appender,只需添加:
<appender name="StreamAppender" class="org.apache.samza.logging.log4j.StreamAppender">
<!-- optional -->
<param name="StreamName" value="EpicStreamName"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%X{containerName} %X{jobName} %X{jobId} %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} [%p] %m%n" />
</layout>
</appender>
和
<appender-ref ref="StreamAppender"/>
到 log4j.xml 并通過指定 config 來定義系統名稱:
task.log4j.system="<system-name>"
記錄器的默認流名稱是使用以下約定生成的,盡管您可以使用 StreamNamelog4j.xml 中的屬性來覆蓋它,如上所示。java "__samza_%s_%s_logs" format (jobName.replaceAll("_", "-"), jobId.replaceAll("_", "-"))
配置 StreamAppender 將使用 logstash 的 Log4J JSON格式 自動對消息進行編碼。Samza 還支持那些喜歡非 JSON 日志記錄事件的插件序列化。這可以與其他流序列化器定義相同的方式進行配置:
serializers.registry.log4j-string.class=org.apache.samza.logging.log4j.serializers.LoggingEventStringSerdeFactory
systems.mock.streams.__samza_jobname_jobid_logs.samza.msg.serde=log4j-string
StreamAppender 將始終將郵件發(fā)送到由容器名稱鍵入的作業(yè)的日志流。
Samza 將 SAMZA_LOG_DIR 在執(zhí)行時查找環(huán)境變量。如果定義了此變量,則所有日志將被寫入此目錄。如果環(huán)境變量為空或未定義,則 Samza 將使用 $base_dir,這是從 Samza 的 run-class.sh 腳本一級的目錄。這個環(huán)境變量也可以在 log4j.xml 文件中引用(見上文)。
Samza 將自動設置以下垃圾回收記錄設置,并將其輸出 $SAMZA_LOG_DIR/gc.log。
-XX:+PrintGCDateStamps -Xloggc:$SAMZA_LOG_DIR/gc.log
在舊版本的 Java 中,無法使用輔助工具,無法根據時間或大小來滾動 GC 日志。這意味著在 Samza 作業(yè)停止運行之前,您的 GC 日志永遠不會被刪除。從 Java 6 Update 34 和 Java 7 Update 2開始,添加了新的GC命令行開關來支持此功能。如果 JVM 支持 GC 日志文件旋轉,Samza 還將設置:
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10241024
當在 YARN 網格上執(zhí)行 Samza 作業(yè)時,$SAMZA_LOG_DIR 環(huán)境變量將指向受保護的目錄,以便只有執(zhí)行 Samza 作業(yè)的用戶才能讀取并寫入,如果 YARN 被安全地配置。
Samza 的ApplicationMaster將所有 STDOUT 和 STDERR 輸出分別管理到 logs / stdout 和 logs / stderr。這些文件永遠不會旋轉。
更多建議: