@@ -116,32 +116,48 @@ var onceLogDirs sync.Once
116116// contains tag ("INFO", "FATAL", etc.) and t. If the file is created
117117// successfully, create also attempts to update the symlink for that tag, ignoring
118118// 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+
120128 onceLogDirs .Do (createLogDirs )
121129 if len (logDirs ) == 0 {
122130 return nil , "" , errors .New ("log: no log dirs" )
123131 }
124- name , link := logName (tag , t )
125132 var lastErr error
126133 for _ , dir := range logDirs {
127- fname := filepath .Join (dir , name )
128- f , err := os .Create (fname )
134+ f , name , err := createInDir (dir , tag , t )
129135 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
139137 }
140138 lastErr = err
141139 }
142140 return nil , "" , fmt .Errorf ("log: cannot create log: %v" , lastErr )
143141}
144142
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+
145161// flushSyncWriter is the interface satisfied by logging destinations.
146162type flushSyncWriter interface {
147163 Flush () error
@@ -281,7 +297,7 @@ const footer = "\nCONTINUED IN NEXT FILE\n"
281297func (sb * syncBuffer ) rotateFile (now time.Time ) error {
282298 var err error
283299 pn := "<none>"
284- file , name , err := create (sb .sev .String (), now )
300+ file , name , err := create (sb .sev .String (), now , "" )
285301 sb .madeAt = now
286302
287303 if sb .file != nil {
0 commit comments