diff --git a/src/NLog/Internal/FileAppenders/BaseFileAppender.cs b/src/NLog/Internal/FileAppenders/BaseFileAppender.cs index 0ed3daeb9c..0bd10c1e08 100644 --- a/src/NLog/Internal/FileAppenders/BaseFileAppender.cs +++ b/src/NLog/Internal/FileAppenders/BaseFileAppender.cs @@ -163,8 +163,9 @@ protected virtual void Dispose(bool disposing) /// Creates the file stream. /// /// If set to true sets the file stream to allow shared writing. + /// If larger than 0 then it will be used instead of the default BufferSize for the FileStream. /// A object which can be used to write to the file. - protected FileStream CreateFileStream(bool allowFileSharedWriting) + protected FileStream CreateFileStream(bool allowFileSharedWriting, int overrideBufferSize = 0) { int currentDelay = CreateFileParameters.ConcurrentWriteAttemptDelay; @@ -175,7 +176,7 @@ protected FileStream CreateFileStream(bool allowFileSharedWriting) { try { - return TryCreateFileStream(allowFileSharedWriting); + return TryCreateFileStream(allowFileSharedWriting, overrideBufferSize); } catch (DirectoryNotFoundException) { @@ -194,7 +195,7 @@ protected FileStream CreateFileStream(bool allowFileSharedWriting) //if creating a directory failed, don't retry for this message (e.g the ConcurrentWriteAttempts below) throw new NLogRuntimeException("Could not create directory {0}", directoryName); } - return TryCreateFileStream(allowFileSharedWriting); + return TryCreateFileStream(allowFileSharedWriting, overrideBufferSize); } } @@ -217,7 +218,7 @@ protected FileStream CreateFileStream(bool allowFileSharedWriting) #if !SILVERLIGHT && !MONO && !__IOS__ && !__ANDROID__ && !NETSTANDARD [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Objects are disposed elsewhere")] - private FileStream WindowsCreateFile(string fileName, bool allowFileSharedWriting) + private FileStream WindowsCreateFile(string fileName, bool allowFileSharedWriting, int overrideBufferSize) { int fileShare = Win32FileNativeMethods.FILE_SHARE_READ; @@ -250,7 +251,7 @@ private FileStream WindowsCreateFile(string fileName, bool allowFileSharedWritin Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } - fileStream = new FileStream(handle, FileAccess.Write, CreateFileParameters.BufferSize); + fileStream = new FileStream(handle, FileAccess.Write, overrideBufferSize > 0 ? overrideBufferSize : CreateFileParameters.BufferSize); fileStream.Seek(0, SeekOrigin.End); return fileStream; } @@ -266,7 +267,7 @@ private FileStream WindowsCreateFile(string fileName, bool allowFileSharedWritin } #endif - private FileStream TryCreateFileStream(bool allowFileSharedWriting) + private FileStream TryCreateFileStream(bool allowFileSharedWriting, int overrideBufferSize) { UpdateCreationTime(); @@ -275,7 +276,7 @@ private FileStream TryCreateFileStream(bool allowFileSharedWriting) { if (!CreateFileParameters.ForceManaged && PlatformDetector.IsWin32 && !PlatformDetector.IsMono) { - return WindowsCreateFile(FileName, allowFileSharedWriting); + return WindowsCreateFile(FileName, allowFileSharedWriting, overrideBufferSize); } } catch (SecurityException) @@ -295,7 +296,7 @@ private FileStream TryCreateFileStream(bool allowFileSharedWriting) FileMode.Append, FileAccess.Write, fileShare, - CreateFileParameters.BufferSize); + overrideBufferSize > 0 ? overrideBufferSize : CreateFileParameters.BufferSize); } private void UpdateCreationTime() diff --git a/src/NLog/Internal/FileAppenders/RetryingMultiProcessFileAppender.cs b/src/NLog/Internal/FileAppenders/RetryingMultiProcessFileAppender.cs index 750b59f918..b3360053b9 100644 --- a/src/NLog/Internal/FileAppenders/RetryingMultiProcessFileAppender.cs +++ b/src/NLog/Internal/FileAppenders/RetryingMultiProcessFileAppender.cs @@ -63,7 +63,8 @@ public RetryingMultiProcessFileAppender(string fileName, ICreateFileParameters p /// The number of bytes. public override void Write(byte[] bytes, int offset, int count) { - using (FileStream fileStream = CreateFileStream(false)) + int overrideBufferSize = Math.Min((count / 4096 + 1) * 4096, CreateFileParameters.BufferSize); + using (FileStream fileStream = CreateFileStream(false, overrideBufferSize)) { fileStream.Write(bytes, offset, count); }