@@ -145,11 +145,20 @@ public void Stop()
145
145
146
146
if ( RedirectMode && Conf . WaitSecondsForWorkerToExit > 0 && NotifyToExit ( proc ) )
147
147
{
148
+ lock ( OutLock )
149
+ {
150
+ CloseLogWriter ( ) ;
151
+ }
148
152
return ;
149
153
}
150
154
151
155
proc . KillTree ( Info ) ;
152
156
}
157
+
158
+ lock ( OutLock )
159
+ {
160
+ CloseLogWriter ( ) ;
161
+ }
153
162
}
154
163
155
164
private bool NotifyToExit ( Process proc )
@@ -247,24 +256,84 @@ private void WriteOutput(string data)
247
256
return ;
248
257
}
249
258
250
- var outFile = Path . Combine ( Conf . OutFileDir , $ "{ DateTime . Now : yyyy-MM-dd} .log") ;
259
+ WriteLineToLogFile ( data ) ;
260
+
251
261
try
252
262
{
253
- Libs . WriteLineToFile ( outFile , data , true ) ;
263
+ Libs . WriteLineToFile ( Conf . LastLineFile , data , false ) ;
264
+ }
265
+ catch ( Exception e )
266
+ {
267
+ Error ( $ "Failed to write Worker's output to `{ Conf . LastLineFile } `: { e . Message } ") ;
268
+ }
269
+ }
270
+
271
+ private string logFile = null ;
272
+
273
+ private StreamWriter logWriter = null ;
274
+
275
+ private void GetStreamWriter ( )
276
+ {
277
+ if ( logFile == null )
278
+ {
279
+ logFile = $ "{ DateTime . Now : yyyy-MM-dd} .log";
280
+ logWriter = new StreamWriter ( Path . Combine ( Conf . OutFileDir , logFile ) , true ) ;
281
+ return ;
282
+ }
283
+
284
+ var curLogFile = $ "{ DateTime . Now : yyyy-MM-dd} .log";
285
+ if ( curLogFile != logFile )
286
+ {
287
+ logWriter . Close ( ) ;
288
+ logFile = curLogFile ;
289
+ logWriter = new StreamWriter ( Path . Combine ( Conf . OutFileDir , logFile ) , true ) ;
290
+ }
291
+ }
292
+
293
+ private void WriteLineToLogFile ( string line )
294
+ {
295
+ try
296
+ {
297
+ GetStreamWriter ( ) ;
254
298
}
255
299
catch ( Exception ex )
256
300
{
257
- Error ( $ "Failed to write Worker's output to `{ outFile } `: { ex . Message } ") ;
301
+ Error ( $ "Failed to get stream writer for logging: { ex . Message } ") ;
302
+ logFile = null ;
303
+ logWriter = null ;
304
+ return ;
258
305
}
259
306
260
307
try
261
308
{
262
- Libs . WriteLineToFile ( Conf . LastLineFile , data , false ) ;
309
+ logWriter . WriteLine ( line ) ;
310
+ logWriter . Flush ( ) ;
263
311
}
264
- catch ( Exception e )
312
+ catch ( Exception ex )
265
313
{
266
- Error ( $ "Failed to write Worker's output to `{ Conf . LastLineFile } `: { e . Message } ") ;
314
+ Error ( $ "Failed to write line to log file: { ex . Message } ") ;
315
+ CloseLogWriter ( ) ;
316
+ }
317
+ }
318
+
319
+ private void CloseLogWriter ( )
320
+ {
321
+ if ( logWriter == null )
322
+ {
323
+ return ;
324
+ }
325
+
326
+ try
327
+ {
328
+ logWriter . Close ( ) ;
329
+ }
330
+ catch ( Exception ex )
331
+ {
332
+ Error ( $ "Failed to close stream writer of logging file: { ex . Message } ") ;
267
333
}
334
+
335
+ logFile = null ;
336
+ logWriter = null ;
268
337
}
269
338
270
339
private void DeleteLoop ( )
0 commit comments