go語(yǔ)言日志模塊 go日志收集系統(tǒng)

GO語(yǔ)言(十一):開始使用多模塊工作區(qū)

本教程介紹 Go 中多模塊工作區(qū)的基礎(chǔ)知識(shí)。使用多模塊工作區(qū),您可以告訴 Go 命令您正在同時(shí)在多個(gè)模塊中編寫代碼,并輕松地在這些模塊中構(gòu)建和運(yùn)行代碼。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),奇臺(tái)企業(yè)網(wǎng)站建設(shè),奇臺(tái)品牌網(wǎng)站建設(shè),網(wǎng)站定制,奇臺(tái)網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,奇臺(tái)網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

在本教程中,您將在共享的多模塊工作區(qū)中創(chuàng)建兩個(gè)模塊,對(duì)這些模塊進(jìn)行更改,并在構(gòu)建中查看這些更改的結(jié)果。

本教程需要 go1.18 或更高版本。使用go.dev/dl中的鏈接確保您已在 Go 1.18 或更高版本中安裝了 Go 。

首先,為您要編寫的代碼創(chuàng)建一個(gè)模塊。

1、打開命令提示符并切換到您的主目錄。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為工作區(qū)的目錄。

3、初始化模塊

我們的示例將創(chuàng)建一個(gè)hello依賴于 golang.org/x/example 模塊的新模塊。

創(chuàng)建你好模塊:

使用 . 添加對(duì) golang.org/x/example 模塊的依賴項(xiàng)go get。

在 hello 目錄下創(chuàng)建 hello.go,內(nèi)容如下:

現(xiàn)在,運(yùn)行 hello 程序:

在這一步中,我們將創(chuàng)建一個(gè)go.work文件來(lái)指定模塊的工作區(qū)。

在workspace目錄中,運(yùn)行:

該go work init命令告訴為包含目錄中模塊的工作空間go創(chuàng)建一個(gè)文件 。go.work./hello

該go命令生成一個(gè)go.work如下所示的文件:

該go.work文件的語(yǔ)法與go.mod相同。

該go指令告訴 Go 應(yīng)該使用哪個(gè)版本的 Go 來(lái)解釋文件。它類似于文件中的go指令go.mod 。

該use指令告訴 Go在進(jìn)行構(gòu)建時(shí)hello目錄中的模塊應(yīng)該是主模塊。

所以在模塊的任何子目錄中workspace都會(huì)被激活。

2、運(yùn)行工作區(qū)目錄下的程序

在workspace目錄中,運(yùn)行:

Go 命令包括工作區(qū)中的所有模塊作為主模塊。這允許我們?cè)谀K中引用一個(gè)包,即使在模塊之外。在模塊或工作區(qū)之外運(yùn)行g(shù)o run命令會(huì)導(dǎo)致錯(cuò)誤,因?yàn)樵揼o命令不知道要使用哪些模塊。

接下來(lái),我們將golang.org/x/example模塊的本地副本添加到工作區(qū)。然后,我們將向stringutil包中添加一個(gè)新函數(shù),我們可以使用它來(lái)代替Reverse.

在這一步中,我們將下載包含該模塊的 Git 存儲(chǔ)庫(kù)的副本golang.org/x/example,將其添加到工作區(qū),然后向其中添加一個(gè)我們將從 hello 程序中使用的新函數(shù)。

1、克隆存儲(chǔ)庫(kù)

在工作區(qū)目錄中,運(yùn)行g(shù)it命令來(lái)克隆存儲(chǔ)庫(kù):

2、將模塊添加到工作區(qū)

該go work use命令將一個(gè)新模塊添加到 go.work 文件中。它現(xiàn)在看起來(lái)像這樣:

該模塊現(xiàn)在包括example.com/hello模塊和 `golang.org/x/example 模塊。

這將允許我們使用我們將在模塊副本中編寫的新代碼,而不是使用命令stringutil下載的模塊緩存中的模塊版本。

3、添加新功能。

我們將向golang.org/x/example/stringutil包中添加一個(gè)新函數(shù)以將字符串大寫。

將新文件夾添加到workspace/example/stringutil包含以下內(nèi)容的目錄:

4、修改hello程序以使用該功能。

修改workspace/hello/hello.go的內(nèi)容以包含以下內(nèi)容:

從工作區(qū)目錄,運(yùn)行

Go 命令在go.work文件指定的hello目錄中查找命令行中指定的example.com/hello模塊 ,同樣使用go.work文件解析導(dǎo)入golang.org/x/example。

go.work可以用來(lái)代替添加replace 指令以跨多個(gè)模塊工作。

由于這兩個(gè)模塊在同一個(gè)工作區(qū)中,因此很容易在一個(gè)模塊中進(jìn)行更改并在另一個(gè)模塊中使用它。

現(xiàn)在,要正確發(fā)布這些模塊,我們需要發(fā)布golang.org/x/example 模塊,例如在v0.1.0. 這通常通過(guò)在模塊的版本控制存儲(chǔ)庫(kù)上標(biāo)記提交來(lái)完成。發(fā)布完成后,我們可以增加對(duì) golang.org/x/example模塊的要求hello/go.mod:

這樣,該go命令可以正確解析工作區(qū)之外的模塊。

golang 日志 zap的使用

簡(jiǎn)介:

怎么使用

從上面的例子中我們分幾步來(lái)看

當(dāng)然本文沒(méi)有介紹zap的其他基本用法,只是講解了本人經(jīng)常用到的方法,其他方法如果有時(shí)間,我也會(huì)一一列出。謝謝大家觀看,比心~~

ELK應(yīng)用之Filebeat

Filebeat是本地文件的日志數(shù)據(jù)采集器,可監(jiān)控日志目錄或特定日志文件(tail file),并將它們轉(zhuǎn)發(fā)給Elasticsearch或Logstatsh進(jìn)行索引、kafka等。帶有內(nèi)部模塊(auditd,Apache,Nginx,System和MySQL),可通過(guò)一個(gè)指定命令來(lái)簡(jiǎn)化通用日志格式的收集,解析和可視化。

官方網(wǎng)址:

Filebeat涉及兩個(gè)組件:查找器prospector和采集器harvester,來(lái)讀取文件(tail file)并將事件數(shù)據(jù)發(fā)送到指定的輸出。

啟動(dòng)Filebeat時(shí),它會(huì)啟動(dòng)一個(gè)或多個(gè)查找器,查看你為日志文件指定的本地路徑。對(duì)于prospector所在的每個(gè)日志文件,prospector啟動(dòng)harvester。每個(gè)harvester都會(huì)為新內(nèi)容讀取單個(gè)日志文件,并將新日志數(shù)據(jù)發(fā)送到libbeat,后者將聚合事件并將聚合數(shù)據(jù)發(fā)送到你為Filebeat配置的輸出。

當(dāng)發(fā)送數(shù)據(jù)到Logstash或Elasticsearch時(shí),F(xiàn)ilebeat使用一個(gè)反壓力敏感(backpressure-sensitive)的協(xié)議來(lái)解釋高負(fù)荷的數(shù)據(jù)量。當(dāng)Logstash數(shù)據(jù)處理繁忙時(shí),F(xiàn)ilebeat放慢它的讀取速度。一旦壓力解除,F(xiàn)ilebeat將恢復(fù)到原來(lái)的速度,繼續(xù)傳輸數(shù)據(jù)。

Harvester負(fù)責(zé)讀取單個(gè)文件的內(nèi)容。讀取每個(gè)文件,并將內(nèi)容發(fā)送到the output,每個(gè)文件啟動(dòng)一個(gè)harvester, harvester負(fù)責(zé)打開和關(guān)閉文件,這意味著在運(yùn)行時(shí)文件描述符保持打開狀態(tài)。

如果文件在讀取時(shí)被刪除或重命名,F(xiàn)ilebeat將繼續(xù)讀取文件。這有副作用,即在harvester關(guān)閉之前,磁盤上的空間被保留。默認(rèn)情況下,F(xiàn)ilebeat將文件保持打開狀態(tài),直到達(dá)到close_inactive狀態(tài)

關(guān)閉harvester會(huì)產(chǎn)生以下結(jié)果:

1)如果在harvester仍在讀取文件時(shí)文件被刪除,則關(guān)閉文件句柄,釋放底層資源。

2)文件的采集只會(huì)在scan_frequency過(guò)后重新開始。

3)如果在harvester關(guān)閉的情況下移動(dòng)或移除文件,則不會(huì)繼續(xù)處理文件。

要控制收割機(jī)何時(shí)關(guān)閉,請(qǐng)使用close_ *配置選項(xiàng)

Prospector負(fù)責(zé)管理harvester并找到所有要讀取的文件來(lái)源。如果輸入類型為日志,則查找器將查找路徑匹配的所有文件,并為每個(gè)文件啟動(dòng)一個(gè)harvester。每個(gè)prospector都在自己的Go協(xié)程中運(yùn)行。

Filebeat目前支持兩種prospector類型:log和stdin。每個(gè)prospector類型可以定義多次。日志prospector檢查每個(gè)文件來(lái)查看harvester是否需要啟動(dòng),是否已經(jīng)運(yùn)行,或者該文件是否可以被忽略(請(qǐng)參閱ignore_older)。

只有在harvester關(guān)閉后文件的大小發(fā)生了變化,才會(huì)讀取到新行。

注:Filebeat prospector只能讀取本地文件,沒(méi)有功能可以連接到遠(yuǎn)程主機(jī)來(lái)讀取存儲(chǔ)的文件或日志。

配置文件:$FILEBEAT_HOME/filebeat.yml。Filebeat可以一次讀取某個(gè)文件夾下的所有后綴名為log的文件,也可以讀取指定的某一個(gè)后綴名為log的文件。

配置文件詳解( )

(1)字段解釋

paths: 指定要監(jiān)控的日志,目前按照Go語(yǔ)言的glob函數(shù)處理。沒(méi)有對(duì)配置目錄做遞歸處理,比如配置的如果是:

/var/log/* /*.log

則只會(huì)去/var/log目錄的所有子目錄中尋找以".log"結(jié)尾的文件,而不會(huì)尋找/var/log目錄下以".log"結(jié)尾的文件。

encoding: 指定被監(jiān)控的文件的編碼類型,使用plain和utf-8都是可以處理中文日志的。

input_type: 指定文件的輸入類型log(默認(rèn))或者stdin。

exclude_lines: 在輸入中排除符合正則表達(dá)式列表的那些行。

include_lines: 包含輸入中符合正則表達(dá)式列表的那些行(默認(rèn)包含所有行),include_lines執(zhí)行完畢之后會(huì)執(zhí)行exclude_lines。

exclude_files: 忽略掉符合正則表達(dá)式列表的文件(默認(rèn)為每一個(gè)符合paths定義的文件都創(chuàng)建一個(gè)harvester)。

fields: 向輸出的每一條日志添加額外的信息,比如"level:debug",方便后續(xù)對(duì)日志進(jìn)行分組統(tǒng)計(jì)。默認(rèn)情況下,會(huì)在輸出信息的fields子目錄下以指定的新增fields建立子目錄,

fields_under_root: 如果該選項(xiàng)設(shè)置為true,則新增fields成為頂級(jí)目錄,而不是將其放在fields目錄下。自定義的field會(huì)覆蓋filebeat默認(rèn)的field。

ignore_older: 可以指定Filebeat忽略指定時(shí)間段以外修改的日志內(nèi)容,比如2h(兩個(gè)小時(shí))或者5m(5分鐘)。

close_older: 如果一個(gè)文件在某個(gè)時(shí)間段內(nèi)沒(méi)有發(fā)生過(guò)更新,則關(guān)閉監(jiān)控的文件handle。默認(rèn)1h。

force_close_files: Filebeat會(huì)在沒(méi)有到達(dá)close_older之前一直保持文件的handle,如果在這個(gè)時(shí)間窗內(nèi)刪除文件會(huì)有問(wèn)題,所以可以把force_close_files設(shè)置為true,只要filebeat檢測(cè)到文件名字發(fā)生變化,就會(huì)關(guān)掉這個(gè)handle。

scan_frequency: Filebeat以多快的頻率去prospector指定的目錄下面檢測(cè)文件更新(比如是否有新增文件),如果設(shè)置為0s,則Filebeat會(huì)盡可能快地感知更新(占用的CPU會(huì)變高)。默認(rèn)是10s。

document_type: 設(shè)定Elasticsearch輸出時(shí)的document的type字段,也可以用來(lái)給日志進(jìn)行分類。

harvester_buffer_size: 每個(gè)harvester監(jiān)控文件時(shí),使用的buffer的大小。

max_bytes: 日志文件中增加一行算一個(gè)日志事件,max_bytes限制在一次日志事件中最多上傳的字節(jié)數(shù),多出的字節(jié)會(huì)被丟棄。默認(rèn)是10MB。

multiline: 適用于日志中每一條日志占據(jù)多行的情況,比如各種語(yǔ)言的報(bào)錯(cuò)信息調(diào)用棧。這個(gè)配置的下面包含如下配置:

pattern: 多行日志開始的那一行匹配的pattern

negate: 是否需要對(duì)pattern條件轉(zhuǎn)置使用,不翻轉(zhuǎn)設(shè)為true,反轉(zhuǎn)設(shè)置為false。

match: 匹配pattern后,與前面(before)還是后面(after)的內(nèi)容合并為一條日志

max_lines: 合并的最多行數(shù)(包含匹配pattern的那一行),默認(rèn)為500行。

timeout: 到了timeout之后,即使沒(méi)有匹配一個(gè)新的pattern(發(fā)生一個(gè)新的事件),也把已經(jīng)匹配的日志事件發(fā)送出去

tail_files: 如果設(shè)置為true,F(xiàn)ilebeat從文件尾開始監(jiān)控文件新增內(nèi)容,把新增的每一行文件作為一個(gè)事件依次發(fā)送,而不是從文件開始處重新發(fā)送所有內(nèi)容。

backoff: Filebeat檢測(cè)到某個(gè)文件到了EOF之后,每次等待多久再去檢測(cè)文件是否有更新,默認(rèn)為1s。

max_backoff: Filebeat檢測(cè)到某個(gè)文件到了EOF之后,等待檢測(cè)文件更新的最大時(shí)間,默認(rèn)是10秒。

backoff_factor: 定義到達(dá)max_backoff的速度,默認(rèn)因子是2,到達(dá)max_backoff后,變成每次等待max_backoff那么長(zhǎng)的時(shí)間才backoff一次,直到文件有更新才會(huì)重置為backoff。比如:?

如果設(shè)置成1,意味著去使能了退避算法,每隔backoff那么長(zhǎng)的時(shí)間退避一次。

spool_size: spooler的大小,spooler中的事件數(shù)量超過(guò)這個(gè)閾值的時(shí)候會(huì)清空發(fā)送出去(不論是否到達(dá)超時(shí)時(shí)間),默認(rèn)1MB。

idle_timeout: spooler的超時(shí)時(shí)間,如果到了超時(shí)時(shí)間,spooler也會(huì)清空發(fā)送出去(不論是否到達(dá)容量的閾值),默認(rèn)1s。

registry_file: 記錄filebeat處理日志文件的位置的文件

config_dir: 如果要在本配置文件中引入其他位置的配置文件,可以寫在這里(需要寫完整路徑),但是只處理prospector的部分。

publish_async: 是否采用異步發(fā)送模式(實(shí)驗(yàn)功能)。

具體的一個(gè)yml采集配置樣例如下:該配置文件是filebeat采集數(shù)據(jù)的依據(jù),并根據(jù)需求添加必要配置,filebeat收集日志后發(fā)往logstash,配置如下:

cd FILEBEAT_HOME

nohup ./bin/filebeat -f config/test.conf /FILEBEAT_HOME/logs/filebeat.log

后臺(tái)啟動(dòng)filebeat,配置對(duì)應(yīng)的參數(shù)

啟動(dòng)多個(gè)filebeat配置,新建一個(gè)目錄(conf)存放多個(gè)filebeat的配置文件,

#nohup ./bin/filebeat -f conf/* /FILEBEAT_HOME/logs/filebeat.log

注意:一臺(tái)服務(wù)器只能啟動(dòng)一個(gè)filebeat進(jìn)程。

ps -ef |grep filebeat

kill -9 $pid

注意: 非緊急情況下,殺掉進(jìn)程只能用優(yōu)雅方式。

A、filebeat運(yùn)行不成功

問(wèn)題:配置文件格式有問(wèn)題,配置文件遵循yml文件格式, 多或少一個(gè)空格 都會(huì)導(dǎo)致啟動(dòng)問(wèn)題,可以使用cmd命令窗口到filebeat安裝路徑下,使用filebeat.exe –c filebeat.yml 查看報(bào)錯(cuò),也可以看filebeat路徑下的log文件夾中的filebeat文件

B、 filebeat第一次運(yùn)行成功無(wú)數(shù)據(jù)

問(wèn)題:a、路徑有問(wèn)題

b、運(yùn)行條件設(shè)置有問(wèn)題(例如只采集某個(gè)條件下的數(shù)據(jù),文件中沒(méi)有符合條件的數(shù)據(jù),這種情況下先注釋掉采集條件測(cè)試一下)

C、filebeat運(yùn)行成功第一次運(yùn)行后有數(shù)據(jù),第二次無(wú)數(shù)據(jù)

問(wèn)題:filebeat讀取文件后會(huì)生成一個(gè)registry文件,注意windows機(jī)器中這個(gè)文件在手動(dòng)啟動(dòng)的情況下會(huì)在filebeat安裝目錄下的data文件夾中,服務(wù)注冊(cè)啟動(dòng)的情況下會(huì)在C盤下隱藏文件夾C:\ProgramData\filebeat中,刪除掉這個(gè)就可以了

D、filebeat運(yùn)行成功有數(shù)據(jù),但是新添加數(shù)據(jù)不讀取問(wèn)題

問(wèn)題:filebeat傳輸存在反壓機(jī)制,在數(shù)據(jù)量特別大或者傳輸通道不通的情況下,filebeat會(huì)進(jìn)行反壓,暫停發(fā)送,等到數(shù)據(jù)量穩(wěn)定或者數(shù)據(jù)傳輸通道正常的之后才會(huì)發(fā)送

Filebeat 保存每個(gè)文件的狀態(tài)并經(jīng)常將狀態(tài)刷新到磁盤上的注冊(cè)文件中。該狀態(tài)用于記住harvester正在讀取的最后偏移量,并確保發(fā)送所有日志行。如果輸出(例如Elasticsearch或Logstash)無(wú)法訪問(wèn),F(xiàn)ilebeat會(huì)跟蹤最后發(fā)送的行,并在輸出再次可用時(shí)繼續(xù)讀取文件。

在Filebeat運(yùn)行時(shí),每個(gè)prospector內(nèi)存中也會(huì)保存文件狀態(tài)信息,當(dāng)重新啟動(dòng)Filebeat時(shí),將使用注冊(cè)文件的數(shù)據(jù)來(lái)重建文件狀態(tài),F(xiàn)ilebeat將每個(gè)harvester在從保存的最后偏移量繼續(xù)讀取。

每個(gè)prospector為它找到的每個(gè)文件保留一個(gè)狀態(tài)。由于文件可以被重命名或移動(dòng),因此文件名和路徑不足以識(shí)別文件。對(duì)于每個(gè)文件,F(xiàn)ilebeat存儲(chǔ)唯一標(biāo)識(shí)符以檢測(cè)文件是否先前已被采集過(guò)。

如果你使用的案例涉及每天創(chuàng)建大量新文件,你可能會(huì)發(fā)現(xiàn)注冊(cè)文件增長(zhǎng)過(guò)大。請(qǐng)參閱注冊(cè)表文件太大?編輯有關(guān)你可以設(shè)置以解決此問(wèn)題的配置選項(xiàng)的詳細(xì)信息。

Filebeat保證事件至少會(huì)被傳送到配置的輸出一次,并且不會(huì)丟失數(shù)據(jù)。 Filebeat能夠?qū)崿F(xiàn)此行為,因?yàn)樗鼘⒚總€(gè)事件的傳遞狀態(tài)存儲(chǔ)在注冊(cè)文件中。

在輸出阻塞或未確認(rèn)所有事件的情況下,F(xiàn)ilebeat將繼續(xù)嘗試發(fā)送事件,直到接收端確認(rèn)已收到。如果Filebeat在發(fā)送事件的過(guò)程中關(guān)閉,它不會(huì)等待輸出確認(rèn)所有收到事件。

發(fā)送到輸出但在Filebeat關(guān)閉前未確認(rèn)的任何事件在重新啟動(dòng)Filebeat時(shí)會(huì)再次發(fā)送。這可以確保每個(gè)事件至少發(fā)送一次,但最終會(huì)將重復(fù)事件發(fā)送到輸出。

也可以通過(guò)設(shè)置shutdown_timeout選項(xiàng)來(lái)配置Filebeat以在關(guān)閉之前等待特定時(shí)間。

注意:Filebeat的至少一次交付保證包括日志輪換和刪除舊文件的限制。如果將日志文件寫入磁盤并且寫入速度超過(guò)Filebeat可以處理的速度,或者在輸出不可用時(shí)刪除了文件,則可能會(huì)丟失數(shù)據(jù)。

在Linux上,F(xiàn)ilebeat也可能因inode重用而跳過(guò)行。有關(guān)inode重用問(wèn)題的更多詳細(xì)信息,請(qǐng)參閱filebeat常見問(wèn)題解答。

Logback日志切割用的是JDK里File#renameTo()方法。如果該方法失敗,就再嘗試使用復(fù)制數(shù)據(jù)的方式切割日志。查找該方法相關(guān)資料得知,只有當(dāng)源文件和目標(biāo)目錄處于同一個(gè)文件系統(tǒng)、同volumn(即windows下的C, D盤)下該方法才會(huì)成功,切不會(huì)為重命名的后的文件分配新的inode值。也就是說(shuō),如果程序里一直保存著該文件的描述符,那么當(dāng)程序再寫日志時(shí),就會(huì)向重命名后的文件中寫。那么問(wèn)題來(lái)了,filebeat是會(huì)一直打開并保存文件描述符的,那么它是怎么得知日志被切割這件事的呢?

如果只用當(dāng)前文件描述符一路監(jiān)控到天黑的話,那么當(dāng)logback把日志重命名后,filebeat仍然會(huì)監(jiān)控重命名后的日志,新創(chuàng)建的日志文件就看不到了。實(shí)際上,filebeat是通過(guò)close_inactive和scan_frequency兩個(gè)參數(shù)(機(jī)制)來(lái)應(yīng)對(duì)這種情況的:

(1)close_inactive

該參數(shù)指定當(dāng)被監(jiān)控的文件多長(zhǎng)時(shí)間沒(méi)有變化后就關(guān)閉文件句柄(file handle)。官方建議將這個(gè)參數(shù)設(shè)置為一個(gè)比文件最大更新間隔大的值。比如文件最長(zhǎng)5s更新一次,那就設(shè)置成1min。默認(rèn)值為5min。

(2)scan_frequency

該參數(shù)指定Filebeat搜索新文件的頻率(時(shí)間間隔)。當(dāng)發(fā)現(xiàn)新的文件被創(chuàng)建時(shí), Filebeat會(huì)為它再啟動(dòng)一個(gè) harvester 進(jìn)行監(jiān)控,默認(rèn)為10s。

綜合以上兩個(gè)機(jī)制,當(dāng)logback完成日志切割后(即重命名),此時(shí)老的harvester仍然在監(jiān)控重命名后的日志文件,但是由于該文件不會(huì)再更新,因此會(huì)在close_inactive時(shí)間后關(guān)閉這個(gè)文件的 harvester。當(dāng)scan_frequency時(shí)間過(guò)后,F(xiàn)ilebeat會(huì)發(fā)現(xiàn)目錄中出現(xiàn)了新文件,于是為該文件啟動(dòng) harvester 進(jìn)行監(jiān)控。這樣就保證了切割日志時(shí)也能不丟不重的傳輸數(shù)據(jù)。(不重是通過(guò)為每個(gè)日志文件保存offset實(shí)現(xiàn)的)

Golang將日志同時(shí)輸出到控制臺(tái)和文件

日常開發(fā)當(dāng)中需要將golang的log包打印的日志同時(shí)輸出到控制臺(tái)和文件,應(yīng)該如何解決這個(gè)問(wèn)題?

log包可以通過(guò)SetOutput()方法指定日志輸出的方式(Writer),但是只能指定一個(gè)輸出的方式(Writer)。我們利用io.MultiWriter()將多個(gè)Writer拼成一個(gè)Writer使用的特性,把log.Println()輸出的內(nèi)容分流到控制臺(tái)和文件當(dāng)中。

原文地址

大家推薦哪個(gè) golang 的日志框架,說(shuō)說(shuō)理由

glog 這個(gè)是google的日志框架,kubernetes是使用這個(gè)的

inconshreveable/log15這個(gè)是結(jié)構(gòu)化輸出的,之前也有用過(guò)。

Sirupsen/logrus這個(gè)用的也很多,記得docker是有這個(gè)的。

還有很多其他的,你可以github上看看,自己熟悉的就好。

Go語(yǔ)言之log(如何將日志寫到指定文件里面)

對(duì)于Go語(yǔ)言的日志來(lái)說(shuō),如何將log寫到指定的文件里面,下面是一個(gè)例子。

output:

output:

文章題目:go語(yǔ)言日志模塊 go日志收集系統(tǒng)
瀏覽地址:http://muchs.cn/article26/hhspjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)App設(shè)計(jì)、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站、網(wǎng)站排名品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化