排查 Flink 日志輸出文件不正確

Flink 默認日志框架

flink 官網(wǎng) 直接下載二進制 Flink tar 包煌张,解壓縮之后膘盖,查看 conf 目錄和 lib 目錄結構。
conf 目錄結構如下:

-rwxr-xr-x@  1 zhangguanghui  staff  2138 12 11 20:39 log4j-cli.properties
-rwxr-xr-x@  1 zhangguanghui  staff  1884 12 11 20:39 log4j-console.properties
-rwxr-xr-x@  1 zhangguanghui  staff  1709 12 11 20:39 log4j-yarn-session.properties
-rwxr-xr-x@  1 zhangguanghui  staff  1939 12 11 20:39 log4j.properties
-rwxr-xr-x@  1 zhangguanghui  staff  2294 12 11 20:39 logback-console.xml
-rwxr-xr-x@  1 zhangguanghui  staff  1550 12 11 20:39 logback-yarn.xml
-rwxr-xr-x@  1 zhangguanghui  staff  2331 12 11 20:39 logback.xml

lib 目錄結構如下:

-rwxr-xr-x@  1 zhangguanghui  staff  93195847 12 15 11:31 flink-dist_2.11-1.7.1.jar
-rwxr-xr-x@  1 zhangguanghui  staff    141914 12 15 11:28 flink-python_2.11-1.7.1.jar
-rwxr-xr-x@  1 zhangguanghui  staff  36059569 12 15 10:58 flink-shaded-hadoop2-uber-1.7.1.jar
-rwxr-xr-x@  1 zhangguanghui  staff    489884  3  1  2018 log4j-1.2.17.jar
-rwxr-xr-x@  1 zhangguanghui  staff      9931 12 13 18:17 slf4j-log4j12-1.7.15.jar

從 conf 中可以看出妇斤,flink 提供了兩種日志框架配置文件茎截,分別是 logback 和 log4j;但是通過 lib 下面的 log4j + slf4j-log4j12 可以看出油狂,flink 默認提供的是 sfl4j + slf4j-log4j12 + log4j 日志框架組合历恐。

slf4j 基礎概念

slf4j 默認提供一組易用的打日志 API,用戶可以通過 slf4j 和 slf4j 橋接器將日志傳遞給具體日志框架专筷,例如 logback, log4j, log4j2弱贼,以下就是多種 slf4j 橋接器。


slf4j 橋接器

那么問題就來了磷蛹,如果 JVM classpath 中包含多個橋接器和日志框架的話吮旅,slf4j 該如何選擇?

slf4j 如何選擇橋接器

要想知道 slf4j 選擇了哪個橋接器味咳,第一是要找到 slf4j 的橋接日志庇勃。如果是 flink on yarn 的話,橋接器日志在 taskmanager.err 日志中槽驶。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data00/yarn/nmdata/usercache/tiger/appcache/application_1546484418433_5098/filecache/12/device_report_flink-1.0.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data08/yarn/nmdata/filecache/125/lib/slf4j-log4j12-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data00/tiger/yarn_deploy/hadoop-2.6.0-cdh5.4.4/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

從日志中责嚷,我們看到 slf4j 找到了多個橋接器實現(xiàn)類,但是最終選擇了 logback掂铐。一旦 slf4j 確認了橋接器之后罕拂,就會繼續(xù)尋找對應的配置文件來初始化 Logger 框架,即 logback.xml 或者 log4j.properties全陨。
如果 slf4j 選擇的是 logback爆班,而你沒有相應的 logback.xml 配置文件的話,則 logback 將采用默認方式辱姨,將日志輸出到 stdout柿菩。
如果 sfl4j 選擇的是 log4j.properites,而你沒有相應的 log4j.properties 而配置文件的話雨涛,則 log4j 將采用默認方式枢舶,將日志輸出到 stdout 中。
總結镜悉,一般出問題在兩點

  • 用戶誤將 logback-classic + logback-core 打進 user jar 中祟辟,使得 flink slf4j 橋接到 logback,但是卻并為提供正確的 logback.xml侣肄。
    -用戶自己代碼中的 resources 目錄中旧困,誤將 debug 的 log4j.properties 文件帶入,覆蓋了 conf 下面的 log4j.properties,導致 log4j 初始化不符合預期吼具。

如何徹底解決問題

假如我們使用 slf4j + slf4j-log4j12+log4j 作為 flink 的日志框架僚纷,配置文件采用 conf/log4j.properties。
則用戶 pom.xml 文件中的 maven shard plugin 應該如下配置

<!-- Change the value of <mainClass>...</mainClass> if your program entry point changes. -->
 <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.0.0</version>
  <executions>
   <!-- Run shade goal on package phase -->
   <execution>
    <phase>package</phase>
    <goals>
     <goal>shade</goal>
    </goals>
    <configuration>
     <artifactSet>
      <excludes>
       <exclude>org.slf4j:*</exclude>
       <exclude>log4j:*</exclude>
       <exclude>ch.qos.logback:*</exclude>
      </excludes>
     </artifactSet>
     <filters>
      <filter>
      <artifact>*:*</artifact>
       <excludes>
        <exclude>log4j.properties</exclude>
       </excludes>
      </filter>
     </filters>
     <transformers>
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
       <mainClass>com.bytedance.data.StreamingJob</mainClass>
      </transformer>
     </transformers>
    </configuration>
   </execution>
  </executions>
 </plugin>
</plugins>

其中

       <exclude>ch.qos.logback:*</exclude>

將用戶端 logback 對應 jar 包移除拗盒。

<exclude>log4j.properties</exclude>

將用戶端的 log4j.properties 移除

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末怖竭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子陡蝇,更是在濱河造成了極大的恐慌痊臭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件登夫,死亡現(xiàn)場離奇詭異广匙,居然都是意外死亡,警方通過查閱死者的電腦和手機恼策,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門鸦致,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涣楷,你說我怎么就攤上這事分唾。” “怎么了狮斗?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵绽乔,是天一觀的道長。 經(jīng)常有香客問我情龄,道長迄汛,這世上最難降的妖魔是什么捍壤? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任骤视,我火速辦了婚禮,結果婚禮上鹃觉,老公的妹妹穿的比我還像新娘专酗。我一直安慰自己,他們只是感情好盗扇,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布祷肯。 她就那樣靜靜地躺著,像睡著了一般疗隶。 火紅的嫁衣襯著肌膚如雪佑笋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天斑鼻,我揣著相機與錄音蒋纬,去河邊找鬼。 笑死,一個胖子當著我的面吹牛蜀备,可吹牛的內容都是我干的关摇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碾阁,長吁一口氣:“原來是場噩夢啊……” “哼输虱!你這毒婦竟也來了?” 一聲冷哼從身側響起脂凶,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宪睹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蚕钦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體横堡,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年冠桃,在試婚紗的時候發(fā)現(xiàn)自己被綠了命贴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡食听,死狀恐怖胸蛛,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情樱报,我是刑警寧澤葬项,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站迹蛤,受9級特大地震影響民珍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜盗飒,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一嚷量、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逆趣,春花似錦蝶溶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痕囱,卻和暖如春田轧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鞍恢。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工傻粘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巷查,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓抹腿,卻偏偏與公主長得像岛请,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子警绩,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容