Samza 记录
Samza 使用 SLF4J 进行所有日志记录。默认情况下,Samza 只依赖于 slf4j-api ,所以您必须将 SLF4J 运行时的依赖关系添加到您的 Samza 软件包中,以用于任何您希望使用的基础日志平台。
Log4j
该 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 目录中。
Log4j配置
如果 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 作为使用标准输出的是一个更好的方法。标准的日志文件(见下文)不要滚动,如果用于日志记录,可能会变得非常大。
启动记录器
当使用滚动文件追加程序时,长时间运行的作业通常超过最大文件大小和计数。在这种情况下,日志的开始将丢失。由于日志的开头包括一些最关键的信息,如配置,重要的是不要丢失此信息。为了解决这个问题,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 更改为在运行时进行调试,以便开发人员可以为展示不良行为的 Samza 容器启用更多日志记录。Samza 提供了一个名为 JmxAppender 的 Log4j 类,它将允许您在运行时动态修改日志级别。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" />
流Log4j Appender
Samza 提供了一个 StreamAppender 来将日志发布到特定的系统中。您可以使用 “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 将始终将邮件发送到由容器名称键入的作业的日志流。
日志目录
Samza 将 SAMZA_LOG_DIR 在执行时查找环境变量。如果定义了此变量,则所有日志将被写入此目录。如果环境变量为空或未定义,则 Samza 将使用 $base_dir,这是从 Samza 的 run-class.sh 脚本一级的目录。这个环境变量也可以在 log4j.xml 文件中引用(见上文)。
垃圾收集记录
Samza 将自动设置以下垃圾回收记录设置,并将其输出 $SAMZA_LOG_DIR/gc.log。
-XX:+PrintGCDateStamps -Xloggc:$SAMZA_LOG_DIR/gc.log
回转
在旧版本的 Java 中,无法使用辅助工具,无法根据时间或大小来滚动 GC 日志。这意味着在 Samza 作业停止运行之前,您的 GC 日志永远不会被删除。从 Java 6 Update 34 和 Java 7 Update 2开始,添加了新的GC命令行开关来支持此功能。如果 JVM 支持 GC 日志文件旋转,Samza 还将设置:
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10241024
YARN
当在 YARN 网格上执行 Samza 作业时,$SAMZA_LOG_DIR 环境变量将指向受保护的目录,以便只有执行 Samza 作业的用户才能读取并写入,如果 YARN 被安全地配置。
STDOUT
Samza 的ApplicationMaster将所有 STDOUT 和 STDERR 输出分别管理到 logs / stdout 和 logs / stderr。这些文件永远不会旋转。
更多建议: