本教程介紹 Go 中多模塊工作區(qū)的基礎(chǔ)知識。使用多模塊工作區(qū),您可以告訴 Go 命令您正在同時在多個模塊中編寫代碼,并輕松地在這些模塊中構(gòu)建和運行代碼。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),奇臺企業(yè)網(wǎng)站建設(shè),奇臺品牌網(wǎng)站建設(shè),網(wǎng)站定制,奇臺網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,奇臺網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
在本教程中,您將在共享的多模塊工作區(qū)中創(chuàng)建兩個模塊,對這些模塊進行更改,并在構(gòu)建中查看這些更改的結(jié)果。
本教程需要 go1.18 或更高版本。使用go.dev/dl中的鏈接確保您已在 Go 1.18 或更高版本中安裝了 Go 。
首先,為您要編寫的代碼創(chuàng)建一個模塊。
1、打開命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個名為工作區(qū)的目錄。
3、初始化模塊
我們的示例將創(chuàng)建一個hello依賴于 golang.org/x/example 模塊的新模塊。
創(chuàng)建你好模塊:
使用 . 添加對 golang.org/x/example 模塊的依賴項go get。
在 hello 目錄下創(chuàng)建 hello.go,內(nèi)容如下:
現(xiàn)在,運行 hello 程序:
在這一步中,我們將創(chuàng)建一個go.work文件來指定模塊的工作區(qū)。
在workspace目錄中,運行:
該go work init命令告訴為包含目錄中模塊的工作空間go創(chuàng)建一個文件 。go.work./hello
該go命令生成一個go.work如下所示的文件:
該go.work文件的語法與go.mod相同。
該go指令告訴 Go 應(yīng)該使用哪個版本的 Go 來解釋文件。它類似于文件中的go指令go.mod 。
該use指令告訴 Go在進行構(gòu)建時hello目錄中的模塊應(yīng)該是主模塊。
所以在模塊的任何子目錄中workspace都會被激活。
2、運行工作區(qū)目錄下的程序
在workspace目錄中,運行:
Go 命令包括工作區(qū)中的所有模塊作為主模塊。這允許我們在模塊中引用一個包,即使在模塊之外。在模塊或工作區(qū)之外運行g(shù)o run命令會導(dǎo)致錯誤,因為該go命令不知道要使用哪些模塊。
接下來,我們將golang.org/x/example模塊的本地副本添加到工作區(qū)。然后,我們將向stringutil包中添加一個新函數(shù),我們可以使用它來代替Reverse.
在這一步中,我們將下載包含該模塊的 Git 存儲庫的副本golang.org/x/example,將其添加到工作區(qū),然后向其中添加一個我們將從 hello 程序中使用的新函數(shù)。
1、克隆存儲庫
在工作區(qū)目錄中,運行g(shù)it命令來克隆存儲庫:
2、將模塊添加到工作區(qū)
該go work use命令將一個新模塊添加到 go.work 文件中。它現(xiàn)在看起來像這樣:
該模塊現(xiàn)在包括example.com/hello模塊和 `golang.org/x/example 模塊。
這將允許我們使用我們將在模塊副本中編寫的新代碼,而不是使用命令stringutil下載的模塊緩存中的模塊版本。
3、添加新功能。
我們將向golang.org/x/example/stringutil包中添加一個新函數(shù)以將字符串大寫。
將新文件夾添加到workspace/example/stringutil包含以下內(nèi)容的目錄:
4、修改hello程序以使用該功能。
修改workspace/hello/hello.go的內(nèi)容以包含以下內(nèi)容:
從工作區(qū)目錄,運行
Go 命令在go.work文件指定的hello目錄中查找命令行中指定的example.com/hello模塊 ,同樣使用go.work文件解析導(dǎo)入golang.org/x/example。
go.work可以用來代替添加replace 指令以跨多個模塊工作。
由于這兩個模塊在同一個工作區(qū)中,因此很容易在一個模塊中進行更改并在另一個模塊中使用它。
現(xiàn)在,要正確發(fā)布這些模塊,我們需要發(fā)布golang.org/x/example 模塊,例如在v0.1.0. 這通常通過在模塊的版本控制存儲庫上標記提交來完成。發(fā)布完成后,我們可以增加對 golang.org/x/example模塊的要求hello/go.mod:
這樣,該go命令可以正確解析工作區(qū)之外的模塊。
簡介:
怎么使用
從上面的例子中我們分幾步來看
當(dāng)然本文沒有介紹zap的其他基本用法,只是講解了本人經(jīng)常用到的方法,其他方法如果有時間,我也會一一列出。謝謝大家觀看,比心~~
Filebeat是本地文件的日志數(shù)據(jù)采集器,可監(jiān)控日志目錄或特定日志文件(tail file),并將它們轉(zhuǎn)發(fā)給Elasticsearch或Logstatsh進行索引、kafka等。帶有內(nèi)部模塊(auditd,Apache,Nginx,System和MySQL),可通過一個指定命令來簡化通用日志格式的收集,解析和可視化。
官方網(wǎng)址:
Filebeat涉及兩個組件:查找器prospector和采集器harvester,來讀取文件(tail file)并將事件數(shù)據(jù)發(fā)送到指定的輸出。
啟動Filebeat時,它會啟動一個或多個查找器,查看你為日志文件指定的本地路徑。對于prospector所在的每個日志文件,prospector啟動harvester。每個harvester都會為新內(nèi)容讀取單個日志文件,并將新日志數(shù)據(jù)發(fā)送到libbeat,后者將聚合事件并將聚合數(shù)據(jù)發(fā)送到你為Filebeat配置的輸出。
當(dāng)發(fā)送數(shù)據(jù)到Logstash或Elasticsearch時,F(xiàn)ilebeat使用一個反壓力敏感(backpressure-sensitive)的協(xié)議來解釋高負荷的數(shù)據(jù)量。當(dāng)Logstash數(shù)據(jù)處理繁忙時,F(xiàn)ilebeat放慢它的讀取速度。一旦壓力解除,F(xiàn)ilebeat將恢復(fù)到原來的速度,繼續(xù)傳輸數(shù)據(jù)。
Harvester負責(zé)讀取單個文件的內(nèi)容。讀取每個文件,并將內(nèi)容發(fā)送到the output,每個文件啟動一個harvester, harvester負責(zé)打開和關(guān)閉文件,這意味著在運行時文件描述符保持打開狀態(tài)。
如果文件在讀取時被刪除或重命名,F(xiàn)ilebeat將繼續(xù)讀取文件。這有副作用,即在harvester關(guān)閉之前,磁盤上的空間被保留。默認情況下,F(xiàn)ilebeat將文件保持打開狀態(tài),直到達到close_inactive狀態(tài)
關(guān)閉harvester會產(chǎn)生以下結(jié)果:
1)如果在harvester仍在讀取文件時文件被刪除,則關(guān)閉文件句柄,釋放底層資源。
2)文件的采集只會在scan_frequency過后重新開始。
3)如果在harvester關(guān)閉的情況下移動或移除文件,則不會繼續(xù)處理文件。
要控制收割機何時關(guān)閉,請使用close_ *配置選項
Prospector負責(zé)管理harvester并找到所有要讀取的文件來源。如果輸入類型為日志,則查找器將查找路徑匹配的所有文件,并為每個文件啟動一個harvester。每個prospector都在自己的Go協(xié)程中運行。
Filebeat目前支持兩種prospector類型:log和stdin。每個prospector類型可以定義多次。日志prospector檢查每個文件來查看harvester是否需要啟動,是否已經(jīng)運行,或者該文件是否可以被忽略(請參閱ignore_older)。
只有在harvester關(guān)閉后文件的大小發(fā)生了變化,才會讀取到新行。
注:Filebeat prospector只能讀取本地文件,沒有功能可以連接到遠程主機來讀取存儲的文件或日志。
配置文件:$FILEBEAT_HOME/filebeat.yml。Filebeat可以一次讀取某個文件夾下的所有后綴名為log的文件,也可以讀取指定的某一個后綴名為log的文件。
配置文件詳解( )
(1)字段解釋
paths: 指定要監(jiān)控的日志,目前按照Go語言的glob函數(shù)處理。沒有對配置目錄做遞歸處理,比如配置的如果是:
/var/log/* /*.log
則只會去/var/log目錄的所有子目錄中尋找以".log"結(jié)尾的文件,而不會尋找/var/log目錄下以".log"結(jié)尾的文件。
encoding: 指定被監(jiān)控的文件的編碼類型,使用plain和utf-8都是可以處理中文日志的。
input_type: 指定文件的輸入類型log(默認)或者stdin。
exclude_lines: 在輸入中排除符合正則表達式列表的那些行。
include_lines: 包含輸入中符合正則表達式列表的那些行(默認包含所有行),include_lines執(zhí)行完畢之后會執(zhí)行exclude_lines。
exclude_files: 忽略掉符合正則表達式列表的文件(默認為每一個符合paths定義的文件都創(chuàng)建一個harvester)。
fields: 向輸出的每一條日志添加額外的信息,比如"level:debug",方便后續(xù)對日志進行分組統(tǒng)計。默認情況下,會在輸出信息的fields子目錄下以指定的新增fields建立子目錄,
fields_under_root: 如果該選項設(shè)置為true,則新增fields成為頂級目錄,而不是將其放在fields目錄下。自定義的field會覆蓋filebeat默認的field。
ignore_older: 可以指定Filebeat忽略指定時間段以外修改的日志內(nèi)容,比如2h(兩個小時)或者5m(5分鐘)。
close_older: 如果一個文件在某個時間段內(nèi)沒有發(fā)生過更新,則關(guān)閉監(jiān)控的文件handle。默認1h。
force_close_files: Filebeat會在沒有到達close_older之前一直保持文件的handle,如果在這個時間窗內(nèi)刪除文件會有問題,所以可以把force_close_files設(shè)置為true,只要filebeat檢測到文件名字發(fā)生變化,就會關(guān)掉這個handle。
scan_frequency: Filebeat以多快的頻率去prospector指定的目錄下面檢測文件更新(比如是否有新增文件),如果設(shè)置為0s,則Filebeat會盡可能快地感知更新(占用的CPU會變高)。默認是10s。
document_type: 設(shè)定Elasticsearch輸出時的document的type字段,也可以用來給日志進行分類。
harvester_buffer_size: 每個harvester監(jiān)控文件時,使用的buffer的大小。
max_bytes: 日志文件中增加一行算一個日志事件,max_bytes限制在一次日志事件中最多上傳的字節(jié)數(shù),多出的字節(jié)會被丟棄。默認是10MB。
multiline: 適用于日志中每一條日志占據(jù)多行的情況,比如各種語言的報錯信息調(diào)用棧。這個配置的下面包含如下配置:
pattern: 多行日志開始的那一行匹配的pattern
negate: 是否需要對pattern條件轉(zhuǎn)置使用,不翻轉(zhuǎn)設(shè)為true,反轉(zhuǎn)設(shè)置為false。
match: 匹配pattern后,與前面(before)還是后面(after)的內(nèi)容合并為一條日志
max_lines: 合并的最多行數(shù)(包含匹配pattern的那一行),默認為500行。
timeout: 到了timeout之后,即使沒有匹配一個新的pattern(發(fā)生一個新的事件),也把已經(jīng)匹配的日志事件發(fā)送出去
tail_files: 如果設(shè)置為true,F(xiàn)ilebeat從文件尾開始監(jiān)控文件新增內(nèi)容,把新增的每一行文件作為一個事件依次發(fā)送,而不是從文件開始處重新發(fā)送所有內(nèi)容。
backoff: Filebeat檢測到某個文件到了EOF之后,每次等待多久再去檢測文件是否有更新,默認為1s。
max_backoff: Filebeat檢測到某個文件到了EOF之后,等待檢測文件更新的最大時間,默認是10秒。
backoff_factor: 定義到達max_backoff的速度,默認因子是2,到達max_backoff后,變成每次等待max_backoff那么長的時間才backoff一次,直到文件有更新才會重置為backoff。比如:?
如果設(shè)置成1,意味著去使能了退避算法,每隔backoff那么長的時間退避一次。
spool_size: spooler的大小,spooler中的事件數(shù)量超過這個閾值的時候會清空發(fā)送出去(不論是否到達超時時間),默認1MB。
idle_timeout: spooler的超時時間,如果到了超時時間,spooler也會清空發(fā)送出去(不論是否到達容量的閾值),默認1s。
registry_file: 記錄filebeat處理日志文件的位置的文件
config_dir: 如果要在本配置文件中引入其他位置的配置文件,可以寫在這里(需要寫完整路徑),但是只處理prospector的部分。
publish_async: 是否采用異步發(fā)送模式(實驗功能)。
具體的一個yml采集配置樣例如下:該配置文件是filebeat采集數(shù)據(jù)的依據(jù),并根據(jù)需求添加必要配置,filebeat收集日志后發(fā)往logstash,配置如下:
cd FILEBEAT_HOME
nohup ./bin/filebeat -f config/test.conf /FILEBEAT_HOME/logs/filebeat.log
后臺啟動filebeat,配置對應(yīng)的參數(shù)
啟動多個filebeat配置,新建一個目錄(conf)存放多個filebeat的配置文件,
#nohup ./bin/filebeat -f conf/* /FILEBEAT_HOME/logs/filebeat.log
注意:一臺服務(wù)器只能啟動一個filebeat進程。
ps -ef |grep filebeat
kill -9 $pid
注意: 非緊急情況下,殺掉進程只能用優(yōu)雅方式。
A、filebeat運行不成功
問題:配置文件格式有問題,配置文件遵循yml文件格式, 多或少一個空格 都會導(dǎo)致啟動問題,可以使用cmd命令窗口到filebeat安裝路徑下,使用filebeat.exe –c filebeat.yml 查看報錯,也可以看filebeat路徑下的log文件夾中的filebeat文件
B、 filebeat第一次運行成功無數(shù)據(jù)
問題:a、路徑有問題
b、運行條件設(shè)置有問題(例如只采集某個條件下的數(shù)據(jù),文件中沒有符合條件的數(shù)據(jù),這種情況下先注釋掉采集條件測試一下)
C、filebeat運行成功第一次運行后有數(shù)據(jù),第二次無數(shù)據(jù)
問題:filebeat讀取文件后會生成一個registry文件,注意windows機器中這個文件在手動啟動的情況下會在filebeat安裝目錄下的data文件夾中,服務(wù)注冊啟動的情況下會在C盤下隱藏文件夾C:\ProgramData\filebeat中,刪除掉這個就可以了
D、filebeat運行成功有數(shù)據(jù),但是新添加數(shù)據(jù)不讀取問題
問題:filebeat傳輸存在反壓機制,在數(shù)據(jù)量特別大或者傳輸通道不通的情況下,filebeat會進行反壓,暫停發(fā)送,等到數(shù)據(jù)量穩(wěn)定或者數(shù)據(jù)傳輸通道正常的之后才會發(fā)送
Filebeat 保存每個文件的狀態(tài)并經(jīng)常將狀態(tài)刷新到磁盤上的注冊文件中。該狀態(tài)用于記住harvester正在讀取的最后偏移量,并確保發(fā)送所有日志行。如果輸出(例如Elasticsearch或Logstash)無法訪問,F(xiàn)ilebeat會跟蹤最后發(fā)送的行,并在輸出再次可用時繼續(xù)讀取文件。
在Filebeat運行時,每個prospector內(nèi)存中也會保存文件狀態(tài)信息,當(dāng)重新啟動Filebeat時,將使用注冊文件的數(shù)據(jù)來重建文件狀態(tài),F(xiàn)ilebeat將每個harvester在從保存的最后偏移量繼續(xù)讀取。
每個prospector為它找到的每個文件保留一個狀態(tài)。由于文件可以被重命名或移動,因此文件名和路徑不足以識別文件。對于每個文件,F(xiàn)ilebeat存儲唯一標識符以檢測文件是否先前已被采集過。
如果你使用的案例涉及每天創(chuàng)建大量新文件,你可能會發(fā)現(xiàn)注冊文件增長過大。請參閱注冊表文件太大?編輯有關(guān)你可以設(shè)置以解決此問題的配置選項的詳細信息。
Filebeat保證事件至少會被傳送到配置的輸出一次,并且不會丟失數(shù)據(jù)。 Filebeat能夠?qū)崿F(xiàn)此行為,因為它將每個事件的傳遞狀態(tài)存儲在注冊文件中。
在輸出阻塞或未確認所有事件的情況下,F(xiàn)ilebeat將繼續(xù)嘗試發(fā)送事件,直到接收端確認已收到。如果Filebeat在發(fā)送事件的過程中關(guān)閉,它不會等待輸出確認所有收到事件。
發(fā)送到輸出但在Filebeat關(guān)閉前未確認的任何事件在重新啟動Filebeat時會再次發(fā)送。這可以確保每個事件至少發(fā)送一次,但最終會將重復(fù)事件發(fā)送到輸出。
也可以通過設(shè)置shutdown_timeout選項來配置Filebeat以在關(guān)閉之前等待特定時間。
注意:Filebeat的至少一次交付保證包括日志輪換和刪除舊文件的限制。如果將日志文件寫入磁盤并且寫入速度超過Filebeat可以處理的速度,或者在輸出不可用時刪除了文件,則可能會丟失數(shù)據(jù)。
在Linux上,F(xiàn)ilebeat也可能因inode重用而跳過行。有關(guān)inode重用問題的更多詳細信息,請參閱filebeat常見問題解答。
Logback日志切割用的是JDK里File#renameTo()方法。如果該方法失敗,就再嘗試使用復(fù)制數(shù)據(jù)的方式切割日志。查找該方法相關(guān)資料得知,只有當(dāng)源文件和目標目錄處于同一個文件系統(tǒng)、同volumn(即windows下的C, D盤)下該方法才會成功,切不會為重命名的后的文件分配新的inode值。也就是說,如果程序里一直保存著該文件的描述符,那么當(dāng)程序再寫日志時,就會向重命名后的文件中寫。那么問題來了,filebeat是會一直打開并保存文件描述符的,那么它是怎么得知日志被切割這件事的呢?
如果只用當(dāng)前文件描述符一路監(jiān)控到天黑的話,那么當(dāng)logback把日志重命名后,filebeat仍然會監(jiān)控重命名后的日志,新創(chuàng)建的日志文件就看不到了。實際上,filebeat是通過close_inactive和scan_frequency兩個參數(shù)(機制)來應(yīng)對這種情況的:
(1)close_inactive
該參數(shù)指定當(dāng)被監(jiān)控的文件多長時間沒有變化后就關(guān)閉文件句柄(file handle)。官方建議將這個參數(shù)設(shè)置為一個比文件最大更新間隔大的值。比如文件最長5s更新一次,那就設(shè)置成1min。默認值為5min。
(2)scan_frequency
該參數(shù)指定Filebeat搜索新文件的頻率(時間間隔)。當(dāng)發(fā)現(xiàn)新的文件被創(chuàng)建時, Filebeat會為它再啟動一個 harvester 進行監(jiān)控,默認為10s。
綜合以上兩個機制,當(dāng)logback完成日志切割后(即重命名),此時老的harvester仍然在監(jiān)控重命名后的日志文件,但是由于該文件不會再更新,因此會在close_inactive時間后關(guān)閉這個文件的 harvester。當(dāng)scan_frequency時間過后,F(xiàn)ilebeat會發(fā)現(xiàn)目錄中出現(xiàn)了新文件,于是為該文件啟動 harvester 進行監(jiān)控。這樣就保證了切割日志時也能不丟不重的傳輸數(shù)據(jù)。(不重是通過為每個日志文件保存offset實現(xiàn)的)
日常開發(fā)當(dāng)中需要將golang的log包打印的日志同時輸出到控制臺和文件,應(yīng)該如何解決這個問題?
log包可以通過SetOutput()方法指定日志輸出的方式(Writer),但是只能指定一個輸出的方式(Writer)。我們利用io.MultiWriter()將多個Writer拼成一個Writer使用的特性,把log.Println()輸出的內(nèi)容分流到控制臺和文件當(dāng)中。
原文地址
glog 這個是google的日志框架,kubernetes是使用這個的
inconshreveable/log15這個是結(jié)構(gòu)化輸出的,之前也有用過。
Sirupsen/logrus這個用的也很多,記得docker是有這個的。
還有很多其他的,你可以github上看看,自己熟悉的就好。
對于Go語言的日志來說,如何將log寫到指定的文件里面,下面是一個例子。
output:
output:
文章題目:go語言日志模塊 go日志收集系統(tǒng)
瀏覽地址:http://www.rwnh.cn/article26/hhspjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、App設(shè)計、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站、網(wǎng)站排名、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)