Skip to content

Commit bc029aa

Browse files
committed
Allow other processes to read from log file while FileTraceWriter is writing.
1 parent 8e85ebf commit bc029aa

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/WebJobs.Script/Diagnostics/FileTraceWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ protected virtual void AppendLine(TraceEvent traceEvent, string line)
276276

277277
private static void AppendToFile(FileInfo fileInfo, string content)
278278
{
279-
var fs = fileInfo.Open(FileMode.Open, FileAccess.Write, FileShare.Write);
279+
var fs = fileInfo.Open(FileMode.Open, FileAccess.Write, FileShare.ReadWrite);
280280
fs.Seek(0, SeekOrigin.End);
281281

282282
using (var sw = new StreamWriter(fs))

test/WebJobs.Script.Tests/Diagnostics/FileTraceWriterTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,34 @@ public async Task Trace_LogFileDeleted_CreatesNewFile()
283283
Assert.True(logLine.EndsWith("[Info] test trace"));
284284
}
285285

286+
[Fact]
287+
public void Trace_LogFileOpened_WritesSuccessfully()
288+
{
289+
var traceWriter = new TestFileTraceWriter(_logFilePath, TraceLevel.Info, LogType.Host, true);
290+
291+
traceWriter.Info("test trace");
292+
traceWriter.Flush();
293+
294+
var directory = new DirectoryInfo(_logFilePath);
295+
var logFile = directory.EnumerateFiles().Single();
296+
297+
// open the log file with ReadWrite to make sure logging
298+
// is still possible
299+
var logFileStream = logFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
300+
301+
traceWriter.Info("test trace 2");
302+
traceWriter.Flush();
303+
304+
logFileStream.Close();
305+
306+
// verify that both lines were written successfully
307+
var fileLines = File.ReadAllLines(logFile.FullName);
308+
Assert.Equal(2, fileLines.Length);
309+
Assert.Collection(fileLines,
310+
t => Assert.EndsWith("test trace", t),
311+
t => Assert.EndsWith("test trace 2", t));
312+
}
313+
286314
private void WriteLogs(string logFilePath, int numLogs, Action<bool, object> flushCallback = null, bool disableTimers = true, object state = null)
287315
{
288316
FileTraceWriter traceWriter = new TestFileTraceWriter(logFilePath, TraceLevel.Verbose, LogType.Host, disableTimers, flushCallback, state);

0 commit comments

Comments
 (0)