Sysmon fills the visibility gaps that default Windows auditing leaves open — but only if you collect the right event IDs. Here’s the complete event ID reference, my recommended collection tiers for threat detection, and working configurations for getting Sysmon data off the endpoint with NXLog Agent.
Sysmon (System Monitor) is a free Microsoft tool — a Windows system service and device driver — that logs detailed system activity, such as process creation, network connections, and registry changes, to the Windows Event Log. Security teams rely on it because standard Windows auditing tells you that a process started; Sysmon tells you the full command line, the parent process, the file hashes, and what the process did next.
That extra context is why so many detection rules are written against Sysmon events — and why collecting the wrong subset of them either blinds your SOC or buries it in noise.
What is Sysmon and how does it work?
Sysmon installs two components: a Windows service and a boot-start device driver.
The driver loads at boot start, so it captures activity from early in the boot sequence, before most autostart persistence mechanisms fire.
The service writes those events to a dedicated channel: Applications and Services Logs > Microsoft > Windows > Sysmon > Operational.
The channel path you’ll use in queries and collector configurations is Microsoft-Windows-Sysmon/Operational, and Sysmon records all timestamps in UTC, per Microsoft’s Sysmon documentation.
An XML configuration file controls what Sysmon records. You define include and exclude rules per event type, and Sysmon applies them in the kernel, so filtering happens before events ever hit the log. The service runs as a protected process, so user-mode code — even running as administrator — can’t kill it or inject into it.
Sysmon runs on Windows 10 and later and Windows Server 2016 and later. As of this writing, the current release is Sysmon v15.21 (Microsoft, 17 June 2026). A separate Sysmon for Linux port exists on GitHub; this article focuses on the Windows version.
Sysmon is now built into Windows
After more than a decade as a separate Sysinternals download, Sysmon is now part of Windows itself. Microsoft announced in November 2025 that Sysmon functionality would ship natively in Windows 11 and Windows Server 2025, delivered it to Windows Insider builds on 4 February 2026 (Build 26220.7752 in Beta, Build 26300.7733 in Dev), and documents it as available starting February 2026, with the rollout reaching production Windows 11 and Windows Server 2025 through 2026 cumulative updates.
The built-in version is an optional Windows feature and is off by default. You turn it on from Settings > System > Optional features > More Windows features, or from an elevated prompt:
> Dism /Online /Enable-Feature /FeatureName:Sysmon
Turning on the feature makes the sysmon command available; you still install the service with your configuration file, exactly as with the standalone version:
> sysmon -accepteula -i sysmonconfig.xml
Three operational notes from Microsoft’s built-in Sysmon documentation: standalone and built-in Sysmon can’t coexist, so uninstall the Sysinternals build before turning on the feature; event IDs, fields, and custom configuration files are unchanged; and the binary is serviced through Windows Update instead of manual redeployment.
One difference does affect collection pipelines: built-in Sysmon renders event messages in the device’s display language.
The underlying XML event data stays identical across languages, so parse the structured fields — as NXLog Agent’s im_msvistalog module does — rather than the rendered message text.
For detection engineering, this changes deployment, not the telemetry your rules query. Everything in the rest of this article applies to both the standalone and the built-in versions.
Installing and configuring Sysmon
For the standalone version, download Sysmon from the Sysinternals site and install it from an elevated prompt:
# Install with a configuration file
> sysmon -accepteula -i sysmonconfig.xml
# Update the config on a live install
> sysmon -c sysmonconfig.xml
# Dump the active configuration
> sysmon -c
# Print the configuration schema
> sysmon -s
# Uninstall
> sysmon -u
Neither installation nor removal requires a reboot, and configuration updates apply to the running service. Installed without a configuration file, Sysmon logs a basic default set (process creations hashed with SHA1) and leaves network connections (event ID 3) and image loads (event ID 7) switched off, per the official documentation.
The configuration file is where the real work happens.
Filter rules live under EventFiltering, one tag per event type, each with an onmatch attribute:
<Sysmon schemaversion="4.82">
<HashAlgorithms>SHA256,IMPHASH</HashAlgorithms>
<EventFiltering>
<!-- Log every process creation (empty exclude = exclude nothing) -->
<ProcessCreate onmatch="exclude" />
<!-- Log driver loads unless signed by Microsoft or Windows -->
<DriverLoad onmatch="exclude">
<Signature condition="contains">microsoft</Signature>
<Signature condition="contains">windows</Signature>
</DriverLoad>
<!-- Log all DNS queries -->
<DnsQuery onmatch="exclude" />
<!-- Log no process terminations (empty include = include nothing) -->
<ProcessTerminate onmatch="include" />
</EventFiltering>
</Sysmon>
Three rules of thumb, all documented on the Sysmon page: include logs only matching events while exclude logs everything except matches; when both are defined for the same event type, exclude wins; and within a rule, conditions on the same field combine as OR while conditions on different fields combine as AND.
You can override that behavior with a RuleGroup and an explicit groupRelation.
The schemaversion is independent of the binary version.
Print your current schema with sysmon -s.
The complete list of Sysmon event IDs
Sysmon defines 30 event types. The table below summarizes all of them; the descriptions, default states, and volume warnings come from Microsoft’s Sysmon documentation.
| ID | Event | What it records | Notes |
|---|---|---|---|
1 |
ProcessCreate |
New process with full command line, parent process and its command line, user, and file hashes |
The workhorse of endpoint detection |
2 |
FileCreateTime |
A process changed a file’s creation timestamp |
Legitimate software does this too |
3 |
NetworkConnect |
TCP/UDP connections mapped to the source process |
Off by default |
4 |
Sysmon service state |
Sysmon service started or stopped |
Cannot be filtered |
5 |
ProcessTerminate |
Process exit with |
|
6 |
DriverLoad |
Kernel driver loaded, with hashes and signature |
|
7 |
ImageLoad |
DLL or module loaded into a process |
Off by default; Microsoft warns of significant volume |
8 |
CreateRemoteThread |
One process created a thread inside another |
Classic injection telemetry |
9 |
RawAccessRead |
Raw disk read via |
|
10 |
ProcessAccess |
One process opened a handle to another |
Microsoft advises filters; noisy unfiltered |
11 |
FileCreate |
File created or overwritten |
|
12 |
RegistryEvent |
Registry key or value created or deleted |
|
13 |
RegistryEvent |
Registry value set; records data for DWORD/QWORD values |
|
14 |
RegistryEvent |
Registry key or value renamed |
|
15 |
FileCreateStreamHash |
Named file stream created, e.g., |
The "mark of the web" event |
16 |
ServiceConfigurationChange |
Sysmon configuration changed |
Cannot be filtered |
17 |
PipeEvent |
Named pipe created |
|
18 |
PipeEvent |
Named pipe connection established |
|
19 |
WmiEvent |
WMI event filter registered |
|
20 |
WmiEvent |
WMI event consumer registered |
|
21 |
WmiEvent |
WMI consumer bound to a filter |
|
22 |
DNSEvent |
DNS query issued by a process |
Logs successful, failed, and cached queries |
23 |
FileDelete |
File deleted and archived to |
Archive folder can grow unchecked |
24 |
ClipboardChange |
Clipboard contents changed |
Privacy-sensitive |
25 |
ProcessTampering |
Process image tampering (hollowing, "herpaderping") |
|
26 |
FileDeleteDetected |
File deleted (logged only, not archived) |
Lighter alternative to ID 23 |
27 |
FileBlockExecutable |
Sysmon blocked creation of an executable (PE) file |
Active blocking, not just telemetry |
28 |
FileBlockShredding |
Sysmon blocked file shredding (e.g., SDelete) |
Active blocking |
29 |
FileExecutableDetected |
New executable (PE) file creation detected |
|
255 |
Error |
Internal Sysmon error |
Which Sysmon event IDs should you collect for threat detection?
There is no single correct list — it depends on your environment, your detection content, and your storage budget. What I can give you is a defensible starting point, anchored in two things you can verify yourself: Microsoft’s own documented defaults and volume warnings, and how directly each event maps to MITRE ATT&CK techniques. Here are my tiers:
| Tier | Event IDs | Rationale |
|---|---|---|
1 — Collect everywhere |
1, 6, 8, 12, 13, 14, 19, 20, 21, 22, 25 — plus 4, 16, 255 |
High detection value at manageable volume with light exclude rules. IDs 4, 16, and 255 are your tamper canaries and cost almost nothing. |
2 — Collect behind include filters |
3, 7, 10, 11, 15, 17, 18 |
Strong signal but unusable unfiltered. Microsoft ships IDs 3 and 7 turned off and explicitly warns that 7 and 10 generate significant logging. Scope them to what your detections query. |
3 — Situational |
2, 5, 9, 23, 24, 26, 27, 28, 29 |
Weak standalone signal (2, 5), niche use cases (9, 24), storage traps (23), or active blocking controls that belong in change management rather than passive telemetry (27-29). |
Treat the tiers as a starting point to tune, not gospel. The sections below explain why each event earns its place, grouped by the attacker behavior it exposes.
Process execution and command-line abuse
Event ID 1 is the backbone of Windows detection.
Every process creation event records the full command line, the parent process and the parent’s command line, the executing user, and configurable file hashes (SHA1, SHA256, MD5, IMPHASH).
The ProcessGuid field stays unique even when Windows reuses process IDs, which makes cross-event correlation reliable.
A single example shows the value: encoded PowerShell.
A rule that flags CommandLine values containing -EncodedCommand or -enc catches one of the most common execution patterns in Command and Scripting Interpreter: PowerShell (T1059.001), a pattern you cannot see without command-line telemetry.
Code injection and credential access
Event ID 10 records one process opening a handle to another.
Filtered down to handles targeting lsass.exe, it is the canonical detection for LSASS memory credential dumping (T1003.001).
Event ID 8 captures a process creating a thread inside another process, the classic mechanic behind process injection (T1055).
And event ID 25 flags process image tampering techniques such as hollowing and "herpaderping," which Microsoft added specifically to expose processes that no longer match their on-disk image.
Persistence
Registry events 12-14 cover the autostart battleground: Run keys, services, and the rest of Registry Run Keys / Startup Folder (T1547.001). Event ID 13 is the one to watch: it records the write itself, including the data for DWORD and QWORD values, so you see the payload being planted rather than just a key being touched.
Events 19-21 log WMI event filters, consumers, and their bindings — the three components of WMI event subscription persistence (T1546.003). These are low-volume, high-signal events; in a healthy environment, new WMI subscriptions are rare enough to review individually. Event ID 11 rounds this out when scoped to Startup folders and staging directories, which Microsoft itself highlights as the intended use case.
Command and control, DNS, and payload delivery
Event ID 22 ties every DNS query to the process that issued it — something server-side DNS logging can’t do.
It supports hunting for DNS-based command and control (T1071.004), domain-generation-algorithm patterns, and newly registered domains.
Event ID 3 does the same for TCP and UDP connections: it answers "why is this process talking to that address?"
Event ID 15 logs named file streams such as Zone.Identifier, letting you track files that arrived from the internet and spot mark-of-the-web bypass attempts (T1553.005).
Anti-forensics and defense evasion
Event ID 2 catches timestamp manipulation (timestomping, T1070.006).
Microsoft notes that many legitimate processes change file creation times, which is why I keep it in Tier 3: correlate it, don’t alert on it alone.
Events 23 and 26 both log file deletion (T1070.004); prefer 26 unless you genuinely need deleted-file samples, because 23 archives every deleted file to C:\Sysmon and Microsoft warns the folder can grow to an unreasonable size.
Event ID 9 exposes raw disk reads, a technique for grabbing locked files such as credential databases while sidestepping file-access auditing.
Driver loads earn Tier 1 on quality, not quantity. Microsoft’s Sysmon events guidance describes driver loading as rare and high-impact — exactly what you want in a detection source. Exclude Microsoft-signed drivers, and what remains is short enough to review, including the vulnerable drivers attackers bring along for kernel access.
Watch the watcher
Attackers who know Sysmon exists go after Sysmon. Alert on event ID 4 (service stopped), event ID 16 (configuration changed), and event ID 255 (internal errors). None of these can be filtered away by configuration, they generate near-zero baseline volume, and any unplanned occurrence deserves a ticket. Treat configuration drift on your endpoints as an incident until proven otherwise.
Taming the noise: filtering Sysmon events
Two principles keep Sysmon sustainable. First, filter at the source: Sysmon applies configuration rules in the kernel, so events you exclude never consume disk, bandwidth, or SIEM licensing. Second, for the noisy event types, write include rules for what you want rather than trying to exclude your way out of an open firehose.
Here’s what that looks like for the Tier 2 events:
<Sysmon schemaversion="4.82">
<EventFiltering>
<!-- ID 10: only handle opens that target LSASS -->
<ProcessAccess onmatch="include">
<TargetImage name="technique_id=T1003.001" condition="image">lsass.exe</TargetImage>
</ProcessAccess>
<!-- ID 11: only autostart and common staging locations -->
<FileCreate onmatch="include">
<TargetFilename condition="contains">\Start Menu\Programs\Startup</TargetFilename>
<TargetFilename condition="contains">\AppData\Local\Temp</TargetFilename>
<TargetFilename condition="end with">.ps1</TargetFilename>
</FileCreate>
<!-- ID 3: keep everything except known-chatty browsers -->
<NetworkConnect onmatch="exclude">
<Image condition="image">msedge.exe</Image>
<Image condition="image">chrome.exe</Image>
</NetworkConnect>
</EventFiltering>
</Sysmon>
Note the name attribute on the LSASS rule: Sysmon writes it to the event’s RuleName field, so your SIEM knows which rule fired, a documented feature that pays off downstream.
Don’t build a production configuration from scratch. Two community baselines have absorbed years of tuning: SwiftOnSecurity’s sysmon-config, a heavily commented single file, and Olaf Hartong’s sysmon-modular, a modular set whose rules are annotated with ATT&CK technique IDs. Start from one, diff it against your environment for a week, and put the result under version control.
How to check Sysmon logs
For a quick look on a single machine, open Event Viewer and navigate to Applications and Services Logs > Microsoft > Windows > Sysmon > Operational. PowerShell is faster:
# The 20 most recent Sysmon events
Get-WinEvent -LogName 'Microsoft-Windows-Sysmon/Operational' -MaxEvents 20
# Only process-creation events (event ID 1)
Get-WinEvent -FilterHashtable @{ LogName='Microsoft-Windows-Sysmon/Operational'; Id=1 } -MaxEvents 20
That’s fine for spot checks. For detection, the events need to leave the host: an attacker with local admin can clear the channel, and no analyst can hunt across a fleet one Event Viewer at a time.
Centralizing Sysmon logs with NXLog Agent
NXLog Agent collects the Sysmon channel through its im_msvistalog module, the same module it uses for any Windows Event Log. Here is a complete configuration that reads all Sysmon events and forwards them as JSON over TLS:
define CERTDIR C:\Program Files\nxlog\cert
<Extension json>
Module xm_json
</Extension>
<Input sysmon>
Module im_msvistalog
<QueryXML>
<QueryList>
<Query Id="0">
<Select Path="Microsoft-Windows-Sysmon/Operational">*</Select>
</Query>
</QueryList>
</QueryXML>
</Input>
<Output siem>
Module om_ssl
Host siem.example.com:6514
CAFile %CERTDIR%\ca.pem
Exec to_json();
</Output>
<Route sysmon_to_siem>
Path sysmon => siem
</Route>
To collect only your Tier 1 events, push the filtering into the Windows Event Log API itself with an XPath query. Filtering at this layer happens before events reach the agent, so excluded events cost nothing downstream; the NXLog Sysmon integration guide covers collecting the channel in detail:
<Input sysmon_tier1>
Module im_msvistalog
<QueryXML>
<QueryList>
<Query Id="0">
<Select Path="Microsoft-Windows-Sysmon/Operational">
*[System[(EventID=1 or EventID=4 or EventID=6 or EventID=8 or
(EventID >= 12 and EventID <= 14) or EventID=16 or
(EventID >= 19 and EventID <= 21) or EventID=22 or
EventID=25 or EventID=255)]]
</Select>
</Query>
</QueryList>
</QueryXML>
</Input>
And when XPath isn’t expressive enough, the NXLog language can filter on any event field, as shown in the Windows Event Log integration guide:
<Input sysmon>
Module im_msvistalog
<QueryXML>
<QueryList>
<Query Id="0">
<Select Path="Microsoft-Windows-Sysmon/Operational">*</Select>
</Query>
</QueryList>
</QueryXML>
<Exec> # (1)
if ($EventID in (1, 5) and $Image == "C:\\Windows\\System32\\conhost.exe") drop();
if ($EventID == 3 and $DestinationIp =~ /^10\.20\./) drop();
</Exec>
</Input>
-
Drop conhost churn and connections inside the management subnet
Collection is only half the operational problem, though. The other half is that a Sysmon deployment is a configuration deployment: hundreds or thousands of endpoints, each needing the right Sysmon XML, the right agent configuration, and updates for both. Native Sysmon in Windows solved binary distribution; it did nothing for configuration and collection management.
That’s the gap NXLog Platform covers. You enroll your agents once, then manage them as a fleet from one place: push configuration changes centrally, monitor agent health, and route Sysmon data to NXLog Platform’s own storage or to your SIEM. When your detection team wants a new include rule shipped to every workstation, that’s a configuration change and a rollout, not a project. The NXLog Platform documentation covers agent enrollment and fleet management in detail.
Sysmon vs. built-in Windows auditing
A fair question: doesn’t Security event 4688 already log process creation?
It does — with gaps that matter.
According to Microsoft’s 4688 documentation, the Process Command Line field is empty by default and only populates after you turn on a separate Group Policy setting, documented in Command line process auditing.
Even with it turned on, 4688 carries no file hashes, no parent command line, and only reusable process IDs for correlation.
Sysmon event ID 1 records all of that out of the box: full command line, parent command line, configurable hashes for threat-intelligence matching, and a ProcessGuid that survives PID reuse.
The gap runs the other way too. Sysmon records no authentication activity — logons, failed logons, and account changes stay in the Security log (events 4624, 4625, and friends, which we’ve covered in our Remote Desktop logs guide). The two sources are complements, not competitors: Sysmon for execution telemetry, Windows Event Log auditing for identity. Collect both.
Sysmon logging best practices
- Treat the configuration as detection content
-
Your Sysmon XML encodes what you can and cannot see. Keep it in version control, review changes like code, and alert on event IDs 16 and 4 so nobody — attacker or admin — changes visibility silently.
- Test before fleet rollout
-
Configuration schema versions evolve between Sysmon releases, and a rule that works in the lab can flood production. Pilot every change on a representative group and measure per-event-ID volume before and after.
- Prefer include rules for the noisy types
-
For event IDs 3, 7, 10, and 11, define what you want rather than excluding what you don’t. Revisit volumes monthly and prune rules that no detection queries.
- Ship events off the host quickly, over TLS
-
Local logs are only as trustworthy as the host they sit on. Forwarding through NXLog Agent with encrypted transport preserves the evidence even when the endpoint is compromised.
- Keep the Security log flowing alongside
-
Sysmon without authentication events is half a story during an investigation.
- Mind the update path
-
Standalone deployments should track Sysinternals releases; the built-in Windows feature updates through Windows Update. Either way, validate your parsers after version changes.
Conclusion
Sysmon gives you the execution-level visibility that default Windows auditing lacks — as long as you approach it as a curated telemetry source rather than a switch you flip on.
Key takeaways:
-
Sysmon defines 30 event types, but a dozen of them do most of the detection work.
-
Collect IDs 1, 6, 8, 12-14, 19-21, 22, and 25 everywhere; put 3, 7, 10, 11, 15, and 17-18 behind include filters; treat the rest as situational.
-
Alert on IDs 4, 16, and 255 — if Sysmon stops or its configuration changes unexpectedly, treat it as an incident.
-
Sysmon complements Windows Security auditing, it doesn’t replace it. You still need the Security log for authentication.
-
Native Sysmon in Windows 11 and Windows Server 2025 simplifies deployment, but configuration management and centralized collection remain on you.
-
Start from a community baseline — sysmon-modular or SwiftOnSecurity’s config — and tune it to your environment under version control.
-
Filter at the source twice: in the Sysmon configuration first, then in NXLog Agent for anything environment-specific. Centralize with NXLog Agent and manage the fleet with NXLog Platform, so a detection improvement is a config push, not a deployment project.
Your endpoints already generate the evidence. Collect the right subset, protect the pipeline that carries it, and your SOC gets signal instead of noise.
FAQ
- What are Sysmon event IDs?
-
Sysmon event IDs are numeric codes (1-29, plus 255 for errors) that identify each type of activity Sysmon logs to the Windows Event Log — for example, ID 1 for process creation, ID 3 for network connections, and ID 22 for DNS queries. Detection rules and SIEM queries reference these IDs to select the relevant telemetry.
- Where are Sysmon logs stored?
-
Sysmon writes its events to a dedicated Windows Event Log channel: Applications and Services Logs > Microsoft > Windows > Sysmon > Operational. In queries and log collector configurations, the channel is referenced as
Microsoft-Windows-Sysmon/Operational. Event timestamps are recorded in UTC. - What is Sysmon event ID 1?
-
Sysmon event ID 1 records process creation. Each event includes the full command line, the parent process and its command line, the executing user, configurable file hashes, and a
ProcessGuidthat remains unique even when Windows reuses process IDs. It is the most widely used Sysmon event in threat detection. - Is Sysmon enabled by default in Windows?
-
No. The standalone Sysinternals version must be downloaded and installed, and the built-in version available in Windows 11 and Windows Server 2025 since early 2026 is an optional feature that is off by default. In both cases, you must install or turn on Sysmon explicitly and supply a configuration file to get useful coverage.
- Which Sysmon events generate the most noise?
-
Image loads (event ID 7) and process access (event ID 10) — Microsoft’s documentation warns both can generate significant logging without filters, and ships ID 7 turned off. Unfiltered network connections (ID 3) are also high-volume, and file-delete archiving (ID 23) can quietly consume large amounts of disk space.