1. 程式人生 > >Docker中java logback 專案 向 EFK 寫入日誌

Docker中java logback 專案 向 EFK 寫入日誌

繼續上篇文章java logback 向 EFK 寫入日誌, 此篇文章主要講述在docker環境下EFK與logback的整合,主要解決java專案在docker環境下,向EFK輸出日誌的問題:

  1. 上篇文章中的方法雖然可以向EFK寫入日誌,但是在叢集環境中,無法區分容器,除非自己在日誌的msg中寫入相關資訊,然而往往會被分詞器分開,這點比較麻煩
  2. 雖然上篇文章中的logback-more-appenders可以使用DataFluentAppender方式來向elasticsearch新增額外的fields,但是這裡也同時存在一個問題,就是msg中的部分資訊,會被拆分成多個field,導致msg資訊不再完整,以及從kibana上面檢視日誌非常不便

下面來一起看看我是如何解決的(部分內容跟上篇文章同)

部署一套EFK

打包日誌外掛(此處有不同)

原始碼地址:fluentd-logback-appender(此外掛是我基於logback-more-appenders原始碼進行的改進,使得在使用FluentLogbackAppender類的時候,也可以新增額外的fields)

關於此外掛的打包,這裡不多做說明,相應jar包可以在劉迎光的nexus中找到,搜尋“fluentd-logback-appender”即可

專案引用

pom.xml檔案新增依賴

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.firewarm</groupId> <artifactId>testLogback4Fluentd</artifactId> <packaging>
war</packaging> <version>0.0.1-SNAPSHOT</version> <name>testLogback4Fluentd Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <jetty.version>8.1.10.v20130312</jetty.version> <fluentd.logger.version>0.3.2</fluentd.logger.version> </properties> <dependencies> <!-- logback 配置 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.7</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.7</version> </dependency> <dependency> <groupId>com.firewarm</groupId> <artifactId>fluentd-logback-appender</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.fluentd</groupId> <artifactId>fluent-logger</artifactId> <version>${fluentd.logger.version}</version> <optional>true</optional> </dependency> <!-- logback 配置, end --> </dependencies> <build> <finalName>testLogback4Fluentd</finalName> </build> </project>

配置logback-test.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<appender name="FLUENT_TEXT"
		class="com.firewarm.fluentd_logback_appender.FluentLogbackAppender">
		<!-- Tag for Fluentd. Farther information: http://docs.fluentd.org/articles/config-file -->
		<tag>${app.name}</tag>
		<!-- [Optional] Label for Fluentd. Farther information: http://docs.fluentd.org/articles/config-file -->
		<label>logback</label>
		<!-- Host name/address and port number which Flentd placed -->
		<remoteHost>${fluentd_host}</remoteHost>
		<port>${fluentd_port}</port><!-- ${fluentd_port} -->
		<!-- Max queue size of logs which is waiting to be sent (When it reach 
			to the max size, the log will be disappeared). -->
		<maxQueueSize>999</maxQueueSize>

		<additionalField>
			<key>container_id</key>
			<value>${hostname}</value>
		</additionalField>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<pattern>%date [%thread] %-5level %logger{80}- %msg%n</pattern>
			<!-- <pattern><![CDATA[%date{HH:mm:ss.SSS} [%thread] %-5level %logger{15}#%line %msg]]></pattern> -->
		</layout>
	</appender>

	<logger name="com.firewarm" level="trace">
		<appender-ref ref="FLUENT_TEXT" />
	</logger>
	<root level="trace">
		<appender-ref ref="trace" />
	</root>
</configuration>

這裡有話說:

  1. 為了方便使用,這裡的app.name、fluentd_host、fluentd_port、hostname全以環境變數方式配置(這裡不多講了,我在windows中配置了環境變數,做測試)
  2. 這裡的hostname在docker應用中,如果沒有指定hostname的情況下(並且也沒必要指定,因為在實現scale的時候,這個hostname指定就沒有什麼實際意義了),預設是container_id

實測結果

這裡就拿寫入錯誤棧來看

# 源json串

{
  "_index": "testlogback-2016.10.25",
  "_type": "fluentd",
  "_id": "AVbuZYUTOf1yFl8aApQh",
  "_score": null,
  "_source": {
    "msg": "2016-10-25 09:51:12,090 [main] ERROR com.firewarm.test.TestLog- -->> Exception\r\njava.lang.NullPointerException: null\r\n\tat com.firewarm.test.TestLog.log(TestLog.java:23)\r\n\tat com.firewarm.test.TestLog.main(TestLog.java:16)\r\n",
    "container_id": "testLog1",
    "@timestamp": "2016-10-25T09:51:12+08:00"
  },
  "fields": {
    "@timestamp": [
      1477360272000
    ]
  },
  "sort": [
    1477360272000
  ]
}

顯示結果如圖所示(我們想要的都有了) image

在kibana的搜尋中,只需要填寫“container_id:testLog1”,即可搜尋到相關的日誌了

如此,即完成了測試

相關推薦

Dockerjava logback 專案 EFK 寫入日誌

繼續上篇文章java logback 向 EFK 寫入日誌, 此篇文章主要講述在docker環境下EFK與logback的整合,主要解決java專案在docker環境下,向EFK輸出日誌的問題: 上篇文章中的方法雖然可以向EFK寫入日誌,但是在叢集環境中,無法區分容器,除

dockerjava專案log日誌時間不正確

檢視 docker 中 java 專案列印的日誌發現,時間相差 8 個小時。考慮是時區的問題。 解決方法如下 Dockerfi

Docker執行PHP專案的探索之旅

Docker出現後,容器技術在網際網路領域得到了空前的普及,無論是大公司還是屌絲創業公司的碼農基本上都會在各種技術社群或者各種演講會議上了解到過相關技術,我們作為一家屌絲創業公司也不例外,去年對Docker做了一番瞭解,並在年前測試了一些方案,今天在這裡總結一下遇到的各種坑以及踩坑過程中的一

第一個Docker映象Java-web專案

一、系統環境 win10+docker 二、製作Docker映象 1、啟動docker 2、進入powershell 3、進入自己的工作目錄 我的工作目錄在E:/study/DOCKER/share/ 4、拉取依賴映象tomcat 先檢視本地映

Docker部署Django專案記錄

有很多構建方式,記錄下本次使用docker部署的過程,日後參考 1.構建docker環境 安裝docker,略 埠對映外部82到80 docker pull python run -itd -p 82:80 --name YYST 6bf7a4fa2d45 docker e

docker部署pinpoint,監控docker的Springboot專案

pinpoint是一個開源的java監控專案,也是分散式監控專案中比較知名的。 網上有比較多的pinpoint部署指南,但都是基於主機部署的,這一篇主要是講將pinpoint部署到docker中,並監控同樣部署在docker的Springboot專案。 pi

ideaJava Web專案的訪問路徑問題

說明 這裡只以 servlet 為例,沒有涉及到框架,但其實路徑的基本原理和框架的關係不大,所以學了框架的同學如果對路徑有疑惑的也可以閱讀此文 專案結構 在 idea 中新建一個 Jav

java web 專案手機發送簡訊

說明,JAVA傳送手機簡訊,流傳有幾種方法:(1)使用webservice介面傳送手機簡訊,這個可以使用sina提供的webservice進行傳送,但是需要進行註冊;(2)使用簡訊mao的方式進行簡訊的傳送,這種方式應該是比較的常用,前提是需要購買硬體裝置, (3)使用中國

dockerjava tomcat等時間不對,一直顯示0時區時間

使用docker的tomcat環境部署應用後,系統時間滯後8小時,通過以下啟動命令後,docker的系統時間和宿主機一直了, 但是java應用中產生的日誌、資料庫記錄等時間依然是時區0的時間。 docker run --name tomcat -p 8080:8080 -

Docker】在Docker部署tornado專案

打包專案 打包專案為:xxx.tar.gz 檔案並上傳 建立:Dockerfile檔案 下載基礎系統映象centos7 1)docker search centos 2)doc

從零開始學習docker之在docker執行springboot專案

一、docker環境配置 首先需要一個安裝了docker的伺服器(本地或者雲伺服器),如果沒有請看上文,傳送門---https://www.cnblogs.com/wdfordream/p/12737389.html 我這裡是直接在雲伺服器上搭建了docker  雲環境:CentOS 7.6 64位

java日志文件寫入日誌

程式碼如下:  /**      *       * @param path      * path:儲存日誌檔案路徑      * @param cont

Docker使用Centos映象安裝tomcat,jdk1.8部署Java web專案

1. docker pull centos獲取centos映象 2. 後臺執行centos映象並開放8080埠,window端可通過訪問80埠訪問到8080埠 docker run -itd -p 80:8080 docker.io/centos 3. 從宿主機拷貝檔

java 用POIword寫入檔案

專案涉及到要向一個word中插入一段文字,用到了apache的POI元件,可以很流暢地向已有word中寫入文字。 (這裡只是向word末尾加文字,不支援指定位置插入) 首先要下載apache POI的jar們,下載地址:https://poi.apache.org/down

docker部署高可用負載均衡前後端專案異常

異常:在基於jdk的docker容器中可以使用jar方式啟動jar檔案,但有時候要終止程式該怎麼做? 當我在宿主機上去殺死對應的容器對映程式時,發現雖然外層宿主機刪除了程序,當容器中還是在執行 當檢視docker容器中nohup.out檔案時總是顯示地址被佔用 測試:ps -ef | g

關於WEB專案java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver

環境: MyEclipse  9.0 Tomcat 6.x 今天一直在除錯一個問題: java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver  很納悶,

JAVA web專案的no result defined for action xxxAction and result input 錯誤

No result defined for action and result input 產生這個錯誤的原因:Action中的屬性值為空的時候,Struts2的預設攔截器會報錯,但是又找不到input的Result,不能夠把錯誤返回,所以報這種錯誤。 從上面可知,能夠導致 No r

java 使用logback日誌,並實現日誌按天分類壓縮儲存。

以maven專案作為構建工具為例,首先引入使用logback需要的3個依賴,需要注意使用logback是需要引入slf4j-api的,因為logback是基於slf4j的 <!--logback--> <dependency> <groupId>ch.qo

JavaList向前和後遍歷

clas 遍歷 ... string tcollect sta position elements \n Java中List向前和向後遍歷 import java.util.*; public class TestCollectionIterator { publi

python .write 無法檔案寫入內容

問題程式碼如下 links = open("new") out = open("out.txt","w+") for link in links: out.write(link+"\n") 問題原因: 當沒有使用flush()或close()時,要寫入的內容依然在緩衝區中,沒有寫入檔案,如果中途