/
lazyfile.go
52 lines (45 loc) · 910 Bytes
/
lazyfile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package iostream
import (
"fmt"
"io"
"os"
"path"
)
type layzeFile struct {
name string
f io.WriteCloser
}
func NewLazyFile(filename string) io.WriteCloser {
// FIXME: check filename
return &layzeFile{name: filename}
}
func (f *layzeFile) Write(bs []byte) (int, error) {
if f.f == nil {
if err := f.create(); err != nil {
fmt.Fprintf(os.Stderr, "failed to create log file %s: %v", f.name, err)
os.Stderr.Write(bs)
return 0, err
}
}
return f.f.Write(bs)
}
func (f *layzeFile) Close() error {
if f.f != nil {
return f.f.Close()
}
return nil
}
func (f *layzeFile) create() error {
err := os.MkdirAll(path.Dir(f.name), os.ModePerm)
if err != nil {
return err
}
f.f, err = os.Create(f.name)
return err
}
func NewFileRedirector(name string) *StdWriters {
return &StdWriters{
Stdout: NewLazyFile(name + ".stdout.log"),
Stderr: NewLazyFile(name + ".stderr.log"),
}
}