Guide · Splunk Universal Forwarder migration

Migrating from the Splunk Universal Forwarder to DPLens, with your searches still working.

A step-by-step plan for Windows estates: inventory the forwarder, map inputs.conf and outputs.conf, keep your index and sourcetype, run both side by side, then cut over one server group at a time with a tested rollback.

Published 1 October 2026 · 12 min read

  • inputs.conf to sources
  • Cooked S2S on 9997
  • Parallel run
  • Rollback plan

In short

To migrate from the Splunk Universal Forwarder to DPLens, inventory each forwarder's effective inputs.conf and outputs.conf, recreate the inputs as DPLens sources and the tcpout group as a Splunk S2S destination to the same indexers, with the same index, source and sourcetype. Run both side by side, compare counts in Splunk, then stop and remove the forwarder one server group at a time.

DPLens Manager, included in every subscription, takes over from the deployment server: central configuration, fleet health monitoring, and deployment and upgrades, self-hosted and air-gap capable.

What maps to what

DPLens is a UK-built, self-hosted log collection and security data pipeline agent for Windows. It sends to Splunk over the protocol forwarders use to reach indexers (cooked S2S, conventionally port 9997) or over the HTTP Event Collector. You set everything below in the agent's console on one machine, or centrally for the fleet in DPLens Manager.

Universal Forwarder settings and their DPLens equivalents
Universal ForwarderDPLens
[WinEventLog://<channel>]A Windows Event Log source listing one or more channels
whitelist / blacklist of event codesSource filter: Event IDs to include or exclude, providers, severity, or your own XPath query. Applied at the source, so excluded events are never collected.
blacklist1…9 key=regex rulesA pipeline filter on event fields: equals, in a list, pattern match, network range and more
current_only / start_fromWhether a source starts from new events or reads existing ones. Start from new events when migrating.
renderXmlClassic or XML rendering, chosen per Splunk destination
[monitor://<path>]A file source with a path or wildcard. Rotation is followed.
index, sourcetype, source, hostSet on the Splunk destination, with per-source overrides
[tcpout:<group>] server =A Splunk S2S destination listing your indexers as a load-balanced pool
autoLBFrequency / autoLBVolumeLoad-balancing rotation by time (every 30 seconds by default) or by volume
useACKIndexer acknowledgement, turned on per destination
SSL settingsTLS with certificate validation, and a client certificate where the indexers require mutual TLS
Deployment server (agent management from Splunk 10.0)DPLens Manager: central configuration, fleet health monitoring, and deployment and upgrades

Step 1: inventory what the forwarder does

Don't read inputs.conf in one app folder and assume that's the whole picture. Settings merge across apps, so ask the forwarder for the effective configuration, with the file each line came from:

cd "C:\Program Files\SplunkUniversalForwarder\bin"
.\splunk.exe btool inputs list --debug  > C:\temp\uf-inputs.txt
.\splunk.exe btool outputs list --debug > C:\temp\uf-outputs.txt
.\splunk.exe show deploy-poll

Do this for one representative host per server class (domain controllers, file servers, IIS, SQL Server, workstations). For each, record:

  • every enabled WinEventLog stanza, with its index, renderXml, whitelist and blacklist lines
  • every monitor stanza, with its sourcetype, index and any whitelist/blacklist on file names
  • scripted, perfmon, WinHostMon, WinRegMon or admon inputs, listed separately with an owner and a decision for each
  • the tcpout groups, indexers, useACK and SSL settings
  • the deployment server and server classes that deliver each app

Then search your Splunk content for anything that reads the forwarder's own logs, such as index=_internal searches on forwarder hosts and forwarder dashboards in the Monitoring Console. That content retires with the forwarder, so plan its successor now (see Monitoring the fleet).

Step 2: map inputs.conf to sources

A typical Windows forwarder configuration:

[WinEventLog://Security]
disabled = 0
index = wineventlog
renderXml = false
current_only = 0
blacklist = 4658,4690
blacklist1 = EventCode="4662" Message="Object Type:(?!\s*groupPolicyContainer)"
blacklist2 = EventCode="5156" Message="Destination Address:\s+(127\.0\.0\.1|::1)"

[WinEventLog://System]
disabled = 0
index = wineventlog
renderXml = false

[monitor://C:\inetpub\logs\LogFiles\W3SVC1\*.log]
disabled = 0
index = web
sourcetype = ms:iis:auto

The same collection in DPLens, set in the agent console or in DPLens Manager:

  • A Windows Event Log source for the Security channel, starting from new events, excluding Event IDs 4658 and 4690 at the source. As an XPath query, that exclusion is *[System[(EventID!=4658 and EventID!=4690)]].
  • A Windows Event Log source for the System channel, starting from new events.
  • A file source for C:\inetpub\logs\LogFiles\W3SVC1\*.log, starting from new lines.
  • On the Security pipeline, a filter that drops Event ID 5156 where the destination address is 127.0.0.1 or ::1, the field-based equivalent of blacklist2.
  • Each source delivering to the Splunk destination from Step 4.

The configuration examples in the documentation walk through each of these.

Points to watch:

  • Start every source from new events. The forwarder has already sent the history. File sources read existing content unless you tell them otherwise, which would re-send every existing IIS log.
  • Plain event-code lists belong at the source, where excluded IDs are never collected. Use the source's exclude field or your own XPath query.
  • Message regexes need translating, not copying. The UF's blacklist1 matches rendered message text. DPLens filters on event fields. For 4662, the raw ObjectType is a schema GUID rather than the class name, so look up the class's GUID and filter on that.
  • One source per channel when the channels need different source values in Splunk, because Splunk metadata overrides are set per source.
  • Rendered messages. If searches depend on the rendered Message text, choose the Windows Event Log source's Universal Forwarder classic rendering, and compare the result on Live stream with what the forwarder sends.

Step 3: keep index, source, sourcetype and host

Splunk searches, dashboards and correlation rules key on index and sourcetype. The DPLens documentation puts it bluntly: if they don't match what your content expects, "the data arrives and nothing finds it". Find out what your indexes actually hold today, not what you think they hold:

| tstats count where index=wineventlog OR index=web by index, sourcetype, source

The sourcetype for Windows events depends on your Splunk Add-on for Windows version and on renderXml, so copy what you see here. In DPLens you set each value on the Splunk destination (see index, host, source and sourcetype), as a fixed value or taken from an event field, with per-source overrides. Rendering is chosen per destination, so if your inputs mix renderXml = true and false, use two Splunk S2S destinations to the same indexers, one for each rendering.

Check host too. Taking it from the event's Computer field gives the name Windows records, which may be a fully qualified name where your forwarder sent a short one. Dashboards keyed on host will notice.

Step 4: map outputs.conf to an S2S destination

[tcpout]
defaultGroup = primary_indexers

[tcpout:primary_indexers]
server = idx1.example.com:9997, idx2.example.com:9997, idx3.example.com:9997
autoLBFrequency = 30
useACK = true
clientCert = $SPLUNK_HOME\etc\auth\mycerts\client.pem
sslPassword = <encrypted>
sslVerifyServerCert = true

The equivalent in DPLens is one Splunk S2S destination:

  • The pool. List idx1, idx2 and idx3 on port 9997 as a load-balanced pool, rotating every 30 seconds. DPLens spreads traffic across every member, takes a member out of rotation when it stops accepting and brings it back once healthy. Events wait in the disk cache only when every member is down.
  • Metadata. Index wineventlog, sourcetype WinEventLog, host from the event's Computer field, and source WinEventLog:Security or WinEventLog:System per source; the IIS source overrides index to web and sourcetype to ms:iis:auto.
  • Acknowledgement. useACK maps to indexer acknowledgement on the destination. With it on, an event counts as delivered only once the indexer confirms it. Turn it on where you need indexer confirmation, and measure throughput on the pilot.
  • TLS. TLS on S2S is opt-in, as on a stock 9997 receiver, and once it is on, certificate validation is on, against the Windows trust store or a CA you supply. If your indexers require client certificates, add the client certificate and key to DPLens, which stores them as protected secrets.
  • Queueing. Each destination has its own disk cache, sized for your outage window. When it fills, the default is to pause collection, and any drop is counted.
  • Two tcpout groups (cloning to two Splunk environments) become one pipeline delivering to two destinations, each with its own queue.

Monitoring the fleet after the forwarder

For agent health, alert on the data itself. It is a strong signal whatever agent you run, because it catches an agent that is running but collecting nothing:

| tstats latest(_time) as last_seen where index=wineventlog by host
| where last_seen < relative_time(now(), "-30m")

Alongside it, DPLens Manager monitors fleet health centrally. On each host, the DPLens console shows source health, delivery state, cached backlog and counted losses, and every configuration apply and rollback is recorded in the agent's tamper-evident audit trail.

Step 5: run both and compare

The documented procedure has four steps. Configure DPLens alongside the forwarder, delivering to the same indexers with the same index and sourcetype. Compare what arrives from each over a period you're comfortable with. Stop the forwarder. Remove it.

One optional refinement makes the comparison easier. On a small pilot group, point DPLens at a temporary validation index (for example wineventlog_dplens, created on the indexers first) for a day or two. Then compare like for like:

| tstats count where (index=wineventlog OR index=wineventlog_dplens) host=PILOT-* earliest=-24h
    by index, sourcetype, host
(index=wineventlog OR index=wineventlog_dplens) host=PILOT-* earliest=-24h
| chart count over EventCode by index

Investigate any Event ID whose counts differ beyond what your filters explain. Run your most-used saved searches and dashboards against the validation index, and check that fields extract the same way. Then switch the pilot to the production index and continue as documented.

While both agents run, the same events are sent twice and count twice against a volume-based licence. Keep the overlap short and the pilot small.

Step 6: cut over by server group, with a rollback

  1. Order. Pilot first, then member servers, file and application servers, and domain controllers last. DCs carry the most detection content.
  2. Start DPLens before stopping the forwarder. Starting from new events, DPLens collects from the moment it starts, so starting it first gives overlap rather than a gap.
  3. Stop and disable, don't uninstall yet:
    sc.exe stop SplunkForwarder
    sc.exe config SplunkForwarder start= disabled
  4. Watch the group for one full business cycle: counts per sourcetype, your heartbeat search, fleet health in DPLens Manager, and the DPLens Overview for losses and cached backlog.
  5. Rollback is the reverse. Set the forwarder back to start= auto, start it, and stop DPLens or disable its pipelines. The forwarder resumes from its own checkpoint, so expect duplicates for the overlap rather than a gap, provided the Windows channel still holds the events. Confirm this on the pilot.
  6. Remove the forwarder once the group has been stable for as long as your change process requires, using whatever deployed it. Unsubscribe the hosts from the deployment server at the same time, so it doesn't reinstall apps.

Step 7: deploy at scale

The documentation suggests a sensible order. Configure one machine the way you want the fleet to run, and let it run until you are satisfied with what arrives at the indexers. That configuration is the reference. Then roll it out:

  • With DPLens Manager. Included in every subscription, it gives you central configuration, fleet health monitoring, and deployment and upgrades, and it is self-hosted and air-gap capable.
  • With your existing tools. Group Policy, Intune, Configuration Manager or an RMM install a single deployment package that carries the configuration with it.
  • Golden images and VDI. Install DPLens in the image and apply the configuration on the clones. Clones prepared with sysprep /generalize start with a fresh agent identity, checkpoints and cache, and the change is recorded in the audit trail. Keep secrets and licences out of the image.

A domain licence covers every machine joined to the domain, clones included. The deployment guide has the detail for each route.

Pre-flight checklist

  • Effective inputs.conf and outputs.conf captured with btool --debug for each server class.
  • Scripted, perfmon, WinHostMon, WinRegMon and admon inputs listed with an owner and a decision.
  • Index, source, sourcetype, host and rendering agreed per input, and checked against tstats output.
  • Every blacklist and whitelist ported, with message-regex rules rewritten against event fields.
  • Every source set to start from new events.
  • Every index the configuration names exists on the indexers, including any validation index.
  • CA bundle exported; client certificate and key added if the indexers require mutual TLS.
  • Acknowledgement decision recorded; disk cache sized per destination.
  • Content that reads forwarder _internal data found, with a data-based heartbeat alert in place.
  • Licence in place; rollout route (DPLens Manager or your existing tools) chosen and tested on a pilot.
  • Rollback steps written down and rehearsed on the pilot group.

For the business case and a side-by-side view, see Splunk Universal Forwarder replacement, the DPLens vs Splunk Universal Forwarder comparison and the Splunk integration.

Splunk is a trademark of Splunk LLC. DPLens is not affiliated with or endorsed by Splunk. The names are used only to say what DPLens interoperates with.

Sources

FAQ

Questions engineers ask

Can DPLens and the Universal Forwarder run on the same server?

Yes. Running them side by side is the first step of the documented replacement procedure. They are separate services with separate checkpoints. While both run, the same events are sent twice, so keep the overlap short.

Will my Splunk searches and dashboards keep working?

They will when the index, sourcetype, source, host and rendering match what your content expects. Find the current values with tstats, set them on the Splunk destination, and prove it during the parallel run before you stop the forwarder.

Do I need indexer acknowledgement?

Turn it on where you need delivery confirmed at the indexer, and measure throughput on the pilot. Every destination also has its own disk cache that rides out indexer outages.

What replaces the deployment server?

DPLens Manager, included in every subscription. It gives you central configuration, fleet health monitoring, and deployment and upgrades, and it is self-hosted and air-gap capable. You can also roll out with Group Policy, Intune, Configuration Manager or an RMM.

See it on your own logs

Try DPLens on one Windows server before you talk to anyone.

Book a demo, or request an evaluation licence and install it on a test host. The documentation covers everything from requirements to Group Policy rollout.