$LogFile vs $UsnJrnl vs $MFT: Which NTFS Artifact When
$LogFile, $UsnJrnl:$J and $MFT compared from the transaction log's side: what each records, how far back it goes, what only $LogFile proves, how to join them.
TL;DR. $MFT tells you what exists now. $UsnJrnl:$J tells you what kind of change happened to which file and when, over days to weeks. $LogFile tells you exactly what bytes changed — old and new names, old and new timestamps — but only for the last minutes to hours and without a clock of its own. Start with the $MFT and the USN journal, then go to $LogFile for the questions they cannot answer: "what was the value before?" and "what happened in the last hour that the other two lost?"
All three live in the same volume, describe the same files by the same MFT references, and are routinely collected together. They are not interchangeable. Picking the wrong one first costs hours; ignoring the third one costs findings.
The three in one table
$MFT | $UsnJrnl:$J | $LogFile | |
|---|---|---|---|
| MFT entry | 0 | in $Extend\$UsnJrnl, $J stream | 2 |
| Purpose | Index of every file and folder | Change journal for applications (backup, search, replication) | Crash recovery of metadata |
| Unit | FILE record (1 KiB or 4 KiB) | USN record | Log record (redo + undo) |
| Timestamp per entry | No (the file's own times) | Yes, time of the change | No |
| Names | Current $FILE_NAMEs | Name at the time of the change | When the name is part of the change (create, rename, delete) |
| Before/after values | No | No (reason flags only) | Yes |
| Typical history | Current state + unreused deleted entries | Days to weeks | Minutes to hours |
| Can be switched off | No | Yes (fsutil usn deletejournal) | No |
The last line matters in intrusions. The USN journal is an optional feature that an administrator — or an attacker with admin rights — can delete. $LogFile is part of how NTFS works; it cannot be disabled on a mounted volume, only resized (chkdsk /L, per Microsoft's chkdsk reference).
What each one sees when a file is renamed
Take one event: rc.tmp in C:\Users\Public becomes rclone.exe.
$MFTafter the fact: one FILE record namedrclone.exe, parentPublic. The old name is gone unless a stale$I30slack entry survives.$UsnJrnl:$J: two records with the same file reference —RENAME_OLD_NAMEwithrc.tmp, thenRENAME_NEW_NAMEwithrclone.exe— each with a timestamp.$LogFile: aDeleteIndexEntryremovingrc.tmpfrom the parent's index, anAddIndexEntryaddingrclone.exe, and$FILE_NAMEattribute changes in the FILE record. The index entries embed full$FILE_NAMEstructures, including the four$FILE_NAMEtimestamps.
For a rename, the USN journal is simpler and dated. $LogFile only wins if the USN records are gone or you need the embedded values.
What each one sees when a timestamp is rewritten
Now the case where $LogFile is unique. An attacker sets m64.exe's creation time to 2019-03-19.
$MFT:$STANDARD_INFORMATIONcreated = 2019-03-19.$FILE_NAMEcreated = today. That mismatch is a classic hint, but it is only a hint: a copy, an archive extraction or an installer can produce odd combinations too.$UsnJrnl:$J: a record with reasonBASIC_INFO_CHANGEat the time of the change. You know something in the basic information (times or attributes) changed, not what.$LogFile: anUpdateResidentValueon$STANDARD_INFORMATIONwhose undo bytes hold the previous creation time and whose redo bytes hold 2019-03-19. That is the rewrite itself.
This is why timestomping analysis leans on the log. The method, and its false positives, are in detecting timestomping with the $LogFile. Cho's 2013 paper (Computers & Security 34) makes the same point: past time values found in $LogFile turn a suspicious timestamp into evidence.
How they link together
The three artifacts share keys, which is what David Cowen called the NTFS TriForce:
| Key | In $MFT | In $UsnJrnl:$J | In $LogFile |
|---|---|---|---|
| MFT entry + sequence number | Record number, header sequence | File reference, parent reference | Target entry (from VCN + offsets), index entries |
| LSN | FILE record header 0x08: LSN of the last logged change | — | Every record |
| USN | Last USN in $STANDARD_INFORMATION | Every record | USN journal writes are themselves logged |
That last row is useful. The LogFileParser readme notes that when the USN journal is active, the USN records written during the log's lifetime are also present inside $LogFile, and it decodes them into a separate CSV. In practice the USN journal usually still reaches further back, but for the most recent window the log can fill a gap.
Which one first? Four scenarios
"Which files did this account create this morning?" USN journal first (dated, long history), $MFT for paths. $LogFile only if the morning is still in it.
"Was this binary backdated?" $MFT to spot the $SI/$FN mismatch, then $LogFile to find the actual rewrite and the original value. The USN journal gives the time of the BASIC_INFO_CHANGE.
"The attacker deleted the USN journal." $LogFile for the last minutes to hours; $MFT for current state and deleted-but-not-reused entries; Volume Shadow Copies for older copies of all three.
"What did that deleted text file say?" Only $LogFile has a chance, and only if the file was small enough to be resident and the relevant records survive. See recovering deleted-file evidence.
Tools for each
$MFT: any MFT parser (MFTECmd, analyzeMFT, commercial suites).$UsnJrnl:$J: the sibling USN journal parser in the browser, or MFTECmd. usnparser.com also has its own comparison of the three artifacts, written from the USN side.$LogFile: the in-browser $LogFile parser (drop the$MFTnext to it for full paths), LogFileParser, NTFS Log Tracker, TZWorks mala — compared in $LogFile parsers compared.
Remember that the same volume's files must be collected together. A $LogFile from Monday and an $MFT from Tuesday will resolve some MFT entries to the wrong names once entries have been reused.
Frequently asked questions
What is the difference between $LogFile and $UsnJrnl?
$UsnJrnl:$J is a change journal meant for applications: one record per change with a timestamp, reason flags, file reference and name, often covering days or weeks. $LogFile is NTFS's crash-recovery log: low-level redo and undo bytes for every metadata change, with no timestamps of its own, covering minutes to hours.
If I have the USN journal, do I still need the $LogFile?
Yes when the question is about values rather than events. The USN journal says a file's basic information changed; the $LogFile can show the old and new timestamps. It also helps when the USN journal was deleted or disabled, for the most recent activity.
Further reading
- Microsoft Learn, Change Journals.
- David Cowen, NTFS TriForce — a deeper look inside the artifacts.
- Maxim Suhanov, How the $LogFile works?