HomeTopicsLogging & Audit › Reading Logs

Reading Transfer Logs Like a Story

A transfer log looks, at first glance, like a wall of timestamps and abbreviations. But every one of those lines is a sentence, and read in order they tell a story: someone arrived, proved who they were, moved some files, and left. The skill that separates a confident investigator from someone squinting at a screen is the ability to turn that wall of lines back into that story — quickly, and without missing the sentence that matters.

This is a learnable skill, and it is mostly pattern recognition. Once you know the shape of a normal session, an abnormal one jumps off the page. Once you know how to pivot from a single interesting line to the whole session around it, a scroll of ten thousand lines becomes three searches. This article teaches both: we will reconstruct two real-shaped sessions line by line — one ordinary, one alarming — and then cover the search moves that make reconstruction fast under pressure.

It assumes you already have the right things in your logs. If you are not sure, start with what a transfer service should log — the reconstruction skills here depend on those events and fields being present. This article is part of the Logging & Audit series.

A Log Is a Transcript, Not a Dashboard

The first mental shift is to stop treating the log as a status board and start treating it as a transcript — a written record of a conversation that already happened. Nobody is watching it live. Its value is entirely retrospective: it lets you replay a session you were not present for. That means you read it the way you would read a court transcript or a chat history — top to bottom, in order, building a picture of who said what and when.

A complete reconstruction answers five questions, and they are always the same five:

  • Who connected? The account name, and whether it is a human or a service account.
  • From where? The source IP address, and whether you have seen it before.
  • How did they authenticate? Password, key, or certificate — and did it succeed on the first try?
  • What did they do? Every file operation, in order — uploads, downloads, deletes, renames.
  • What left, and how did it end? Which files were downloaded, how much data, and whether the session closed cleanly or was cut off.

Keep those five in your head and any session log becomes a form to fill in. Let us fill it in for real.

Reconstruction One: An Ordinary Partner Session

Here is a session exactly as a well-configured server might record it. The format is deliberately generic — a timestamp, a session identifier, an event, and its fields — because the reading skill is the same whatever the exact layout. Read it top to bottom before you read the explanation.

2026-03-11T09:02:14Z sess=4471 CONNECT  src=203.0.113.9 proto=SFTP
2026-03-11T09:02:14Z sess=4471 AUTH     user=partner-07 method=publickey result=OK
2026-03-11T09:02:15Z sess=4471 CWD      /in
2026-03-11T09:02:15Z sess=4471 STOR     /in/order-8841.csv bytes=48213 result=OK dur=0.4s
2026-03-11T09:02:16Z sess=4471 LIST     /out
2026-03-11T09:02:17Z sess=4471 RETR     /out/ack-8840.csv bytes=1122 result=OK dur=0.1s
2026-03-11T09:02:18Z sess=4471 QUIT     result=clean

Now the story, one line at a time. The first line is the arrival: at 09:02:14 UTC, a connection identified as session 4471 came in from the IP address 203.0.113.9 over SFTP. That session number is the thread we will follow — every subsequent line carries sess=4471, which is how we know all of this is one visit and not seven unrelated events that happened to land together.

The second line is the identity check: the account partner-07 authenticated using a public key, and it worked on the first attempt (result=OK). No failed tries precede it. This is what a legitimate automated partner looks like — a known account, a key rather than a password, and a clean login.

The middle three lines are the work. The session changed into the /in directory and uploaded a file, order-8841.csv, weighing 48,213 bytes, which completed successfully in under half a second. Then it listed the /out directory and downloaded ack-8840.csv, a small acknowledgement file. In plain English: this partner dropped off today's order and picked up yesterday's acknowledgement. That is a textbook business-to-business exchange, and the log shows it doing exactly what it should.

The last line is the departure: a clean QUIT. The session ended because the client said goodbye, not because it timed out or was cut off. Filling in our five-question form: partner-07 connected from a known partner IP over SFTP, authenticated cleanly with a key, uploaded one order file and downloaded one acknowledgement, and logged out normally. Nothing to see here — and being able to say "nothing to see here" with confidence is itself the point.

Reconstruction Two: A Session That Should Worry You

Now the same skill on a session that is not fine. This is an abbreviated view — imagine the middle section repeating many more times — but every line is the kind of thing your log will really contain. Read it first, then we will take it apart.

2026-03-11T02:14:03Z sess=5510 CONNECT  src=198.51.100.77 proto=FTPS
2026-03-11T02:14:03Z sess=5510 AUTH     user=admin      method=password result=FAIL reason=badpass
2026-03-11T02:14:06Z sess=5511 AUTH     user=administrator method=password result=FAIL reason=nouser
2026-03-11T02:14:09Z sess=5512 AUTH     user=root       method=password result=FAIL reason=nouser
2026-03-11T02:15:31Z sess=5533 AUTH     user=admin      method=password result=FAIL reason=badpass
2026-03-11T02:19:40Z sess=5540 AUTH     user=svc-billing method=password result=OK
2026-03-11T02:19:41Z sess=5540 LIST     /finance
2026-03-11T02:19:42Z sess=5540 RETR     /finance/2025-Q4-payroll.xlsx bytes=902214 result=OK
2026-03-11T02:19:44Z sess=5540 RETR     /finance/vendor-bank-details.csv bytes=44190 result=OK
2026-03-11T02:19:46Z sess=5540 RETR     /finance/2025-Q3-payroll.xlsx bytes=881002 result=OK
2026-03-11T02:24:10Z sess=5540 QUIT     result=clean

Start with what is normal and let the abnormal surface against it. The time is the first flag: 02:14 UTC. If this server serves partners in business hours, activity at two in the morning is not automatically an attack — automated jobs run at night — but it raises the bar for everything else to look innocent.

The authentication pattern is the second and louder flag. Look at the session numbers and the usernames: many different sessions (5510, 5511, 5512, 5533...), each trying a different classic administrative username — admin, administrator, root — and each failing. The failure reasons tell the story precisely: badpass means the account exists but the password was wrong; nouser means there is no such account. Someone is working through a list of guessed usernames and passwords. This is the log signature of a brute-force or credential-guessing attempt, and recognising it on sight is a core defensive skill covered further in the brute-force protection pillar.

The third flag is the one that turns a nuisance into an incident: at 02:19:40, session 5540 succeeds — but not on admin. It succeeds on svc-billing, a service account. The attacker's guessing eventually hit a working credential, and it was not one of the obvious ones. This is why you never read the failures in isolation: the failures are the noise, and the single quiet result=OK in the middle of them is the event.

The fourth flag is the behaviour after login. The very first thing session 5540 does is list /finance and immediately pull three files — two payroll spreadsheets and a file of vendor bank details — nearly two megabytes in seconds. A real svc-billing job would have a predictable, narrow pattern: the same file, at the same time, every day. Listing a sensitive directory and downloading everything in it is the shape of exfiltration, not routine work.

Filled into the five-question form, the story writes itself: an unknown IP guessed credentials against several admin usernames off-hours, eventually authenticated as a service account, and immediately downloaded sensitive finance files before logging out. That reconstruction — built entirely from reading, no special tooling — is exactly what turns a shrug into an incident report. What you do next is response; what got you here is reading.

Remember: never judge a login by its own line. A single result=OK looks identical whether it followed zero failures or five hundred. The meaning lives in the context around it — the failures before, the behaviour after, the time on the clock. Always pull the surrounding session before you conclude a login was legitimate.

The Search Moves That Make It Fast

Reconstructing a session by scrolling works when you already found it. The harder skill is finding it in millions of lines, fast. The trick is always the same: find one anchor, then expand around it. You rarely start with a session number; you start with a single suspicious fact — an IP from an alert, a filename from a complaint, an account that should not have been active — and you grow the picture outward from there.

There are four anchors you will use constantly, whatever search tool sits in front of your logs. The queries below are written in plain "your log collector" terms rather than any one product's syntax, because the moves matter more than the dialect.

Anchor you have Search you run What it reveals
A session ID all lines where sess= equals it The whole visit, in order — the full reconstruction
An IP address all lines where src= equals it Every session from that source, across accounts and days
An account name all lines where user= equals it Everywhere that identity was used — and from how many IPs
A filename or path all lines containing that path Everyone who touched that file, and when it moved

The pivot chains these together. Say an alert flags the IP 198.51.100.77. Anchor on it (src=198.51.100.77) and you see all its sessions, including the successful one as svc-billing. Re-anchor on that session ID and you get the full reconstruction — the finance downloads. Re-anchor on user=svc-billing and you discover whether that account was also used from its normal IP earlier that day, which tells you whether the credential was stolen or the account itself is the attacker's. Three searches, each starting from the answer of the last, and the whole shape of the incident appears.

Narrowing by time and by verb

Two filters sharpen every anchor. The first is a time window: once you know roughly when something happened, restrict the search to that span. An IP that has connected for years produces thousands of lines; the same IP between 02:00 and 03:00 on one night produces the handful you actually want. The second is filtering by operation. Searching only for result=FAIL surfaces authentication trouble across the whole estate at once; searching only for RETR (downloads) answers "what left" without wading through uploads and listings. Combine them — failed logins, from one IP, in one hour — and you have isolated an attack in a single query.

Correlating Across Sessions and Sources

The hardest stories span more than one session, and sometimes more than one log. Two correlation habits pay off repeatedly.

One IP, many accounts. A single source address trying — or worse, succeeding — against several different usernames is the pattern in reconstruction two, and it is almost never innocent. Legitimate users connect from their own address to their own account. When you see one IP fan out across accounts, you are looking at guessing, credential stuffing, or an attacker moving between the credentials they have collected. Anchoring on the IP and glancing at the distinct user= values it touched is a five-second check that catches a lot.

One account, many IPs. The mirror image is just as telling. A service account is supposed to run from one place — a known automation host. If svc-billing suddenly appears from a residential broadband address in another country while its normal job is still running from the usual host, the credential has almost certainly leaked. Anchoring on the account and counting the distinct source IPs turns that into an obvious flag.

Correlation gets far easier when all your logs are searchable together in one place rather than scattered across individual servers — which is the entire argument of getting transfer logs off the box. It also gets easier when your transfer logs sit beside your firewall and authentication logs, so a source IP can be traced across every layer it touched.

Reading Failure Signatures

Not every worrying log is an attack — a great many are plain breakage, and reading those fluently saves hours of blame. The key is that transfer failures leave characteristic signatures, and the signature tells you where to look.

The classic one: login succeeds, then the transfer hangs or fails. In the log you see a clean AUTH, then a listing or transfer that never completes — often a timeout or a "cannot open data connection" error. That signature almost always means the control connection is healthy but the data connection could not be established, which points at passive-mode, firewall, or NAT trouble rather than anything to do with credentials. Reading that pattern correctly is the difference between "the network team needs to open the passive range" and a fruitless hour spent resetting a partner's password. The full diagnostic method lives in our companion article on diagnosing FTP mode failures, and the log-reading instinct is the same one you are building here.

Other signatures worth recognising on sight: repeated badpass for one real account (a partner whose stored password expired, or a genuine attack — the volume and source tell you which); a transfer that logs as started but never logs a completion (a dropped connection mid-file, which matters because a half-written file may look whole to whatever picks it up next); and a burst of nouser failures for random names (indiscriminate scanning, usually background internet noise rather than a targeted attempt at you).

Building the Reading Habit

One practical habit while you read: write the story down as you go, in the same five-question shape, with the exact timestamps and session IDs beside each finding. A reconstruction that lives only in your head evaporates the moment you get interrupted, and an investigation is nothing but interruptions. A two-line note — "sess=5540, svc-billing from 198.51.100.77, pulled three finance files at 02:19" — is the seed of an incident report, a handover to a colleague, and the evidence trail an auditor will later ask for. Reading and recording are the same motion done well.

Fluency comes from reading normal logs when nothing is wrong. Spend ten minutes reading a quiet day's transfers and you calibrate your sense of "normal" — this partner always connects at 09:00, that job always moves three files, this account only ever uploads. When the abnormal session finally arrives, it will not blend in, because you will already know exactly what it is supposed to look like. Investigators who only ever open the log during a crisis are reading a foreign language under a deadline; the ones who read it occasionally in calm are reading their native tongue.

To recap the method: treat the log as a transcript and read it in order; answer the same five questions every time — who, from where, how they authenticated, what they did, and what left; find one anchor and pivot outward with session, IP, account, and filename searches; narrow by time and by operation; and correlate one-IP-many-accounts and one-account-many-IPs to catch the stories that span sessions. Do that, and no wall of log lines will ever be opaque again.

Next in this series: getting transfer logs off the box, so all these lines are searchable in one durable place; alerts worth raising, which automates the pattern-spotting you just did by hand; and what a transfer service should log if you need to make sure the fields you searched on are actually being captured.

Frequently Asked Questions

What is the single most useful field when reading a log?
The session or connection identifier. It lets you pull every line from one visit in order, which is the whole game of reconstruction. If your logs lack one, adding it is the highest-value change you can make to how readable they are.
How do I tell a real attack from harmless internet scanning?
Volume, targeting, and outcome. Random failed logins against made-up usernames from many IPs are usually background noise. Repeated attempts against your real account names from one source, especially followed by a success, is targeted and deserves escalation.
A login succeeded but I'm not sure it was legitimate. What now?
Pull the whole session and read what happened before and after. Check for failed attempts preceding it, an unfamiliar source IP, an odd time of day, and unusual behaviour after login such as listing a sensitive folder and downloading in bulk. The single OK line means nothing on its own.
The transfer logs in fine, then the download fails. Is that a breach?
Almost never. That signature — clean authentication, then a stalled or failed data transfer — points at a passive-mode, firewall, or NAT problem, not credentials. Our guide to diagnosing FTP mode failures walks through it in detail.
Do I need special software to reconstruct a session?
No. Any tool that can search text — a log viewer, a search box, a command-line filter — is enough to anchor on a session ID, IP, account, or filename and pivot between them. Dedicated log collectors make it faster at scale, but the method is the same.

From the Sysax team: we build secure file transfer software for Windows — Sysax Multi Server, an FTP, FTPS, SFTP, and HTTPS server, and Sysax FTP Automation for scheduled, scripted transfers. Free trials are on the download page.