Skip to content

Commit 71171e4

Browse files
committed
Added missing Path.GetFullPath to fix broken paths
1 parent 551b1c9 commit 71171e4

File tree

6 files changed

+57
-52
lines changed

6 files changed

+57
-52
lines changed

src/NLog/Targets/FileArchiveHandlers/DisabledFileArchiveHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ internal class DisabledFileArchiveHandler : IFileArchiveHandler
3939
{
4040
public static readonly IFileArchiveHandler Default = new DisabledFileArchiveHandler();
4141

42-
public int ArchiveBeforeOpenFile(string newFilePath, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, int newSequenceNumber)
42+
public int ArchiveBeforeOpenFile(string newFileName, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, int newSequenceNumber)
4343
{
4444
return 0; // Archive logic disabled, no rolling of active file
4545
}

src/NLog/Targets/FileArchiveHandlers/IFileArchiveHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ internal interface IFileArchiveHandler
4343
/// <summary>
4444
/// Called just before opening a new log-file
4545
/// </summary>
46-
/// <param name="newFilePath">File-path to the new log-file</param>
46+
/// <param name="newFileName">File-name of the new log-file</param>
4747
/// <param name="firstLogEvent">The first LogEvent for the new log-file</param>
4848
/// <param name="previousFileLastModified">Previous file-write-time</param>
4949
/// <param name="newSequenceNumber">File-path-suffix for the new log-file</param>
5050
/// <returns>Updated <paramref name="newSequenceNumber"/> for the new file.</returns>
51-
int ArchiveBeforeOpenFile(string newFilePath, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, int newSequenceNumber);
51+
int ArchiveBeforeOpenFile(string newFileName, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, int newSequenceNumber);
5252
}
5353
}

src/NLog/Targets/FileArchiveHandlers/LegacyArchiveFileNameHandler.cs

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -52,27 +52,27 @@ public LegacyArchiveFileNameHandler(FileTarget fileTarget)
5252
{
5353
}
5454

55-
public override int ArchiveBeforeOpenFile(string newFilePath, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, int newSequenceNumber)
55+
public override int ArchiveBeforeOpenFile(string newFileName, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, int newSequenceNumber)
5656
{
57-
var archiveFilePath = _fileTarget.ArchiveFileName?.Render(firstLogEvent);
58-
if (StringHelpers.IsNullOrWhiteSpace(archiveFilePath))
57+
var archiveFileName = _fileTarget.ArchiveFileName?.Render(firstLogEvent);
58+
if (StringHelpers.IsNullOrWhiteSpace(archiveFileName))
5959
{
60-
return base.ArchiveBeforeOpenFile(newFilePath, firstLogEvent, previousFileLastModified, newSequenceNumber);
60+
return base.ArchiveBeforeOpenFile(newFileName, firstLogEvent, previousFileLastModified, newSequenceNumber);
6161
}
6262

63+
var newFilePath = FileTarget.CleanFullFilePath(newFileName);
64+
6365
bool initialFileOpen = newSequenceNumber == 0;
64-
if (ArchiveBeforeOpenFile(archiveFilePath, newFilePath, firstLogEvent, previousFileLastModified, initialFileOpen))
66+
if (ArchiveBeforeOpenFile(archiveFileName, newFilePath, firstLogEvent, previousFileLastModified, initialFileOpen))
6567
{
6668
FixWindowsFileSystemTunneling(newFilePath);
6769
}
6870

6971
return 0;
7072
}
7173

72-
private bool ArchiveBeforeOpenFile(string archiveFilePath, string newFilePath, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, bool initialFileOpen)
74+
private bool ArchiveBeforeOpenFile(string archiveFileName, string newFilePath, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, bool initialFileOpen)
7375
{
74-
archiveFilePath = FileTarget.CleanFullFilePath(archiveFilePath);
75-
7676
bool oldFilesDeleted = false;
7777
if (_fileTarget.MaxArchiveFiles >= 0 || _fileTarget.MaxArchiveDays > 0 || (initialFileOpen && _fileTarget.DeleteOldFileOnStartup))
7878
{
@@ -82,26 +82,28 @@ private bool ArchiveBeforeOpenFile(string archiveFilePath, string newFilePath, L
8282
var excludeFileName = Path.GetFileName(newFilePath);
8383
if (wildCardStrictSeqNo)
8484
{
85-
string archiveFileWildcard = BuildArchiveFilePath(archiveFilePath, int.MaxValue, DateTime.MinValue).Replace(int.MaxValue.ToString(), "*");
85+
string archiveFilePath = BuildArchiveFilePath(archiveFileName, int.MaxValue, DateTime.MinValue);
86+
string archiveFileWildcard = archiveFilePath.Replace(int.MaxValue.ToString(), "*");
8687
string archiveDirectory = Path.GetDirectoryName(archiveFilePath);
8788
oldFilesDeleted = DeleteOldFilesBeforeArchive(archiveDirectory, Path.GetFileName(archiveFileWildcard), initialFileOpen, excludeFileName, true);
8889
}
8990
else
9091
{
92+
var archiveFilePath = FileTarget.CleanFullFilePath(archiveFileName);
9193
oldFilesDeleted = DeleteOldFilesBeforeArchive(archiveFilePath, initialFileOpen, excludeFileName);
9294
}
9395
}
9496

9597
if (initialFileOpen && !_fileTarget.ArchiveOldFileOnStartup)
9698
return oldFilesDeleted;
9799

98-
if (!ArchiveOldFileWithRetry(archiveFilePath, newFilePath, firstLogEvent, previousFileLastModified))
100+
if (!ArchiveOldFileWithRetry(archiveFileName, newFilePath, firstLogEvent, previousFileLastModified))
99101
return oldFilesDeleted;
100102

101103
return true;
102104
}
103105

104-
private bool ArchiveOldFileWithRetry(string archiveFilePath, string newFilePath, LogEventInfo firstLogEvent, DateTime? previousFileLastModified)
106+
private bool ArchiveOldFileWithRetry(string archiveFileName, string newFilePath, LogEventInfo firstLogEvent, DateTime? previousFileLastModified)
105107
{
106108
DateTime? lastWriteTimeUtc = default(DateTime?);
107109
long? lastFileLength = default(long?);
@@ -125,7 +127,7 @@ private bool ArchiveOldFileWithRetry(string archiveFilePath, string newFilePath,
125127

126128
lastWriteTimeUtc = lastWriteTimeUtc ?? newFileInfo.LastWriteTimeUtc;
127129
lastFileLength = lastFileLength ?? newFileInfo.Length;
128-
if (ArchiveOldFile(newFileInfo, firstLogEvent, previousFileLastModified, archiveFilePath))
130+
if (ArchiveOldFile(archiveFileName, newFileInfo, firstLogEvent, previousFileLastModified))
129131
return true;
130132
}
131133
catch (IOException ex)
@@ -148,14 +150,14 @@ private bool ArchiveOldFileWithRetry(string archiveFilePath, string newFilePath,
148150
return oldFilesDeleted;
149151
}
150152

151-
private bool ArchiveOldFile(FileInfo newFileInfo, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, string archiveFilePath)
153+
private bool ArchiveOldFile(string archiveFileName, FileInfo newFileInfo, LogEventInfo firstLogEvent, DateTime? previousFileLastModified)
152154
{
153155
DateTime fileLastWriteTime = Time.TimeSource.Current.FromSystemTime(newFileInfo.LastWriteTimeUtc);
154156
if (previousFileLastModified.HasValue && (previousFileLastModified > fileLastWriteTime || fileLastWriteTime >= firstLogEvent.TimeStamp))
155157
fileLastWriteTime = previousFileLastModified.Value;
156158

157-
var archiveNextSequenceNo = ResolveNextArchiveSequenceNo(archiveFilePath, fileLastWriteTime);
158-
string archiveFullPath = BuildArchiveFilePath(archiveFilePath, archiveNextSequenceNo, fileLastWriteTime);
159+
var archiveNextSequenceNo = ResolveNextArchiveSequenceNo(archiveFileName, fileLastWriteTime);
160+
string archiveFullPath = BuildArchiveFilePath(archiveFileName, archiveNextSequenceNo, fileLastWriteTime);
159161

160162
if (!File.Exists(archiveFullPath))
161163
{
@@ -181,17 +183,17 @@ private bool ArchiveOldFile(FileInfo newFileInfo, LogEventInfo firstLogEvent, Da
181183
return false;
182184
}
183185

184-
private string BuildArchiveFilePath(string archiveFilePath, int archiveNextSequenceNo, DateTime fileLastWriteTime)
186+
private string BuildArchiveFilePath(string archiveFileName, int archiveNextSequenceNo, DateTime fileLastWriteTime)
185187
{
186-
var filePath = _fileTarget.BuildFullFilePath(archiveFilePath, archiveNextSequenceNo, fileLastWriteTime);
188+
var filePath = _fileTarget.BuildFullFilePath(archiveFileName, archiveNextSequenceNo, fileLastWriteTime);
187189
var fileName = Path.GetFileName(filePath);
188190
if (fileName?.Length > 0 && fileName[0] == '_')
189191
{
190192
var directory = Path.GetDirectoryName(filePath);
191193
if (!string.IsNullOrEmpty(directory))
192194
filePath = Path.Combine(directory, fileName.Substring(1));
193195
}
194-
return FileTarget.CleanFullFilePath(filePath);
196+
return filePath;
195197
}
196198

197199
private void ArchiveFileAppendExisting(string fileName, string archiveFileName)
@@ -235,32 +237,30 @@ private void ArchiveFileAppendExisting(string fileName, string archiveFileName)
235237
}
236238
}
237239

238-
private int ResolveNextArchiveSequenceNo(string archiveFilePath, DateTime fileLastWriteTime)
240+
private int ResolveNextArchiveSequenceNo(string archiveFileName, DateTime fileLastWriteTime)
239241
{
242+
// Archive operation triggered, how to resolve the next archive-sequence-number ?
243+
// - Old version was able to "parse" the file-names of the archive-folder and "guess" the next sequence number
244+
var archiveFilePath = BuildArchiveFilePath(archiveFileName, int.MaxValue, fileLastWriteTime);
240245
var archiveDirectory = Path.GetDirectoryName(archiveFilePath);
246+
if (string.IsNullOrEmpty(archiveDirectory))
247+
return 0;
248+
241249
var directoryInfo = new DirectoryInfo(archiveDirectory);
242250
if (!directoryInfo.Exists)
243251
{
244-
Directory.CreateDirectory(directoryInfo.FullName);
252+
directoryInfo.Create();
245253
}
246254

247-
// Archive operation triggered, how to resolve the next archive-sequence-number ?
248-
// - Old version was able to "parse" the file-names of the archive-folder and "guess" the next sequence number
249-
var archiveWildCard = BuildArchiveFilePath(archiveFilePath, int.MaxValue, fileLastWriteTime).Replace(int.MaxValue.ToString(), "*");
250-
if (archiveWildCard.IndexOf('*') < 0)
251-
return 0;
252-
253-
var archiveWildCardFileName = Path.GetFileName(archiveWildCard);
254-
int splitIndex = archiveWildCardFileName.IndexOf('*');
255-
if (splitIndex < 0)
255+
var archiveWildCardFileName = Path.GetFileName(archiveFilePath).Replace(int.MaxValue.ToString(), "*");
256+
int fileWildcardStartIndex = archiveWildCardFileName.IndexOf('*');
257+
if (fileWildcardStartIndex < 0)
256258
return 0;
257259

258-
int fileWildcardStartIndex = archiveWildCardFileName.IndexOf('*');
259260
int fileWildcardEndIndex = archiveWildCardFileName.Length - fileWildcardStartIndex;
260-
261-
if (splitIndex > 0 && !char.IsLetter(archiveWildCardFileName[splitIndex - 1]) && !char.IsDigit(archiveWildCardFileName[splitIndex - 1]))
261+
if (fileWildcardStartIndex > 0 && !char.IsLetter(archiveWildCardFileName[fileWildcardStartIndex - 1]) && !char.IsDigit(archiveWildCardFileName[fileWildcardStartIndex - 1]))
262262
{
263-
archiveWildCardFileName = archiveWildCardFileName.Substring(0, splitIndex - 1) + archiveWildCardFileName.Substring(splitIndex);
263+
archiveWildCardFileName = archiveWildCardFileName.Substring(0, fileWildcardStartIndex - 1) + archiveWildCardFileName.Substring(fileWildcardStartIndex);
264264
}
265265

266266
var archiveFiles = directoryInfo.GetFiles(archiveWildCardFileName);

src/NLog/Targets/FileArchiveHandlers/RollingArchiveFileHandler.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,13 @@ public RollingArchiveFileHandler(FileTarget fileTarget)
4848
{
4949
}
5050

51-
public virtual int ArchiveBeforeOpenFile(string newFilePath, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, int newSequenceNumber)
51+
public virtual int ArchiveBeforeOpenFile(string newFileName, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, int newSequenceNumber)
5252
{
5353
bool initialFileOpen = newSequenceNumber == 0;
5454

5555
if (_fileTarget.MaxArchiveFiles >= 0 || _fileTarget.MaxArchiveDays > 0 || (initialFileOpen && _fileTarget.DeleteOldFileOnStartup))
5656
{
57+
var newFilePath = FileTarget.CleanFullFilePath(newFileName);
5758
bool deletedOldFiles = DeleteOldFilesBeforeArchive(newFilePath, initialFileOpen);
5859

5960
if (_fileTarget.MaxArchiveFiles == 0 || _fileTarget.MaxArchiveFiles == 1 || (initialFileOpen && _fileTarget.DeleteOldFileOnStartup))
@@ -70,6 +71,7 @@ public virtual int ArchiveBeforeOpenFile(string newFilePath, LogEventInfo firstL
7071
{
7172
if (_fileTarget.ArchiveOldFileOnStartup || _fileTarget.ArchiveAboveSize != 0 || _fileTarget.ArchiveEvery != FileArchivePeriod.None)
7273
{
74+
var newFilePath = FileTarget.CleanFullFilePath(newFileName);
7375
return RollToInitialSequenceNumber(newFilePath);
7476
}
7577
}

src/NLog/Targets/FileArchiveHandlers/ZeroFileArchiveHandler.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ public ZeroFileArchiveHandler(FileTarget fileTarget)
4949
{
5050
}
5151

52-
public int ArchiveBeforeOpenFile(string newFilePath, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, int newSequenceNumber)
52+
public int ArchiveBeforeOpenFile(string newFileName, LogEventInfo firstLogEvent, DateTime? previousFileLastModified, int newSequenceNumber)
5353
{
54+
var newFilePath = FileTarget.CleanFullFilePath(newFileName);
55+
5456
bool initialFileOpen = newSequenceNumber == 0;
5557
if (DeleteOldArchiveFiles(newFilePath, initialFileOpen))
5658
{

src/NLog/Targets/FileTarget.cs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -834,21 +834,19 @@ private OpenFileAppender OpenFile(string filename, LogEventInfo firstLogEvent, D
834834

835835
PruneOpenFileCache();
836836

837-
var newFilePath = CleanFullFilePath(filename);
837+
sequenceNumber = FileAchiveHandler.ArchiveBeforeOpenFile(filename, firstLogEvent, previousFileLastModified, sequenceNumber);
838+
var fullFilePath = BuildFullFilePath(filename, sequenceNumber);
838839

839840
if (createDirs)
840841
{
841-
var directory = Path.GetDirectoryName(newFilePath);
842+
var directory = Path.GetDirectoryName(fullFilePath);
842843
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
843844
{
844845
Directory.CreateDirectory(directory);
845846
}
846847
}
847848

848-
sequenceNumber = FileAchiveHandler.ArchiveBeforeOpenFile(newFilePath, firstLogEvent, previousFileLastModified, sequenceNumber);
849-
newFilePath = BuildFullFilePath(newFilePath, sequenceNumber);
850-
851-
var fileAppender = CreateFileAppender(newFilePath);
849+
var fileAppender = CreateFileAppender(fullFilePath);
852850
var openFile = new OpenFileAppender(fileAppender, sequenceNumber);
853851
_openFileCache[filename] = openFile;
854852

@@ -1028,31 +1026,32 @@ private void OpenFileMonitorTimer(object state)
10281026
}
10291027
}
10301028

1031-
internal string BuildFullFilePath(string filePath, int sequenceNumber, DateTime fileLastModified = default)
1029+
internal string BuildFullFilePath(string newFileName, int sequenceNumber, DateTime fileLastModified = default)
10321030
{
10331031
if (sequenceNumber > 0 || fileLastModified != default)
10341032
{
1035-
var fileName = Path.GetFileName(filePath) ?? string.Empty;
1033+
var fileName = Path.GetFileName(newFileName) ?? string.Empty;
10361034
var fileExt = Path.GetExtension(fileName) ?? string.Empty;
1037-
filePath = filePath.Substring(0, filePath.Length - fileName.Length);
1035+
newFileName = newFileName.Substring(0, newFileName.Length - fileName.Length);
10381036
if (!string.IsNullOrEmpty(fileExt))
10391037
fileName = fileName.Substring(0, fileName.Length - fileExt.Length);
10401038

10411039
object fileLastModifiedObj = fileLastModified == default ? "" : (object)fileLastModified;
10421040
try
10431041
{
1044-
return filePath + fileName + string.Format(ArchiveSuffixFormat, sequenceNumber, fileLastModifiedObj) + fileExt;
1042+
newFileName = newFileName + fileName + string.Format(ArchiveSuffixFormat, sequenceNumber, fileLastModifiedObj) + fileExt;
10451043
}
10461044
catch (Exception ex)
10471045
{
1048-
InternalLogger.Error(ex, "{0}: Failed to apply ArchiveSuffixFormat={1} using SequenceNumber={2} for file: '{3}'", this, ArchiveSuffixFormat, sequenceNumber, filePath);
1046+
InternalLogger.Error(ex, "{0}: Failed to apply ArchiveSuffixFormat={1} using SequenceNumber={2} for file: '{3}'", this, ArchiveSuffixFormat, sequenceNumber, newFileName);
10491047
if (ExceptionMustBeRethrown(ex))
10501048
throw;
1051-
return filePath + fileName + string.Format(_legacySequenceArchiveSuffixFormat, sequenceNumber) + fileExt;
1049+
newFileName = newFileName + fileName + string.Format(_legacySequenceArchiveSuffixFormat, sequenceNumber) + fileExt;
10521050
}
10531051
}
10541052

1055-
return filePath;
1053+
var filepath = CleanFullFilePath(newFileName);
1054+
return filepath;
10561055
}
10571056

10581057
internal static string CleanFullFilePath(string filename)
@@ -1081,7 +1080,9 @@ internal static string CleanFullFilePath(string filename)
10811080
filename = Path.Combine(dirName, new string(fileNameChars));
10821081
}
10831082

1084-
return FileInfoHelper.IsRelativeFilePath(filename) ? Path.Combine(LogManager.LogFactory.CurrentAppEnvironment.AppDomainBaseDirectory, filename) : filename;
1083+
var filepath = FileInfoHelper.IsRelativeFilePath(filename) ? Path.Combine(LogManager.LogFactory.CurrentAppEnvironment.AppDomainBaseDirectory, filename) : filename;
1084+
filepath = Path.GetFullPath(filepath);
1085+
return filepath;
10851086
}
10861087
private static readonly char[] DirectorySeparatorChars = new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar };
10871088
private static readonly HashSet<char> InvalidFileNameChars = new HashSet<char>(Path.GetInvalidFileNameChars());

0 commit comments

Comments
 (0)