@@ -116,32 +116,48 @@ var onceLogDirs sync.Once
116
116
// contains tag ("INFO", "FATAL", etc.) and t. If the file is created
117
117
// successfully, create also attempts to update the symlink for that tag, ignoring
118
118
// errors.
119
- func create (tag string , t time.Time ) (f * os.File , filename string , err error ) {
119
+ func create (tag string , t time.Time , dir string ) (f * os.File , filename string , err error ) {
120
+ if dir != "" {
121
+ f , name , err := createInDir (dir , tag , t )
122
+ if err == nil {
123
+ return f , name , err
124
+ }
125
+ return nil , "" , fmt .Errorf ("log: cannot create log: %v" , err )
126
+ }
127
+
120
128
onceLogDirs .Do (createLogDirs )
121
129
if len (logDirs ) == 0 {
122
130
return nil , "" , errors .New ("log: no log dirs" )
123
131
}
124
- name , link := logName (tag , t )
125
132
var lastErr error
126
133
for _ , dir := range logDirs {
127
- fname := filepath .Join (dir , name )
128
- f , err := os .Create (fname )
134
+ f , name , err := createInDir (dir , tag , t )
129
135
if err == nil {
130
- symlink := filepath .Join (dir , link )
131
- os .Remove (symlink ) // ignore err
132
- os .Symlink (name , symlink ) // ignore err
133
- if * logLink != "" {
134
- lsymlink := filepath .Join (* logLink , link )
135
- os .Remove (lsymlink ) // ignore err
136
- os .Symlink (fname , lsymlink ) // ignore err
137
- }
138
- return f , fname , nil
136
+ return f , name , err
139
137
}
140
138
lastErr = err
141
139
}
142
140
return nil , "" , fmt .Errorf ("log: cannot create log: %v" , lastErr )
143
141
}
144
142
143
+ func createInDir (dir , tag string , t time.Time ) (f * os.File , name string , err error ) {
144
+ name , link := logName (tag , t )
145
+ fname := filepath .Join (dir , name )
146
+ f , err = os .Create (fname )
147
+ if err == nil {
148
+ symlink := filepath .Join (dir , link )
149
+ os .Remove (symlink ) // ignore err
150
+ os .Symlink (name , symlink ) // ignore err
151
+ if * logLink != "" {
152
+ lsymlink := filepath .Join (* logLink , link )
153
+ os .Remove (lsymlink ) // ignore err
154
+ os .Symlink (fname , lsymlink ) // ignore err
155
+ }
156
+ return f , fname , nil
157
+ }
158
+ return nil , "" , err
159
+ }
160
+
145
161
// flushSyncWriter is the interface satisfied by logging destinations.
146
162
type flushSyncWriter interface {
147
163
Flush () error
@@ -281,7 +297,7 @@ const footer = "\nCONTINUED IN NEXT FILE\n"
281
297
func (sb * syncBuffer ) rotateFile (now time.Time ) error {
282
298
var err error
283
299
pn := "<none>"
284
- file , name , err := create (sb .sev .String (), now )
300
+ file , name , err := create (sb .sev .String (), now , "" )
285
301
sb .madeAt = now
286
302
287
303
if sb .file != nil {
0 commit comments