在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ 12.1 應(yīng)用日志
7 文本處理
3 Web基礎(chǔ)
14 擴(kuò)展Web框架
10.4 小結(jié)
2.2 Go基礎(chǔ)
2.8 總結(jié)
6.1 session和cookie
5.5 使用beedb庫進(jìn)行ORM開發(fā)
8.3 REST
13.6 小結(jié)
5.4 使用PostgreSQL數(shù)據(jù)庫
14.6 pprof支持
14.1 靜態(tài)文件支持
11.2 使用GDB調(diào)試
7.7 小結(jié)
1 GO環(huán)境配置
14.5 多語言支持
7.1 XML處理
1.5 總結(jié)
13 如何設(shè)計(jì)一個(gè)Web框架
14.3 表單及驗(yàn)證支持
12 部署與維護(hù)
10 國(guó)際化和本地化
1.1 Go 安裝
6.2 Go如何使用session
5.6 NOSQL數(shù)據(jù)庫操作
6.5 小結(jié)
9.4 避免SQL注入
12.1 應(yīng)用日志
4.2 驗(yàn)證表單的輸入
10.1 設(shè)置默認(rèn)地區(qū)
1.3 Go 命令
9.6 加密和解密數(shù)據(jù)
4.1 處理表單的輸入
4.4 防止多次遞交表單
11.3 Go怎么寫測(cè)試用例
8 Web服務(wù)
12.3 應(yīng)用部署
5.7 小結(jié)
12.5 小結(jié)
11 錯(cuò)誤處理,調(diào)試和測(cè)試
9.2 確保輸入過濾
14.2 Session支持
6.4 預(yù)防session劫持
12.4 備份和恢復(fù)
8.1 Socket編程
13.1 項(xiàng)目規(guī)劃
13.4 日志和配置設(shè)計(jì)
7.6 字符串處理
13.2 自定義路由器設(shè)計(jì)
6.3 session存儲(chǔ)
3.4 Go的http包詳解
8.2 WebSocket
10.3 國(guó)際化站點(diǎn)
7.5 文件操作
7.4 模板處理
9.1 預(yù)防CSRF攻擊
13.3 controller設(shè)計(jì)
2.6 interface
14.4 用戶認(rèn)證
2.3 流程和函數(shù)
附錄A 參考資料
11.1 錯(cuò)誤處理
9.5 存儲(chǔ)密碼
9.3 避免XSS攻擊
12.2 網(wǎng)站錯(cuò)誤處理
6 session和數(shù)據(jù)存儲(chǔ)
2.4 struct類型
3.3 Go如何使得Web工作
2.5 面向?qū)ο?/span>
3.1 Web工作方式
1.2 GOPATH與工作空間
2.1 你好,Go
9.7 小結(jié)
13.5 實(shí)現(xiàn)博客的增刪改
7.2 JSON處理
10.2 本地化資源
7.3 正則處理
2 Go語言基礎(chǔ)
5.1 database/sql接口
4.5 處理文件上傳
8.5 小結(jié)
4.3 預(yù)防跨站腳本
5.3 使用SQLite數(shù)據(jù)庫
14.7 小結(jié)
3.2 Go搭建一個(gè)Web服務(wù)器
2.7 并發(fā)
5 訪問數(shù)據(jù)庫
4 表單
3.5 小結(jié)
1.4 Go開發(fā)工具
11.4 小結(jié)
9 安全與加密
5.2 使用MySQL數(shù)據(jù)庫
4.6 小結(jié)
8.4 RPC

12.1 應(yīng)用日志

我們期望開發(fā)的Web應(yīng)用程序能夠把整個(gè)程序運(yùn)行過程中出現(xiàn)的各種事件一一記錄下來,Go語言中提供了一個(gè)簡(jiǎn)易的log包,我們使用該包可以方便的實(shí)現(xiàn)日志記錄的功能,這些日志都是基于fmt包的打印再結(jié)合panic之類的函數(shù)來進(jìn)行一般的打印、拋出錯(cuò)誤處理。Go目前標(biāo)準(zhǔn)包只是包含了簡(jiǎn)單的功能,如果我們想把我們的應(yīng)用日志保存到文件,然后又能夠結(jié)合日志實(shí)現(xiàn)很多復(fù)雜的功能(編寫過Java或者C++的讀者應(yīng)該都使用過log4j和log4cpp之類的日志工具),可以使用第三方開發(fā)的一個(gè)日志系統(tǒng),https://github.com/cihub/seelog,它實(shí)現(xiàn)了很強(qiáng)大的日志功能。接下來我們介紹如何通過該日志系統(tǒng)來實(shí)現(xiàn)我們應(yīng)用的日志功能。

seelog介紹

seelog是用Go語言實(shí)現(xiàn)的一個(gè)日志系統(tǒng),它提供了一些簡(jiǎn)單的函數(shù)來實(shí)現(xiàn)復(fù)雜的日志分配、過濾和格式化。主要有如下特性:

  • XML的動(dòng)態(tài)配置,可以不用重新編譯程序而動(dòng)態(tài)的加載配置信息
  • 支持熱更新,能夠動(dòng)態(tài)改變配置而不需要重啟應(yīng)用
  • 支持多輸出流,能夠同時(shí)把日志輸出到多種流中、例如文件流、網(wǎng)絡(luò)流等
  • 支持不同的日志輸出

    • 命令行輸出
    • 文件輸出
    • 緩存輸出
    • 支持log rotate
    • SMTP郵件

上面只列舉了部分特性,seelog是一個(gè)特別強(qiáng)大的日志處理系統(tǒng),詳細(xì)的內(nèi)容請(qǐng)參看官方wiki。接下來我將簡(jiǎn)要介紹一下如何在項(xiàng)目中使用它:

首先安裝seelog

go get -u github.com/cihub/seelog

然后我們來看一個(gè)簡(jiǎn)單的例子:

package main

import log "github.com/cihub/seelog"

func main() {
    defer log.Flush()
    log.Info("Hello from Seelog!")
}

編譯后運(yùn)行如果出現(xiàn)了Hello from seelog,說明seelog日志系統(tǒng)已經(jīng)成功安裝并且可以正常運(yùn)行了。

基于seelog的自定義日志處理

seelog支持自定義日志處理,下面是我基于它自定義的日志處理包的部分內(nèi)容:

package logs

import (
    "errors"
    "fmt"
    seelog "github.com/cihub/seelog"
    "io"
)

var Logger seelog.LoggerInterface

func loadAppConfig() {
    appConfig := `
<seelog minlevel="warn">
    <outputs formatid="common">
        <rollingfile type="size" filename="/data/logs/roll.log" maxsize="100000" maxrolls="5"/>
        <filter levels="critical">
            <file path="/data/logs/critical.log" formatid="critical"/>
            <smtp formatid="criticalemail" senderaddress="astaxie@gmail.com" sendername="ShortUrl API" hostname="smtp.gmail.com" hostport="587" username="mailusername" password="mailpassword">
                <recipient address="xiemengjun@gmail.com"/>
            </smtp>
        </filter>
    </outputs>
    <formats>
        <format id="common" format="%Date/%Time [%LEV] %Msg%n" />
        <format id="critical" format="%File %FullPath %Func %Msg%n" />
        <format id="criticalemail" format="Critical error on our server!\n    %Time %Date %RelFile %Func %Msg \nSent by Seelog"/>
    </formats>
</seelog>
`
    logger, err := seelog.LoggerFromConfigAsBytes([]byte(appConfig))
    if err != nil {
        fmt.Println(err)
        return
    }
    UseLogger(logger)
}

func init() {
    DisableLog()
    loadAppConfig()
}

// DisableLog disables all library log output
func DisableLog() {
    Logger = seelog.Disabled
}

// UseLogger uses a specified seelog.LoggerInterface to output library log.
// Use this func if you are using Seelog logging system in your app.
func UseLogger(newLogger seelog.LoggerInterface) {
    Logger = newLogger
}

上面主要實(shí)現(xiàn)了三個(gè)函數(shù),

  • DisableLog

    初始化全局變量Logger為seelog的禁用狀態(tài),主要為了防止Logger被多次初始化

  • loadAppConfig

    根據(jù)配置文件初始化seelog的配置信息,這里我們把配置文件通過字符串讀取設(shè)置好了,當(dāng)然也可以通過讀取XML文件。里面的配置說明如下:

    • seelog

      minlevel參數(shù)可選,如果被配置,高于或等于此級(jí)別的日志會(huì)被記錄,同理maxlevel。
    • outputs

      輸出信息的目的地,這里分成了兩份數(shù)據(jù),一份記錄到log rotate文件里面。另一份設(shè)置了filter,如果這個(gè)錯(cuò)誤級(jí)別是critical,那么將發(fā)送報(bào)警郵件。
    • formats

      定義了各種日志的格式
  • UseLogger

    設(shè)置當(dāng)前的日志器為相應(yīng)的日志處理

上面我們定義了一個(gè)自定義的日志處理包,下面就是使用示例:

package main

import (
    "net/http"
    "project/logs"
    "project/configs"
    "project/routes"
)

func main() {
    addr, _ := configs.MainConfig.String("server", "addr")
    logs.Logger.Info("Start server at:%v", addr)
    err := http.ListenAndServe(addr, routes.NewMux())
    logs.Logger.Critical("Server err:%v", err)
}

發(fā)生錯(cuò)誤發(fā)送郵件

上面的例子解釋了如何設(shè)置發(fā)送郵件,我們通過如下的smtp配置用來發(fā)送郵件:

<smtp formatid="criticalemail" senderaddress="astaxie@gmail.com" sendername="ShortUrl API" hostname="smtp.gmail.com" hostport="587" username="mailusername" password="mailpassword">
    <recipient address="xiemengjun@gmail.com"/>
</smtp>

郵件的格式通過criticalemail配置,然后通過其他的配置發(fā)送郵件服務(wù)器的配置,通過recipient配置接收郵件的用戶,如果有多個(gè)用戶可以再添加一行。

要測(cè)試這個(gè)代碼是否正常工作,可以在代碼中增加類似下面的一個(gè)假消息。不過記住過后要把它刪除,否則上線之后就會(huì)收到很多垃圾郵件。

logs.Logger.Critical("test Critical message")

現(xiàn)在,只要我們的應(yīng)用在線上記錄一個(gè)Critical的信息,你的郵箱就會(huì)收到一個(gè)Email,這樣一旦線上的系統(tǒng)出現(xiàn)問題,你就能立馬通過郵件獲知,就能及時(shí)的進(jìn)行處理。

使用應(yīng)用日志

對(duì)于應(yīng)用日志,每個(gè)人的應(yīng)用場(chǎng)景可能會(huì)各不相同,有些人利用應(yīng)用日志來做數(shù)據(jù)分析,有些人利用應(yīng)用日志來做性能分析,有些人來做用戶行為分析,還有些就是純粹的記錄,以方便應(yīng)用出現(xiàn)問題的時(shí)候輔助查找問題。

舉一個(gè)例子,我們需要跟蹤用戶嘗試登陸系統(tǒng)的操作。這里會(huì)把成功與不成功的嘗試都記錄下來。記錄成功的使用"Info"日志級(jí)別,而不成功的使用"warn"級(jí)別。如果想查找所有不成功的登陸,我們可以利用linux的grep之類的命令工具,如下:

# cat /data/logs/roll.log | grep "failed login"
2012-12-11 11:12:00 WARN : failed login attempt from 11.22.33.44 username password

通過這種方式我們就可以很方便的查找相應(yīng)的信息,這樣有利于我們針對(duì)應(yīng)用日志做一些統(tǒng)計(jì)和分析。另外我們還需要考慮日志的大小,對(duì)于一個(gè)高流量的Web應(yīng)用來說,日志的增長(zhǎng)是相當(dāng)可怕的,所以我們?cè)趕eelog的配置文件里面設(shè)置了logrotate,這樣就能保證日志文件不會(huì)因?yàn)椴粩嘧兇蠖鴮?dǎo)致我們的磁盤空間不夠引起問題。

小結(jié)

通過上面對(duì)seelog系統(tǒng)及如何基于它進(jìn)行自定義日志系統(tǒng)的學(xué)習(xí),現(xiàn)在我們可以很輕松的隨需構(gòu)建一個(gè)合適的功能強(qiáng)大的日志處理系統(tǒng)了。日志處理系統(tǒng)為數(shù)據(jù)分析提供了可靠的數(shù)據(jù)源,比如通過對(duì)日志的分析,我們可以進(jìn)一步優(yōu)化系統(tǒng),或者應(yīng)用出現(xiàn)問題時(shí)方便查找定位問題,另外seelog也提供了日志分級(jí)功能,通過對(duì)minlevel的配置,我們可以很方便的設(shè)置測(cè)試或發(fā)布版本的輸出消息級(jí)別。