Golang 에서 log 사용 하기(1):Golang 표준 라 이브 러 리 에서 제공 하 는 Log

Golang 의 표준 라 이브 러 리 는 log 의 체 제 를 제공 하지만 이 모듈 의 기능 은 비교적 간단 하 다(간단 해 보이 지만 사실은 그 는 그의 디자인 방향 이 있다).하지만 손 으로 쓴 fmt.Printxxx 보다 훨씬 낫다.적어도 출력 위치 에서 스 레 드 안전 보 호 를 했 습 니 다.그 공식 매 뉴 얼 은 Golang log 를 참조 하 세 요.간단 한 예 를 들 어 보 겠 습 니 다.
package main
import (
    "log"
)
func main(){
    log.Fatal("Come with fatal,exit with 1 
") }

컴 파일 이 실행 되면 프로그램 이 인쇄 된 것Come with fatal,exit with 1을 보고 종료 합 니 다.echo $?으로 종료 코드 를 보면'1'입 니 다.
일반 인터페이스
Golang's log 모듈 은 주로 3 가지 인 터 페 이 스 를 제공 합 니 다.각각'프린트,패 닉,파 탈'이다.물론 사용 하기 전에 로그 백 을 먼저 포함 합 니 다.
import(
    "log"
)

사용 하기 편 하도록 Golang 은 Python 과 마찬가지 로 인 터 페 이 스 를 제공 할 때 간단 한 패키지 등급 의 사용 인 터 페 이 스 를 제공 합 니 다.Python 과 달리 출력 기본 위치 가 표준 오류SetOutput로 변경 할 수 있 습 니 다.
각 종류의 인터페이스 에 대해 3 중 호출 방식 을 제 공 했 는데 그것 이 바로'Xxxx,Xxxxln,Xxxxf'이다.예 를 들 어 Print 에 대해 다음 과 같다.
log.Print
log.Printf
log.Println
  • log.Print:그 매개 변수의 호출 방식 은fmt.Print과 유사 하 다 는 것 을 나타 낸다.즉,출력 대상 이 특별한 표지 기 호 를 지정 하지 않 아 도 된다 는 것 이다.
  • log.Printf:매개 변수의 호출 방식 과fmt.Printf가 유사 하 다 는 것 을 나타 낸다.즉,C 시리즈 의 포맷 표지 로 출력 대상 의 유형 을 표시 할 수 있 고 구체 적 인 유형 은 fmt.Printf 의 문서
  • 를 참고 할 수 있다.
  • log.Println:호출 방식 이fmt.Println와 유사 하 다 는 뜻 입 니 다.log.Print 와 대체적으로 일치 합 니 다.출력 할 때 한 줄 더 출력 합 니 다
  • '프린트'로 구체 적 으로 설명 한 것 으로,'패 닉'과'패 럴'에 대해 서도 마찬가지다.다음은"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]) }

    다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
    2014/05/02 12:27:19 Print array [2 3]
    2014/05/02 12:27:19 Println array [2 3]
    2014/05/02 12:27:19 Printf array with item [2,3]

    출력 에 있 는 날짜 와 시간 은 기본 형식 입 니 다.간단 한 인 터 페 이 스 를 직접 호출 하면 형식 이 고정 되 어 있 습 니 다.SetFlags방법 으로 수정 할 수 있 습 니 다.또한 여기 서 출력 한 내용(log.Print 의 내용 전달)앞 과 시간의 뒤 가 비어 있 습 니 다.이것 도 기본 적 인 행동 입 니 다.우 리 는 접 두 사 를 추가 해서"Warnning"이나"Debug"로 그 를 표시 할 수 있 습 니 다.사용SetPrefix을 통 해 이 접 두 사 를 설정 할 수 있 습 니 다.SetOutputSetFlagsSetPrefix이곳 은 관계 가 크 지 않 으 므 로 먼저 설명 하지 않 고 뒤에 남 겨 서 Logger 유형 중 하 나 를 함께 설명 한다.log.PrintXxx인 터 페 이 스 를 보고log.FatalXxx인 터 페 이 스 를 살 펴 보 자.우 리 는log.Fatal을 예 로 들 어 그 기능 을 소개 한다.처음에 보 았 던 예 를 들 어 호출log.Fatal인 터 페 이 스 를 호출 한 후에 로그 내용 을 표준 출력 에 인쇄 한 다음 에 시스템os.exit(1)인 터 페 이 스 를 호출 하고 프로그램 을 종료 하여'1'상태 로 돌아 갑 니 다.
    비교적 복잡 한 것 은log.PanicXxx이 함수 의 설명 을 보면 로그 내용 을 표준 오류 로 옮 긴 후에 호출panic함수(Golan 의 defer-recover-panic 체 제 를 잘 모 르 면 Golang Blog 에서 배 울 수 있 습 니 다)입 니 다.여기 서 자주 사용 하 는 예 를 들 자.
    package main
    import (
        "log"
        "fmt"
    )
    func main(){
        defer func(){
            if e:= recover();e!= nil {
                fmt.Println("Just comming recover")
                fmt.Println("e from recover is :",e)
                fmt.Println("After recover")
            }
        }()
        arr := []int {2,3}
        log.Panic("Print array ",arr,"
    ") }

    결 과 는:
    2014/05/03 13:52:42 Print array [2 3]
    Just comming recover
    e from recover is : Print array [2 3]
    After recover

    결 과 를 통 해 알 수 있 듯 이 로 그 를 표준 출력 에 넣 고 defer 안의 recover 를 통 해 panic 의 내용 을 캡 처 하 는 것 입 니 다.
    사용자 정의 Logger 형식
    'Print,Panic,Fatal'을 정리 한 후에 우 리 는 유형 을 소개 하기 쉽다log.Logger.이 형식 은 대상 을 만 드 는 새로운 방법 을 제공 합 니 다.
    func New(out io.Writer, prefix string, flag int) *Logger

    초기 화 조건 은 로그 에 기 록 된 위치 out,로그 의 접두사 내용 prefix,로그 의 내용 flag 입 니 다.위 에서 소개 한SetOutputSetFlagsSetPrefix을 통 해 순서대로 설치 할 수 있다.
  • 출력 위치 out 은 io.Writer 대상 입 니 다.이 대상 은 파일 일 수도 있 고 이 인 터 페 이 스 를 실현 하 는 대상 일 수도 있 습 니 다.보통 이 걸 로 출력 할 파일 을 지정 할 수 있 습 니 다
  • prefix 앞에서 보 았 습 니 다.로그 내용 앞 에 있 는 내용 입 니 다.로그 단 계 를 구분 하 는 데 도움 을 주 는'[Info]','[Warning]'등 으로 설정 할 수 있 습 니 다.
  • flags 는 비교적 혼 란 스 럽 습 니 다.사실은 하나의 옵션 입 니 다.선택 할 수 있 는 값 은 다음 과 같 습 니 다.
  • Ldate         = 1 << iota     // the date: 2009/01/23    2009/01/23    
    Ltime                         // the time: 01:23:23      01:23:23      
    Lmicroseconds                 // microsecond resolution: 01:23:23.123123.    01:23:23.123123      
    Llongfile                     // full file name and line number: /a/b/c/d.go:23          
    Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile       
    LstdFlags     = Ldate | Ltime //      

    로그 내용 의 시작 을 표시 합 니 다.로그 고 개 를 들 어 관련 내용 을 출력 합 니 다.위의 기본 형식 은 LstdFlags 에서 날짜 와 시간 을 출력 하 는 것 입 니 다.
    이 방법 은 위 와 같은 동명 의 방법 도 정의 했다.
    func (l *Logger) Print(v ...interface{})
    func (l *Logger) Printf(format string, v ...interface{})
    func (l *Logger) Println(v ...interface{})
    func (l *Logger) Fatal(v ...interface{})
    func (l *Logger) Fatalf(format string, v ...interface{})
    func (l *Logger) Fatalln(v ...interface{})
    func (l *Logger) Panic(v ...interface{})
    func (l *Logger) Panicf(format string, v ...interface{})
    func (l *Logger) Panicln(v ...interface{})
    func (l *Logger) Flags() int
    func (l *Logger) Prefix() string
    func (l *Logger) SetFlags(flag int)
    func (l *Logger) SetPrefix(prefix string)

    이 중'Print,Panic,Fatal'계열 함 수 는 기 존 에 소 개 된 것 과 마찬가지 로 Flags 와 Prefix 는 각각 log.Logger 의 현재 로그 고 개 를 들 고 접 두 사 를 얻 을 수 있 습 니 다.SetFlags,SetPrefix 는 로그 의 머리 와 접 두 사 를 설정 할 수 있 습 니 다.
    인 스 턴 스 사용
    마지막 으로 로그 모듈 이 debug 로 그 를 파일 에 인쇄 하 는 실례 를 보 았 습 니 다.
    package main
    import (
        "log"
        "os"
    )
    func main(){
        fileName := "xxx_debug.log"
        logFile,err  := os.Create(fileName)
        defer logFile.Close()
        if err != nil {
            log.Fatalln("open file error !")
        }
        debugLog := log.New(logFile,"[Debug]",log.Llongfile)
        debugLog.Println("A debug message here")
        debugLog.SetPrefix("[Info]")
        debugLog.Println("A Info Message here ")
        debugLog.SetFlags(debugLog.Flags() | log.LstdFlags)
        debugLog.Println("A different prefix")
    }

    실행 후 로그 파일 을 열 면 로그 내용 을 볼 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기