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);
}