diff --git a/src/NLog/Targets/FileTarget.cs b/src/NLog/Targets/FileTarget.cs index af0a91a4f6..0d9bec9b1a 100644 --- a/src/NLog/Targets/FileTarget.cs +++ b/src/NLog/Targets/FileTarget.cs @@ -1295,12 +1295,28 @@ private void ArchiveFile(string fileName, string archiveFileName) //todo maybe needs a better filelock behaviour //copy to archive file. - using (FileStream fileStream = File.Open(fileName, FileMode.Open)) + var fileShare = FileShare.ReadWrite; + if (EnableFileDelete) + { + fileShare |= FileShare.Delete; + } + + using (FileStream fileStream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, fileShare)) using (FileStream archiveFileStream = File.Open(archiveFileName, FileMode.Append)) { fileStream.CopyAndSkipBom(archiveFileStream, Encoding); //clear old content fileStream.SetLength(0); + + if (EnableFileDelete) + { + // Attempt to delete file to reset File-Creation-Time (Delete under file-lock) + if (!DeleteOldArchiveFile(fileName)) + { + fileShare &= ~FileShare.Delete; // Retry after having released file-lock + } + } + fileStream.Close(); // This flushes the content, too. #if NET3_5 archiveFileStream.Flush(); @@ -1308,6 +1324,11 @@ private void ArchiveFile(string fileName, string archiveFileName) archiveFileStream.Flush(true); #endif } + + if ((fileShare & FileShare.Delete) == FileShare.None) + { + DeleteOldArchiveFile(fileName); // Attempt to delete file to reset File-Creation-Time + } } else { diff --git a/tests/NLog.UnitTests/Targets/FileTargetTests.cs b/tests/NLog.UnitTests/Targets/FileTargetTests.cs index c1859c676c..e8e53b3ca0 100644 --- a/tests/NLog.UnitTests/Targets/FileTargetTests.cs +++ b/tests/NLog.UnitTests/Targets/FileTargetTests.cs @@ -3934,7 +3934,6 @@ private void HandleArchiveFileAlreadyExistsTest(Encoding encoding, bool hasBom) // set log file access times the same way as when this issue comes up. Directory.CreateDirectory(tempDir); - File.WriteAllText(logFile, "some content" + Environment.NewLine, encoding); var oldTime = DateTime.Now.AddDays(-2); File.SetCreationTime(logFile, oldTime); @@ -3959,7 +3958,9 @@ private void HandleArchiveFileAlreadyExistsTest(Encoding encoding, bool hasBom) ArchiveFileName = archiveFileNamePattern, ArchiveNumbering = ArchiveNumberingMode.Date, ArchiveDateFormat = archiveDateFormat, - Encoding = encoding + Encoding = encoding, + Layout = "${message}", + WriteBom = hasBom, }; @@ -3972,10 +3973,12 @@ private void HandleArchiveFileAlreadyExistsTest(Encoding encoding, bool hasBom) var logger = LogManager.GetLogger("HandleArchiveFileAlreadyExistsTest"); // write, this should append. logger.Info("log to force archiving"); + logger.Info("log to same file"); LogManager.Configuration = null; // Flush AssertFileContents(archiveFileName, "message already in archive" + Environment.NewLine + "some content" + Environment.NewLine, encoding, hasBom); + AssertFileContents(logFile, "log to force archiving" + Environment.NewLine + "log to same file" + Environment.NewLine, encoding, hasBom); } finally {