2014-08-27 2 views
1

내 애플리케이션의 다른 파일에 많은 로거가 기록됩니다. 응용 프로그램이 실행되는 동안 해당 파일을자를 수있는 기능을 추가하려고합니다. 이 날 많은 파일, 쉽게 자원 당 하나에 로그인 할 수 있습니다open os.File 잘라 내기 (액세스가 거부 됨)

type Resource struct { 
    Logger *ResourceLogger 
    // other stuff pertaining to my resource... 
} 

func (r *Resource) SetLogger(logPath string) { 
    path := logPath + r.Name + ".log" 
    f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) 
    if err != nil { 
     log.Fatalf("Unable to open log file '%v'", path) 
    } 
    r.Logger = &ResourceLogger{log.New(f, "", log.Ldate|log.Ltime), f} 
} 

type ResourceLogger struct { 
    *log.Logger 
    LogFile *os.File 
} 

: 여기에 내가 가진 것입니다. 그러나 Resource.Logger.LogFile.Truncate (0)을 사용하려고하면 액세스가 거부되었습니다.

+3

파일 이벤트 감시자 https://github.com/ActiveState/tail/tree/master/watch 같이 https://github.com/ActiveState/tail에 사용 : 여기에 대한 대략적인 예입니다 /blob/master/tail.go#L265-L303 도움이 될까요? – VonC

+0

아 정말 고마워, 고마워! 나는 이것을 곧 조사 할 것이다. – kwolfe

답변

1

나는 당신이 Windows에서 작업하고 있기 때문에, Windows는 그처럼 파일들을 잠그는 토끼를 가지고 있기 때문에. 기본적으로 로그 작성과 자르기를 모두 제어 할 수 있기 때문에 분할 된 파일을 닫은 다음 열려있는 파일 핸들이없는 동안에 잘라낼 수 있습니다.

뮤텍스를 사용하여자를 때 누군가가 로그를 남기지 못하도록하고 뮤직을 끝내고 로그 파일을 다시 열면됩니다. 어쩌면

package main 

import (
    "log" 
    "os" 
    "sync" 
) 

type Resource struct { 
    Logger *ResourceLogger 
    // other stuff pertaining to my resource... 
    Name string 
} 

func (r *Resource) SetLogger(logPath string) { 
    path := logPath + r.Name + ".log" 
    f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) 
    if err != nil { 
     log.Fatalf("Unable to open log file '%v'", path) 
    } 
    r.Logger = &ResourceLogger{log.New(f, "", log.Ldate|log.Ltime), f, path, sync.Mutex{}} 
} 

func (r *ResourceLogger) Truncate() { 
    if r.logger != nil { 
     r.logmutex.Lock() 
     r.logfile.Close() 
     os.Truncate(r.logfilename, 0) // The file must not be open on Windows! 
     f, err := os.OpenFile(r.logfilename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) 
     if err != nil { 
      log.Fatalf("Unable to open log file '%v'", r.logfilename) 
     } 
     r.logger = log.New(f, "", log.Ldate|log.Ltime) 
     r.logfile = f 
     r.logmutex.Unlock() 
    } 
} 

type ResourceLogger struct { 
    logger  *log.Logger 
    logfile  *os.File 
    logfilename string 
    logmutex sync.Mutex 
} 

func (r *ResourceLogger) Println(s string) { 
    r.logmutex.Lock() 
    r.logger.Println(s) 
    r.logmutex.Unlock() 
} 

func main() { 
    r := Resource{} 
    r.Name = "jeejee" 
    r.SetLogger("") 

    r.Logger.Println("test one") 
    for { 
     r.Logger.Println("more logging") 
     r.Logger.Truncate() 
    } 
}