Goログログ——logパッケージ

21862 ワード

Goログログ——logパッケージ
http://studygolang.com/articles/9184
        Golang's logsモジュールは主に3種類のインターフェースを提供しています。それぞれ「Print」です 、Panic 、Fatal ”,各種類のインターフェースに対して、3の呼び出し方式を提供しています。それぞれ「XXXX、Xxxln」です。 、Xxxf"は、基本的にfmtの相関関数と同様であり、以下はPrintの例である。
package main

import (
    "log"
)

func main(){
    arr := []int {2,3}
    log.Print("Print array ",arr,"
"
) log.Println("Println array",arr) log.Printf("Printf array with item [%d,%d]
"
,arr[0],arr[1]) }
次のような結果が得られます。
2016/12/15 19:46:19 Print array [2 3]
2016/12/15 19:46:19 Println array [2 3]
2016/12/15 19:46:19 Printf array with item [2,3]
        log.Fatalインターフェースについては、まずログの内容を標準出力に印刷して、システムの os.exit(1) インターフェースは、プログラムを終了して状態1に戻りますが、システムインターフェースを直接起動して終了したため、defer関数が呼び出されません。以下はFatalの例です。
package main

import (
	"fmt"
	"log"
)

func test_deferfatal(){
	defer func() {
		fmt.Println("--first--")
	}()
	log.Fatalln("test for defer Fatal")
}

func main() {
	test_deferfatal()
}
        次のような結果が得られます。
2016/12/15 19:46:45 test for defer Fatal
        defer関数が起動されていないことが分かります。
        log.Panicインターフェースについては、ログの内容を標準エラーにしてからpanic関数を呼び出します。以下はPanicの例です。
package main

import (
	"fmt"
	"log"
)

func test_deferpanic(){
	defer func() {
		fmt.Println("--first--")
		if err := recover(); err != nil {
			fmt.Println(err)
		}
	}()
	log.Panicln("test for defer Panic")
	defer func() {
		fmt.Println("--second--")
	}()
}

func main() {
	test_deferpanic()
}
        次のような結果が得られます。
2016/12/15 19:59:30 test for defer Panic
--first--
test for defer Panic
        まず「test for defer Panic」を出力し、最初のdefer関数が呼び出されて「--first-」を出力したが、2番目のdefer関数は出力されておらず、Panicの後に宣言されたdeferは実行されないことが分かります。
        ロギングタイプもカスタマイズできます。 ロゴ.ロギングはオブジェクトを作成するためのNew方法を提供します。
func New(out io.Writer, prefix string, flag int) *Logger
この関数には全部で三つのパラメータがあります。
(1)出力先outは、io.Writerオブジェクトであり、このオブジェクトは一つのファイルでも良いし、このインターフェースを実現したオブジェクトでもいいです。これを使ってログをどのファイルに出力するかを指定できます。(2)prefixは前にすでに見られました。ログの内容の前にあるものです。「Info」、「Warning」に設定できます。などでログのレベルを区別することができます。(3)フラグはオプションです。ログの先頭を表示するものは、オプションの値があります。
Ldate         = 1 << iota     //    2009/01/23    
Ltime                         //    01:23:23      
Lmicroseconds                 //    01:23:23.123123      
Llongfile                     //          : /a/b/c/d.go:23 
Lshortfile                    //       : d.go:23
LstdFlags     = Ldate | Ltime //      
例は以下の通りです
package main
import (
    "log"
    "os"
)
func main(){
    fileName := "Info_First.log"
    logFile,err  := os.Create(fileName)
    defer logFile.Close()
    if err != nil {
        log.Fatalln("open file error")
    }
    debugLog := log.New(logFile,"[Info]",log.Llongfile)
    debugLog.Println("A Info message here")
    debugLog.SetPrefix("[Debug]")
    debugLog.Println("A Debug Message here ")
}