除直接在Flink控制臺作業探查頁面查看作業日志外,您還可以將作業日志配置輸出至外部存儲(OSS、SLS或Kafka)后進行查看,并支持配置輸出的日志級別。本文為您介紹如何配置作業日志輸出,配置后您可以在對應存儲中查看作業日志。
注意事項
配置日志到其他存儲后,如果未關閉日志歸檔功能,購買工作空間時配置的OSS仍會持續保存日志。關閉后,Flink控制臺頁面也將無法查看作業日志。
配置日志輸出至OSS、SLS或Kafka后,需要重啟作業。
您可以在日志配置中使用
${secret_values.xxxx}
,引用已經在密鑰托管中設置的變量,詳情請參見變量管理。
配置單個作業日志輸出
進入配置單個作業日志輸出入口。
登錄實時計算管理控制臺。
單擊目標工作空間操作列下的控制臺。
在左側導航欄上,單擊 ,單擊目標作業名稱。
在部署詳情頁簽,單擊日志配置區域右側的編輯。
日志模板選擇為自定義模板。
配置日志輸出信息。
按照存儲對象,將對應配置信息復制粘貼到輸入框中,并修改指定參數取值為您目標存儲信息。如果您還需要配置不同級別的日志分別輸出至不同存儲,可以參見配置不同級別日志分別輸出為Appender配置不同的日志級別過濾規則。
配置到OSS
<?xml version="1.0" encoding="UTF-8"?> <Configuration xmlns="http://logging.apache.org/log4j/2.0/config" strict="true" packages="com.ververica.platform.logging.appender" status="WARN"> <Appenders> <Appender name="StdOut" type="Console"> <Layout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n" type="PatternLayout" charset="UTF-8"/> </Appender> <Appender name="RollingFile" type="RollingFile" fileName="${sys:log.file}" filePattern="${sys:log.file}.%i"> <Layout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n" type="PatternLayout" charset="UTF-8"/> <Policies> <SizeBasedTriggeringPolicy size="20 MB"/> </Policies> <DefaultRolloverStrategy max="4"/> </Appender> <Appender name="OSS" type="OSS"> <Layout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n" type="PatternLayout" charset="UTF-8"/> <!-- The final effective log path is: ${baseUri}/logs/${namespace}/${deploymentId}/{jobId}/ --> <Property name="namespace">{{ namespace }}</Property> <!-- Do not modify this line --> <Property name="baseUri">oss://YOUR-BUCKET-NAME/</Property> <Property name="endpoint">https://YOUR-ENDPOINT</Property> <Property name="accessKeyId">${secret_values.accessKeyId}</Property> <Property name="secretAccessKey">${secret_values.accessKeySecret}</Property> <Property name="flushIntervalSeconds">10</Property> <Property name="flushIntervalEventCount">100</Property> <Property name="rollingBytes">10485760</Property> </Appender> <Appender name="StdOutErrConsoleAppender" type="Console"> <Layout pattern="%m" type="PatternLayout" charset="UTF-8"/> </Appender> <Appender name="StdOutFileAppender" type="RollingFile" fileName="${sys:stdout.file}" filePattern="${sys:stdout.file}.%i"> <Layout pattern="%m" type="PatternLayout" charset="UTF-8"/> <Policies> <SizeBasedTriggeringPolicy size="1 GB"/> </Policies> <DefaultRolloverStrategy max="2"/> </Appender> <Appender name="StdErrFileAppender" type="RollingFile" fileName="${sys:stderr.file}" filePattern="${sys:stderr.file}.%i"> <Layout pattern="%m" type="PatternLayout" charset="UTF-8"/> <Policies> <SizeBasedTriggeringPolicy size="1 GB"/> </Policies> <DefaultRolloverStrategy max="2"/> </Appender> </Appenders> <Loggers> <Logger level="INFO" name="org.apache.hadoop"/> <Logger level="INFO" name="org.apache.kafka"/> <Logger level="INFO" name="org.apache.zookeeper"/> <Logger level="INFO" name="akka"/> <Logger level="ERROR" name="org.jboss.netty.channel.DefaultChannelPipeline"/> <Logger level="OFF" name="org.apache.flink.runtime.rest.handler.job.JobDetailsHandler"/> <Logger level="ERROR" name="org.apache.flink.fs.osshadoop.shaded.com.aliyun.oss"/> <Logger level="INFO" name="StdOutErrRedirector.StdOut" additivity="false"> <AppenderRef ref="StdOutFileAppender"/> <AppenderRef ref="StdOutErrConsoleAppender"/> </Logger> <Logger level="INFO" name="StdOutErrRedirector.StdErr" additivity="false"> <AppenderRef ref="StdErrFileAppender"/> <AppenderRef ref="StdOutErrConsoleAppender"/> </Logger> {%- for name, level in userConfiguredLoggers -%} <Logger level="{{ level }}" name="{{ name }}"/> {%- endfor -%} <Root level="{{ rootLoggerLogLevel }}"> <AppenderRef ref="StdOut"/> <AppenderRef ref="RollingFile"/> <AppenderRef ref="OSS"/> </Root> </Loggers> </Configuration>
參數
說明
YOUR-BUCKET-NAME
替換成您OSS Bucket名稱。
YOUR-ENDPOINT
替換成您OSS的Endpoint,詳情請參見OSS地域和訪問域名。
Endpoint為ECS的VPC網絡訪問(內網) 所在行的Endpoint(地域節點)信息。
YOUR-OSS-ACCESSKEYID
替換成您配置OSS服務賬號的AccessKey ID和AccessKey Secret,獲取方法請參見獲取AccessKey。
為了避免明文AccessKey帶來的安全風險,本示例通過密鑰管理的方式填寫AccessKey取值,詳情請參見變量管理。
說明僅當您配置輸出到與Flink賬號不同賬號下的OSS時,該參數必填。相同賬號時無需填寫,請刪除該參數。
YOUR-OSS-ACCESSKEYSECRET
flushIntervalSeconds
日志同步到存儲中的時間間隔,即間隔多久將日志數據寫入一次,單位是秒。
flushIntervalEventCount
日志同步到存儲中的條數間隔,即獲取多少條日志數據后寫入一次。
說明與flushIntervalSeconds同時配置時,哪個先達到設置值就寫入一次。
rollingBytes
OSS中單個日志的大小。達到最大值后,后續寫入的數據會寫入一個新的日志文件。
配置到SLS
<?xml version="1.0" encoding="UTF-8"?> <Configuration xmlns="http://logging.apache.org/log4j/2.0/config" strict="true" packages="com.ververica.platform.logging.appender" status="WARN"> <Appenders> <Appender name="StdOut" type="Console"> <Layout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n" type="PatternLayout" charset="UTF-8"/> </Appender> <Appender name="RollingFile" type="RollingFile" fileName="${sys:log.file}" filePattern="${sys:log.file}.%i"> <Layout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n" type="PatternLayout" charset="UTF-8"/> <Policies> <SizeBasedTriggeringPolicy size="5 MB"/> </Policies> <DefaultRolloverStrategy max="1"/> </Appender> <Appender name="SLS" type="SLS"> <Layout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n" type="PatternLayout" charset="UTF-8"/> <!-- The final effective log path is: ${baseUri}/logs/${namespace}/${deploymentId}/{jobId}/ --> <Property name="namespace">{{ namespace }}</Property> <!-- Do not modify this line --> <Property name="project">YOUR-SLS-PROJECT</Property> <Property name="logStore">YOUR-SLS-LOGSTORE</Property> <Property name="endpoint">YOUR-SLS-ENDPOINT</Property> <Property name="accessKeyId">${secret_values.accessKeyId}</Property> <Property name="accessKeySecret">${secret_values.accessKeySecret}</Property> <Property name="topic">{{ namespace }}:{{ deploymentId }}:{{ jobId }}</Property> <Property name="deploymentName">{{ deploymentName }}</Property> <Property name="flushIntervalSeconds">10</Property> <Property name="flushIntervalEventCount">100</Property> </Appender> <Appender name="StdOutErrConsoleAppender" type="Console"> <Layout pattern="%m" type="PatternLayout" charset="UTF-8"/> </Appender> <Appender name="StdOutFileAppender" type="RollingFile" fileName="${sys:stdout.file}" filePattern="${sys:stdout.file}.%i"> <Layout pattern="%m" type="PatternLayout" charset="UTF-8"/> <Policies> <SizeBasedTriggeringPolicy size="1 GB"/> </Policies> <DefaultRolloverStrategy max="2"/> </Appender> <Appender name="StdErrFileAppender" type="RollingFile" fileName="${sys:stderr.file}" filePattern="${sys:stderr.file}.%i"> <Layout pattern="%m" type="PatternLayout" charset="UTF-8"/> <Policies> <SizeBasedTriggeringPolicy size="1 GB"/> </Policies> <DefaultRolloverStrategy max="2"/> </Appender> </Appenders> <Loggers> <Logger level="INFO" name="org.apache.hadoop"/> <Logger level="INFO" name="org.apache.kafka"/> <Logger level="INFO" name="org.apache.zookeeper"/> <Logger level="INFO" name="akka"/> <Logger level="ERROR" name="org.jboss.netty.channel.DefaultChannelPipeline"/> <Logger level="OFF" name="org.apache.flink.runtime.rest.handler.job.JobDetailsHandler"/> <Logger level="ERROR" name="org.apache.flink.fs.osshadoop.shaded.com.aliyun.oss"/> <Logger level="INFO" name="StdOutErrRedirector.StdOut" additivity="false"> <AppenderRef ref="StdOutFileAppender"/> <AppenderRef ref="StdOutErrConsoleAppender"/> </Logger> <Logger level="INFO" name="StdOutErrRedirector.StdErr" additivity="false"> <AppenderRef ref="StdErrFileAppender"/> <AppenderRef ref="StdOutErrConsoleAppender"/> </Logger> {%- for name, level in userConfiguredLoggers -%} <Logger level="{{ level }}" name="{{ name }}"/> {%- endfor -%} <Root level="{{ rootLoggerLogLevel }}"> <AppenderRef ref="StdOut"/> <AppenderRef ref="RollingFile"/> <AppenderRef ref="SLS"/> </Root> </Loggers> </Configuration>
說明代碼中的namespace、deploymentId、jobId、deploymentName為Twig變量,您無需修改,修改后會導致作業啟動時報錯。
參數
說明
YOUR-SLS-PROJECT
替換成您SLS的Project名稱。
YOUR-SLS-LOGSTORE
替換成您SLS的Logstore名稱。
YOUR-SLS-ENDPOINT
替換成您SLS所在地域的私網Endpoint,詳情請參見服務入口。
YOUR-SLS-ACCESSKEYID
替換成您配置SLS服務賬號的AccessKey ID和AccessKey Secret,獲取方法請參見獲取AccessKey。
為了避免明文AccessKey帶來的安全風險,本示例通過密鑰管理的方式填寫AccessKey取值,詳情請參見變量管理。
說明如果您配置的SLS和Flink服務不在同一賬號時,需要給SLS服務賬號配置Flink賬號可以寫入SLS的權限,具體操作詳情請參見創建自定義權限策略,具體的策略內容信息如下:
不限制SLS范圍
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "log:Get*", "log:PostLogStoreLogs" ], "Resource": "*" } ] }
指定SLS資源范圍,示例如下。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "log:PostLogStoreLogs", "log:GetLogStore" ], "Resource": "acs:log:cn-beijing:152940222687****:project/test-vvp-sls/logstore/test-ltest" } ] }
YOUR-SLS-ACCESSKEYSECRET
flushIntervalSeconds
日志同步到存儲中的時間間隔,即間隔多久將日志數據寫入一次,單位是秒。
flushIntervalEventCount
日志同步到存儲中的條數間隔,即獲取多少條日志數據后寫入一次。
說明與flushIntervalSeconds同時配置時,哪個先達到設置值就寫入一次。
配置到Kafka
說明暫不支持開啟Kerberos認證的Kafka集群。
前提條件
實時計算提供的KafkaAppender日志插件是通過Flink的插件類加載器加載,使用前需要顯示指定KafkaAppender日志插件所在的包路徑,使得Flink應用可以成功加載到該插件。具體的操作方式如下:
配置作業模板(對該項目空間下所有作業生效)
在Flink開發控制臺配置管理頁面的其他配置中,添加如下代碼。
plugin.classloader.parent-first-patterns.additional: com.ververica.platform.logging.appender
配置單個作業(僅對當前作業生效)
在作業運維頁面,單擊目標作業名稱,在部署詳情頁簽的運行參數配置區域的其他配置中,添加如下代碼。
plugin.classloader.parent-first-patterns.additional: com.ververica.platform.logging.appender
日志配置
<?xml version="1.0" encoding="UTF-8"?> <Configuration xmlns="http://logging.apache.org/log4j/2.0/config" strict="true" packages="com.ververica.platform.logging.appender" status="WARN"> <Appenders> <Appender name="StdOut" type="Console"> <Layout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n" type="PatternLayout"/> </Appender> <Appender name="RollingFile" type="RollingFile" fileName="${sys:log.file}" filePattern="${sys:log.file}.%i"> <Layout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n" type="PatternLayout"/> <Policies> <SizeBasedTriggeringPolicy size="20 MB"/> </Policies> <DefaultRolloverStrategy max="4"/> </Appender> <Appender type="KafkaVVP" name="KafkaVVPAppender" topic="YOUR-TOPIC-NAME"> <Layout type="PatternLayout" pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n"/> <Property name="bootstrap.servers">YOUR-KAFKA-BOOTSTRAP-SERVERS</Property> <Property name="acks">YOUR-ACKS-VALUE</Property> <Property name="buffer.memory">YOUR-BUFFER-MEMORY-SIZE</Property> <Property name="retries">YOUR-RETRIES-NUMBER</Property> <Property name="compression.type">YOUR-COMPRESSION-TYPE</Property> </Appender> <Appender type="Async" name="AsyncAppender"> <AppenderRef ref="KafkaVVPAppender"/> </Appender> </Appenders> <Loggers> <Logger level="INFO" name="org.apache.hadoop"/> <Logger level="INFO" name="org.apache.kafka"/> <Logger level="INFO" name="org.apache.zookeeper"/> <Logger level="INFO" name="akka"/> <Logger level="ERROR" name="org.jboss.netty.channel.DefaultChannelPipeline"/> <Logger level="OFF" name="org.apache.flink.runtime.rest.handler.job.JobDetailsHandler"/> {%- for name, level in userConfiguredLoggers -%} <Logger level="{{ level }}" name="{{ name }}"/> {%- endfor -%} <Root level="{{ rootLoggerLogLevel }}"> <AppenderRef ref="StdOut"/> <AppenderRef ref="RollingFile"/> <AppenderRef ref="AsyncAppender"/> </Root> </Loggers> </Configuration>
參數
說明
YOUR-TOPIC-NAME
寫入的Kafka Topic名稱。
YOUR-KAFKA-BOOTSTRAP-SERVERS
寫入的Kafka Broker地址。
YOUR-ACKS-VALUE
指定了必須有多少個分區副本收到消息,Producer才會認為消息寫入是成功的。具體取值請參見acks。
YOUR-BUFFER-MEMORY-SIZE
Producer緩沖區大小。單位Byte。
YOUR-RETRIES-NUMBER
發送失敗的重試次數。
YOUR-COMPRESSION-TYPE
Producer生成數據時可使用的壓縮類型,包括none、gzip、snappy、lz4或zstd。
說明您還可以設置所有Apache Kafka client支持的配置參數,詳情請參見Apache Kafka。
單擊保存。
單擊頁面頂部的啟動。
配置項目空間下所有作業日志輸出
您可以通過配置模板的方式,配置項目空間下所有作業日志默認輸出到OSS、SLS或Kafka。
配置后,后續該項目空間下創建的所有作業的日志都會被存儲到OSS、SLS或Kafka。
進入到作業日志模板配置入口。
登錄實時計算控制臺。
單擊目標工作空間操作列下的控制臺,在實時計算開發控制臺頁面頂部選擇目標項目空間。
在左側導航欄,單擊
。在作業默認配置頁簽,選擇作業類型。
在日志配置區域,日志模板選擇為自定義模板。
參考配置單個作業日志輸出,配置項目空間下所有作業的日志輸出信息。
單擊保存更改。
配置不同級別日志分別輸出
您可以通過使用log4j2的ThresholdFilter
來為不同的Appender配置不同的日志級別過濾規則。配置的優勢有:
靈活性:可以根據需要為不同的(外部)存儲設置不同的日志級別。
效率:減少不必要的日志處理和傳輸,提高系統性能。
清晰性:通過分開配置,使得日志的流向更清晰,級別管理更方便。
配置方法如下:
在日志配置區域,日志模板選擇為自定義模板。
配置日志輸出信息。
本文以實現實時計算開發控制臺(Console)輸出INFO級別以上日志,而日志服務(SLS)僅輸出ERROR級別以上日志為例,配置示例如下。
<?xml version="1.0" encoding="UTF-8"?> <Configuration xmlns="http://logging.apache.org/log4j/2.0/config" strict="true" status="WARN"> <Appenders> <!-- Console Appender configured to output only INFO level logs --> <Appender name="StdOut" type="Console"> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> <Layout type="PatternLayout" pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n" charset="UTF-8"/> </Appender> <!-- RollingFile Appender (no filter shown, logs all levels due to Root level being INFO) --> <Appender name="RollingFile" type="RollingFile"> <!-- Configuration remains unchanged --> <!-- ... --> </Appender> <!-- SLS Appender configured to output only ERROR level and above logs --> <Appender name="SLS" type="SLS"> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <Layout type="PatternLayout" pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+8} %-5p %-60c %x - %m%n" charset="UTF-8"/> <!-- SLS specific properties --> <Property name="namespace">YOUR_NAMESPACE</Property> <Property name="project">YOUR_SLS_PROJECT</Property> <Property name="logStore">YOUR_SLS_LOGSTORE</Property> <Property name="endpoint">YOUR_SLS_ENDPOINT</Property> <!-- Access credentials and other properties --> <!-- ... --> </Appender> <!-- Other Appenders definitions remain unchanged --> <!-- ... --> </Appenders> <Loggers> <!-- Directly configure loggers for StdOut and SLS with specific levels --> <Logger name="StdOutLogger" level="INFO" additivity="false"> <AppenderRef ref="StdOut"/> </Logger> <Logger name="SLSLogger" level="ERROR" additivity="false"> <AppenderRef ref="SLS"/> </Logger> <!-- Other Loggers definitions with their specific configurations --> <!-- ... --> <!-- Root Logger without specific AppenderRef for SLS and StdOut, to avoid duplicate logging --> <Root level="INFO"> <AppenderRef ref="StdOut"/> <AppenderRef ref="RollingFile"/> <!-- Exclude SLS from Root to prevent duplicate logging in case of other loggers --> </Root> </Loggers> </Configuration>
在這個配置中:
Console Appender:使用了一個ThresholdFilter來確保INFO級別及以上的日志會被輸出到實時計算開發控制臺。
SLS Appender:使用了一個ThresholdFilter來確保只有ERROR級別及以上的日志會被發送到SLS。SLS Appender中的具體屬性請參見配置到SLS,
YOUR_NAMESPACE
、YOUR_SLS_PROJECT
等需要替換為實際的SLS項目信息。說明如果SLS Appender類型不是SLS,而是一個自定義的Appender,請確保使用正確的類型,并且Appender類已經具備了連接到SLS所需的邏輯。
StdOutLogger和SLSLogger:它們分別只向StdOut Appender和SLS Appender發送日志,并且各自具有不同的日志級別限制。
Root Logger:配置了StdOut Appender和RollingFile Appender,但不包括SLS Appender。這是為了避免在已經有特定Logger配置的情況下,重復將日志發送到SLS。
更多操作以及log4j配置參數,詳情請參見Apache Log4j。
相關文檔
查看作業日志,詳情請參見查看啟動和運行日志。
在作業啟動或者運行異常時,您可以查看運行異常日志,詳情請參見查看運行異常日志。
當INFO級別的日志無法滿足您定位問題的需求時,您可以修改打印日志的級別為DEBUG,詳情請參見修改運行作業日志級別。
您可以通過操作審計(ActionTrail)產品查看Flink審計事件,詳情請參見查看Flink審計事件。