Video Games

How to read a World of Warcraft combat log

September 26, 2026 · Updated September 30, 2026

Type /combatlog and the client writes every combat event to a text file on disk. Each line opens with the same eleven fields, and what comes after them depends on the subevent named in the second field.

One combat log line broken into its parts: a timestamp, the subevent SPELL_DAMAGE, the hidden caster flag, then the source unit's GUID, name, flags and raid flags, then the same four fields for the destination, then the spell fields that the SPELL prefix adds. Below, the prefix and suffix grid that generates every subevent name.

Turning it on and finding the file

/combatlog toggles logging, and an addon can do the same with LoggingCombat(true). The file lands here:

World of Warcraft\_retail_\Logs\WoWCombatLog.txt

It appends instead of replacing, so a file left running for weeks grows without limit. The first line of a session is a COMBAT_LOG_VERSION record naming the format version and the client build, which is what a parser reads before anything else, because the field layout has changed between expansions.

The eleven fields every line begins with

PositionFieldWhat it holds
1timestampUnix time in seconds with millisecond precision
2subeventThe event type, such as SPELL_DAMAGE
3hideCasterWhether the source is hidden
4sourceGUIDGlobally unique identifier for the acting unit
5sourceNameIts name
6sourceFlagsBits for the unit's type, controller and reaction
7sourceRaidFlagsRaid target icon bits
8destGUIDIdentifier for the unit on the receiving end
9destNameIts name
10destFlagsThe same bits for the target
11destRaidFlagsThe target's raid icon bits

The GUID is the field that matters for analysis. Names repeat across servers and change with transfers, while a GUID identifies one unit unambiguously, including which pet belongs to which player.

The flag fields are bitmasks. Testing a bit answers whether the source was a player or an NPC, and whether it was hostile or friendly. Another bit answers whether a player or the game controlled it, which is how a parser separates your damage from your pet's and both from everyone else's.

How subevents are named

Every subevent is a prefix and a suffix joined together, which is why the list looks long while the structure behind it stays small.

PrefixesSuffixes
SWING_DAMAGE
SPELL_HEAL
SPELL_PERIODIC_MISSED
SPELL_BUILDING_CAST_SUCCESS
ENVIRONMENTAL_AURA_APPLIED

So SPELL_DAMAGE is a spell that dealt damage, SPELL_PERIODIC_HEAL is a heal over time ticking, and SWING_DAMAGE is a melee hit, which carries no spell fields because a swing has no spell.

The prefix decides which fields come next. A SPELL prefix adds the spell's id, name and school before the suffix's own fields, where a SWING prefix adds none. That is why a parser has to read the subevent before it can make sense of field twelve onward.

What advanced logging adds

Advanced combat logging appends around seventeen further fields to each line. They cover health and power, both current and maximum, along with position, facing, item level and other unit state at the moment of the event.

Those fields are what let a log reconstruct where people were standing, which is the difference between knowing a raid took avoidable damage and knowing who walked into it. They also multiply the file size, so turn logging off when you are finished.

Reading one by hand

For a single line, work left to right in three passes. Read the timestamp and subevent to know what kind of event it is. Read the source and destination names to know who did it to whom. Then count into the remaining fields using the prefix and suffix, which tell you what the layout is.

For anything longer than a few lines, hand the file to a parser. The public log sites and the desktop parsers all read this format and reconstruct fights, and they exist because doing it by eye stops scaling at about the third line.

Sources