Samza 記錄

2018-08-22 18:05 更新

Samza 使用 SLF4J 進(jìn)行所有日志記錄。默認(rèn)情況下,Samza 只依賴(lài)于 slf4j-api ,所以您必須將 SLF4J 運(yùn)行時(shí)的依賴(lài)關(guān)系添加到您的 Samza 軟件包中,以用于任何您希望使用的基礎(chǔ)日志平臺(tái)。

Log4j

該 HELLO-samza 項(xiàng)目展示了如何使用 log4j 與 Samza。要打開(kāi) log4j 日志記錄,您只需要確保 slz4j-log4j12 在您的 SamzaContainer 的類(lèi)路徑中。在 Maven 中,可以通過(guò)在Samza 包項(xiàng)目中添加以下依賴(lài)關(guān)系來(lái)實(shí)現(xiàn)。

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <scope>runtime</scope>
  <version>1.6.2</version>
</dependency>

如果您不使用 Maven,請(qǐng)確保 slf4j-log4j12 最終在 Samza 軟件包的 lib 目錄中。

Log4j配置

如果 Samza包 的 lib 目錄中存在 log4j.xml,Samza 的 run-class.sh 腳本將自動(dòng)設(shè)置以下設(shè)置。

-Dlog4j.configuration=file:$base_dir/lib/log4j.xml

該 run-class.sh 腳本還將設(shè)置以下 Java 系統(tǒng)屬性:

-Dsamza.log.dir=$SAMZA_LOG_DIR

該 run-container.sh 還將設(shè)置:

-Dsamza.container.id=$SAMZA_CONTAINER_ID -Dsamza.container.name=samza-container-$SAMZA_CONTAINER_ID"

同樣,run-am.sh 設(shè)置:

-Dsamza.container.name=samza-application-master

如果您使用基于文件的 appender,這些設(shè)置非常有用。例如,當(dāng)通過(guò)配置 log4j.xml 達(dá)到一定大小時(shí),您可以使用滾動(dòng)追加程序分隔日志文件:

<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 作為使用標(biāo)準(zhǔn)輸出的是一個(gè)更好的方法。標(biāo)準(zhǔn)的日志文件(見(jiàn)下文)不要滾動(dòng),如果用于日志記錄,可能會(huì)變得非常大。

啟動(dòng)記錄器

當(dāng)使用滾動(dòng)文件追加程序時(shí),長(zhǎng)時(shí)間運(yùn)行的作業(yè)通常超過(guò)最大文件大小和計(jì)數(shù)。在這種情況下,日志的開(kāi)始將丟失。由于日志的開(kāi)頭包括一些最關(guān)鍵的信息,如配置,重要的是不要丟失此信息。為了解決這個(gè)問(wèn)題,Samza 除了正常的記錄器之外,還將這些關(guān)鍵信息記錄到“啟動(dòng)記錄器”中。您可以通過(guò)在 log4j.xml 中包含以下代碼段將這些日志消息寫(xiě)入單獨(dú)的有限文件:

<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>

更改日志級(jí)別

有時(shí)候,將 Log4J 日志級(jí)別從 INFO 更改為在運(yùn)行時(shí)進(jìn)行調(diào)試,以便開(kāi)發(fā)人員可以為展示不良行為的 Samza 容器啟用更多日志記錄。Samza 提供了一個(gè)名為 JmxAppender 的 Log4j 類(lèi),它將允許您在運(yùn)行時(shí)動(dòng)態(tài)修改日志級(jí)別。JmxAppender 類(lèi)位于 samza-log4j 包中,可以通過(guò)首先向 samza-log4j 包添加運(yùn)行時(shí)依賴(lài)關(guān)系來(lái)打開(kāi)它:

<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" />

流Log4j Appender

Samza 提供了一個(gè) StreamAppender 來(lái)將日志發(fā)布到特定的系統(tǒng)中。您可以使用 “task.log4j.system” 指定系統(tǒng)名稱(chēng),并使用參數(shù) “StreamName” 更改日志流的名稱(chēng)。此外,我們還有 MDC 密鑰 “containerName”,“jobName” 和 “jobId”,幫助您識(shí)別日志源。為了使用這個(gè) 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 并通過(guò)指定 config 來(lái)定義系統(tǒng)名稱(chēng):

task.log4j.system="<system-name>"

記錄器的默認(rèn)流名稱(chēng)是使用以下約定生成的,盡管您可以使用 StreamNamelog4j.xml 中的屬性來(lái)覆蓋它,如上所示。java "__samza_%s_%s_logs" format (jobName.replaceAll("_", "-"), jobId.replaceAll("_", "-"))

配置 StreamAppender 將使用 logstash 的 Log4J JSON格式 自動(dòng)對(duì)消息進(jìn)行編碼。Samza 還支持那些喜歡非 JSON 日志記錄事件的插件序列化。這可以與其他流序列化器定義相同的方式進(jìn)行配置:

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ā)送到由容器名稱(chēng)鍵入的作業(yè)的日志流。

日志目錄

Samza 將 SAMZA_LOG_DIR 在執(zhí)行時(shí)查找環(huán)境變量。如果定義了此變量,則所有日志將被寫(xiě)入此目錄。如果環(huán)境變量為空或未定義,則 Samza 將使用 $base_dir,這是從 Samza 的 run-class.sh 腳本一級(jí)的目錄。這個(gè)環(huán)境變量也可以在 log4j.xml 文件中引用(見(jiàn)上文)。

垃圾收集記錄

Samza 將自動(dòng)設(shè)置以下垃圾回收記錄設(shè)置,并將其輸出 $SAMZA_LOG_DIR/gc.log。

-XX:+PrintGCDateStamps -Xloggc:$SAMZA_LOG_DIR/gc.log

回轉(zhuǎn)

在舊版本的 Java 中,無(wú)法使用輔助工具,無(wú)法根據(jù)時(shí)間或大小來(lái)滾動(dòng) GC 日志。這意味著在 Samza 作業(yè)停止運(yùn)行之前,您的 GC 日志永遠(yuǎn)不會(huì)被刪除。從 Java 6 Update 34 和 Java 7 Update 2開(kāi)始,添加了新的GC命令行開(kāi)關(guān)來(lái)支持此功能。如果 JVM 支持 GC 日志文件旋轉(zhuǎn),Samza 還將設(shè)置:

-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10241024

YARN

當(dāng)在 YARN 網(wǎng)格上執(zhí)行 Samza 作業(yè)時(shí),$SAMZA_LOG_DIR 環(huán)境變量將指向受保護(hù)的目錄,以便只有執(zhí)行 Samza 作業(yè)的用戶才能讀取并寫(xiě)入,如果 YARN 被安全地配置。

STDOUT

Samza 的ApplicationMaster將所有 STDOUT 和 STDERR 輸出分別管理到 logs / stdout 和 logs / stderr。這些文件永遠(yuǎn)不會(huì)旋轉(zhuǎn)。

再處理  ?

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)