1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package klog
20
21 import (
22 "errors"
23 "fmt"
24 "os"
25 "path/filepath"
26 "strings"
27 "sync"
28 "time"
29 )
30
31
32 var MaxSize uint64 = 1024 * 1024 * 1800
33
34
35 var logDirs []string
36
37 func createLogDirs() {
38 if logging.logDir != "" {
39 logDirs = append(logDirs, logging.logDir)
40 }
41 logDirs = append(logDirs, os.TempDir())
42 }
43
44 var (
45 pid = os.Getpid()
46 program = filepath.Base(os.Args[0])
47 host = "unknownhost"
48 userName = "unknownuser"
49 userNameOnce sync.Once
50 )
51
52 func init() {
53 if h, err := os.Hostname(); err == nil {
54 host = shortHostname(h)
55 }
56 }
57
58
59
60 func shortHostname(hostname string) string {
61 if i := strings.Index(hostname, "."); i >= 0 {
62 return hostname[:i]
63 }
64 return hostname
65 }
66
67
68
69 func logName(tag string, t time.Time) (name, link string) {
70 name = fmt.Sprintf("%s.%s.%s.log.%s.%04d%02d%02d-%02d%02d%02d.%d",
71 program,
72 host,
73 getUserName(),
74 tag,
75 t.Year(),
76 t.Month(),
77 t.Day(),
78 t.Hour(),
79 t.Minute(),
80 t.Second(),
81 pid)
82 return name, program + "." + tag
83 }
84
85 var onceLogDirs sync.Once
86
87
88
89
90
91
92
93 func create(tag string, t time.Time, startup bool) (f *os.File, filename string, err error) {
94 if logging.logFile != "" {
95 f, err := openOrCreate(logging.logFile, startup)
96 if err == nil {
97 return f, logging.logFile, nil
98 }
99 return nil, "", fmt.Errorf("log: unable to create log: %v", err)
100 }
101 onceLogDirs.Do(createLogDirs)
102 if len(logDirs) == 0 {
103 return nil, "", errors.New("log: no log dirs")
104 }
105 name, link := logName(tag, t)
106 var lastErr error
107 for _, dir := range logDirs {
108 fname := filepath.Join(dir, name)
109 f, err := openOrCreate(fname, startup)
110 if err == nil {
111 symlink := filepath.Join(dir, link)
112 _ = os.Remove(symlink)
113 _ = os.Symlink(name, symlink)
114 return f, fname, nil
115 }
116 lastErr = err
117 }
118 return nil, "", fmt.Errorf("log: cannot create log: %v", lastErr)
119 }
120
121
122
123 func openOrCreate(name string, startup bool) (*os.File, error) {
124 if startup {
125 f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
126 return f, err
127 }
128 f, err := os.Create(name)
129 return f, err
130 }
131
View as plain text