<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DNSServer.DebugLogParser on PowerShell module DNSServer.DebugLogParser</title><link>https://DNSServerDebugLogParser.andibellstedt.com/</link><description>Recent content in DNSServer.DebugLogParser on PowerShell module DNSServer.DebugLogParser</description><generator>Hugo</generator><language>en</language><lastBuildDate>Fri, 24 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://DNSServerDebugLogParser.andibellstedt.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Overview</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/01-overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/01-overview/</guid><description>&lt;p&gt;Windows DNS Server can write a debug log. It is a plain text file, it is meant to be read by a human, and it grows by hundreds of megabytes a day on a busy domain controller. That combination makes it nearly useless the moment you want to answer a question like &lt;em&gt;&amp;ldquo;which client asked for this domain 40.000 times last night?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DNSServer.DebugLogParser&lt;/strong&gt; turns that text file into a CSV table. One log line becomes one row with named columns, so you can open it in Excel, load it into Power BI, bulk-insert it into SQL Server, or ship it to your SIEM.&lt;/p&gt;</description></item><item><title>Output Formats</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/02-output-formats/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/02-output-formats/</guid><description>&lt;p&gt;&lt;code&gt;Convert-DNSDebugLogFile&lt;/code&gt; produces up to three files per input log:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;File&lt;/th&gt;
					&lt;th&gt;Contains&lt;/th&gt;
					&lt;th&gt;Created when&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;.csv&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;One row per parsed log entry&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;-OutputType CSV&lt;/code&gt; or &lt;code&gt;Both&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;_Statistic.csv&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Daily record count per context&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;-OutputType Statistic&lt;/code&gt; or &lt;code&gt;Both&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;_PacketStatistic.csv&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Daily query count per client, protocol, direction and record type&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;-OutputType Statistic&lt;/code&gt; or &lt;code&gt;Both&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;Both&lt;/code&gt; is the default. Output lands next to the input file unless you set &lt;code&gt;-OutputFile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The sample files linked on this page are real conversion results, not mock-ups. Download one and open it in Excel before you commit to a pipeline design.&lt;/p&gt;</description></item><item><title>Parameters and Options</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/03-parameters-and-options/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/03-parameters-and-options/</guid><description>&lt;p&gt;This page explains the options in plain language and in the order you will typically need them. It is a guide, not a specification — the authoritative, always-current parameter list lives in the &lt;a href="../commands/convert-dnsdebuglogfile/"&gt;command reference&lt;/a&gt; and in:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Get-Help Convert-DNSDebugLogFile -Full
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="the-short-version"&gt;The short version&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Convert-DNSDebugLogFile -InputFile &amp;quot;C:\Logs\dns.log&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That single line already gives you sensible behaviour: both data and statistics files, semicolon delimiter, your machine&amp;rsquo;s date format, header validation on, source log untouched. Everything below is fine-tuning.&lt;/p&gt;</description></item><item><title>Performance</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/04-performance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/04-performance/</guid><description>&lt;p&gt;DNS debug logs on a busy domain controller are big. &lt;code&gt;Convert-DNSDebugLogFile&lt;/code&gt; is built for that case: it has been tested with logs of 100 MB and beyond, and it processes them in minutes on ordinary server hardware.&lt;/p&gt;
&lt;h2 id="why-it-is-fast"&gt;Why it is fast&lt;/h2&gt;
&lt;p&gt;You do not need to know any of this to use the module, but it explains the behaviour you will observe.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Technique&lt;/th&gt;
					&lt;th&gt;Effect you notice&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;StreamReader&lt;/code&gt; / &lt;code&gt;StreamWriter&lt;/code&gt; with 64 KB buffers&lt;/td&gt;
					&lt;td&gt;The file is read and written in chunks instead of one big &lt;code&gt;Get-Content&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Streaming, single pass&lt;/td&gt;
					&lt;td&gt;Memory usage stays roughly flat no matter how large the log is&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;String operations (&lt;code&gt;.Substring()&lt;/code&gt;, &lt;code&gt;.IndexOf()&lt;/code&gt;) instead of regular expressions&lt;/td&gt;
					&lt;td&gt;Considerably less CPU per line, and there are millions of lines&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CSV written by hand instead of &lt;code&gt;Export-Csv&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;No object pipeline overhead per record&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Hashtable-based aggregation for statistics&lt;/td&gt;
					&lt;td&gt;Rollups cost almost nothing extra during the same pass&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The important consequence: &lt;strong&gt;the whole log is never held in memory.&lt;/strong&gt; A 500 MB log does not need 500 MB of RAM. This is the difference between the module and the &amp;ldquo;read the file, split it, build objects&amp;rdquo; approach most home-grown scripts take — that approach works fine on a 5 MB sample and falls over on a real DC.&lt;/p&gt;</description></item><item><title>Integration with Analysis Tools</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/05-integration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/05-integration/</guid><description>&lt;p&gt;The point of converting a DNS debug log is what happens next. CSV was chosen because everything reads it — but &amp;ldquo;everything reads CSV&amp;rdquo; hides two settings that decide whether an import is painless or an afternoon of fiddling.&lt;/p&gt;
&lt;h2 id="two-settings-that-decide-everything"&gt;Two settings that decide everything&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Delimiter.&lt;/strong&gt; Default is &lt;code&gt;;&lt;/code&gt;. Keep it for Excel in locales that use the comma as decimal separator. Switch to &lt;code&gt;,&lt;/code&gt; for most databases and data-science tooling. Whatever you choose, tell the importing side the same thing.&lt;/p&gt;</description></item><item><title>Operational Best Practices</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/06-operational-best-practices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/06-operational-best-practices/</guid><description>&lt;p&gt;Converting a log by hand is easy. Running it every night on every domain controller, for years, without anyone looking at it, is the part that needs a bit of design. These are the points that matter in practice.&lt;/p&gt;
&lt;h2 id="1-convert-rotated-logs-not-the-active-one"&gt;1. Convert rotated logs, not the active one&lt;/h2&gt;
&lt;p&gt;Enable log rollover on the DNS server and convert only closed files. The module &lt;em&gt;can&lt;/em&gt; read the log DNS Server is currently writing to, but that file changes underneath the conversion: the newest entries may be missing and the last record may be truncated. Two runs produce two different results.&lt;/p&gt;</description></item><item><title>Troubleshooting</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/08-troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/08-troubleshooting/</guid><description>&lt;h2 id="the-file-is-not-a-valid-dns-debug-log-file"&gt;&amp;ldquo;The file is not a valid DNS debug log file&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;The header check rejected the input. Usually the path is simply wrong — a &lt;code&gt;.log&lt;/code&gt; file in the same folder that is not the DNS debug log, or a file that only contains a rotated header.&lt;/p&gt;
&lt;p&gt;Work through this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open the file. A DNS debug log starts with a header line such as &lt;code&gt;Message logging started at …&lt;/code&gt; and continues with timestamped query entries.&lt;/p&gt;</description></item><item><title>Convert-DNSDebugLogFile</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/commands/convert-dnsdebuglogfile/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/commands/convert-dnsdebuglogfile/</guid><description>&lt;!-- This file is auto-generated using PlatyPS + HUGO Workflow automation. Avoid editing directly! Original Front-Matter:
date: 2026-07-24
document type: cmdlet
external help file: DNSServer.DebugLogParser-Help.xml
flagTranslation: Primary
HelpUri: https://github.com/AndiBellstedt/DNSServer.DebugLogParser
Locale: en-US
Module Name: DNSServer.DebugLogParser
ms.date: 07/24/2026
PlatyPS schema version: 2024-05-01
title: Convert-DNSDebugLogFile
type: docs
--&gt;
&lt;h2 id="synopsis"&gt;SYNOPSIS&lt;/h2&gt;
&lt;p&gt;Transforms Windows DNS Server debug logs into structured CSV format for analysis and reporting.&lt;/p&gt;
&lt;h2 id="syntax"&gt;SYNTAX&lt;/h2&gt;
&lt;h3 id="__allparametersets"&gt;__AllParameterSets&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Convert-DNSDebugLogFile [-InputFile] &amp;lt;string[]&amp;gt; [[-OutputFile] &amp;lt;string&amp;gt;] [[-Delimiter] &amp;lt;string&amp;gt;]
 [[-ComputerName] &amp;lt;string&amp;gt;] [[-OutputType] &amp;lt;string&amp;gt;] [[-ContextFilter] &amp;lt;string[]&amp;gt;]
 [[-InputCulture] &amp;lt;cultureinfo&amp;gt;] [[-OutputCulture] &amp;lt;cultureinfo&amp;gt;] [-SkipHeaderValidation]
 [-RemoveSourceFile] [-CompressOutput] [-NoDetailsParsing] [-WhatIf] [-Confirm]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="aliases"&gt;ALIASES&lt;/h2&gt;
&lt;p&gt;This cmdlet has the following aliases,&lt;/p&gt;</description></item><item><title>Release notes v1.2.2.0 (2026-07-24)</title><link>https://DNSServerDebugLogParser.andibellstedt.com/changelog/release-v1.2.2.0/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/changelog/release-v1.2.2.0/</guid><description>&lt;h2 id="added"&gt;Added&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: Support for reading DNS Server debug log files that are currently open by the DNS service
&lt;ul&gt;
&lt;li&gt;Enables processing of active log files without requiring the file to be closed first&lt;/li&gt;
&lt;li&gt;Improves compatibility with logs that are still being written or held open by another process&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be cautious&lt;/strong&gt; when processing live logs, as records may be incomplete or in flux&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: Support for SMB/UNC paths when reading source log files
&lt;ul&gt;
&lt;li&gt;Allows the parser to work with files stored on network shares and remote locations&lt;/li&gt;
&lt;li&gt;Improves reliability in centralized or shared storage environments&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="changed"&gt;Changed&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Module metadata&lt;/strong&gt;: Updated ProjectUri and ReleaseNotes to point to the &lt;strong&gt;official website &lt;a href="https://dnsserverdebuglogparser.andibellstedt.com"&gt;https://dnsserverdebuglogparser.andibellstedt.com&lt;/a&gt;&lt;/strong&gt; for better discoverability and documentation access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixed File access&lt;/strong&gt;: Updated the underlying file opening logic to use stream-based access with explicit options for shared read scenarios
&lt;ul&gt;
&lt;li&gt;Improves handling of live log files and alternate path types such as UNC shares&lt;/li&gt;
&lt;li&gt;Maintains consistent behavior for local and remote file sources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Release notes v1.2.1.0 (2026-01-26)</title><link>https://DNSServerDebugLogParser.andibellstedt.com/changelog/release-v1.2.1.0/</link><pubDate>Mon, 26 Jan 2026 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/changelog/release-v1.2.1.0/</guid><description>&lt;h2 id="changed"&gt;Changed&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Improved multi-line record processing to avoid loading large files into memory
&lt;ul&gt;
&lt;li&gt;Prevents out-of-memory errors on very large log files&lt;/li&gt;
&lt;li&gt;Maintains full support for PACKET detail blocks and indented continuation lines&lt;/li&gt;
&lt;li&gt;Memory usage is now constant regardless of file size&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Progress&lt;/strong&gt;: Added &lt;code&gt;Write-Progress&lt;/code&gt; for processing feedback
&lt;ul&gt;
&lt;li&gt;Progress bar updates every 1000 records for minimal performance impact&lt;/li&gt;
&lt;li&gt;Displays current record count and file being processed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Release notes v1.2.0.0 (2026-01-25)</title><link>https://DNSServerDebugLogParser.andibellstedt.com/changelog/release-v1.2.0.0/</link><pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/changelog/release-v1.2.0.0/</guid><description>&lt;h2 id="added"&gt;Added&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: Multi-line record processing for DNS PACKET detail blocks
&lt;ul&gt;
&lt;li&gt;PACKET context entries can now include detailed TCP/UDP connection information and DNS message structure&lt;/li&gt;
&lt;li&gt;Detail blocks are parsed into structured JSON format in the new &lt;code&gt;Details&lt;/code&gt; column&lt;/li&gt;
&lt;li&gt;Includes: Socket info, remote address/port, timing data, message structure (XID, Flags, QCOUNT, etc.)&lt;/li&gt;
&lt;li&gt;DNS sections (QUESTION, ANSWER, AUTHORITY, ADDITIONAL) are captured with full record details&lt;/li&gt;
&lt;li&gt;Encoded domain names in detail blocks are automatically converted to FQDN format&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: &lt;code&gt;Details&lt;/code&gt; column in CSV output
&lt;ul&gt;
&lt;li&gt;Contains structured JSON data for PACKET entries with detail blocks&lt;/li&gt;
&lt;li&gt;Empty for PACKET entries without details and all non-PACKET contexts&lt;/li&gt;
&lt;li&gt;Enables deep packet analysis and forensic investigation of DNS queries/responses&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: &lt;code&gt;NoDetailsParsing&lt;/code&gt; switch parameter for performance optimization
&lt;ul&gt;
&lt;li&gt;Skips expensive JSON parsing of PACKET detail blocks&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Can improve&lt;/strong&gt;&lt;/em&gt; processing speed by &lt;strong&gt;30-50%&lt;/strong&gt; for logs with many detail blocks&lt;/li&gt;
&lt;li&gt;Use when processing very large files (100MB+) and detailed packet structure is not needed&lt;/li&gt;
&lt;li&gt;Detail blocks are still collected in Information column, but Details column remains empty&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: Multi-line continuation support for non-PACKET contexts
&lt;ul&gt;
&lt;li&gt;EVENT, Note, DSPoll, and other contexts can now span multiple lines&lt;/li&gt;
&lt;li&gt;Indented continuation lines are automatically joined to the main record&amp;rsquo;s Information field&lt;/li&gt;
&lt;li&gt;Preserves complete error messages, zone updates, and diagnostic output&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: &lt;code&gt;ContextFilter&lt;/code&gt; recognizes additional context types: &lt;code&gt;DSPoll&lt;/code&gt;, &lt;code&gt;Init&lt;/code&gt;, &lt;code&gt;Lookup&lt;/code&gt;, &lt;code&gt;Recurse&lt;/code&gt;, &lt;code&gt;Remote&lt;/code&gt;, &lt;code&gt;Tombstone&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Effect: &lt;code&gt;Convert-DNSDebugLogFile&lt;/code&gt; can now include/exclude these diagnostic and lifecycle entries via &lt;code&gt;-ContextFilter&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: Statistics output now includes two dedicated files
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_Statistic.csv&lt;/code&gt;: Daily record counts per context type (Date, Context, Count, ComputerName)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_PacketStatistic.csv&lt;/code&gt;: Daily PACKET counts by client/protocol/direction/type (Date, ClientIP, Protocol, Direction, QuestionType, Count, ComputerName)&lt;/li&gt;
&lt;li&gt;Benefit: More focused reporting (operational context volume vs. DNS traffic breakdown)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JSON generation for PACKET detail blocks is optimized for performance (manual parsing instead of regex)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="changed"&gt;Changed&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BREAKING&lt;/strong&gt;: CSV output now includes 18 columns (added &lt;code&gt;Details&lt;/code&gt; column before &lt;code&gt;ComputerName&lt;/code&gt;)
&lt;ul&gt;
&lt;li&gt;New column order: DateTime, ThreadId, Context, PacketId, Protocol, Direction, ClientIP, Xid, Type, Opcode, FlagsHex, FlagsChar, ResponseCode, QuestionType, QuestionName, Information, &lt;strong&gt;Details&lt;/strong&gt;, ComputerName&lt;/li&gt;
&lt;li&gt;Impact: Scripts that rely on column positions must be updated&lt;/li&gt;
&lt;li&gt;Benefit: Rich packet analysis capabilities without changing existing Information column behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data line processing refactored to read all lines into memory for efficient multi-line record detection
&lt;ul&gt;
&lt;li&gt;Performance: Minimal impact due to optimized List&lt;string&gt; usage&lt;/li&gt;
&lt;li&gt;Benefit: Enables accurate lookahead for detail blocks and continuation lines&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Question names that are missing or encoded as empty are now handled gracefully (no parse errors); CSV output will contain an empty QuestionName field when absent&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="improved"&gt;Improved&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Convert-DNSDebugLogFile&lt;/code&gt; parsing is more resilient: stricter line validation and improved extraction reduce spurious/invalid rows from malformed logs while preserving the CSV/statistic output format&lt;/li&gt;
&lt;li&gt;PACKET context detection distinguishes between simple queries and queries with detail blocks&lt;/li&gt;
&lt;li&gt;Empty lines after PACKET entries without details are properly skipped&lt;/li&gt;
&lt;li&gt;Domain name decoding in detail blocks uses existing &lt;code&gt;ConvertTo-Fqdn&lt;/code&gt; function for consistency&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="performance"&gt;Performance&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Processing speed maintained for logs without detail blocks&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NoDetailsParsing&lt;/code&gt; switch provides 30-50% speed improvement when JSON parsing is not needed&lt;/li&gt;
&lt;li&gt;Efficient state management during multi-line record processing&lt;/li&gt;
&lt;li&gt;Optimized string operations (TrimStart, Join) instead of regex for continuation line handling&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="notes"&gt;Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;These changes are designed to be backward compatible for normal usage. If you rely on an exact set of context names or previously-strict parsing behavior, please validate downstream scripts&lt;/li&gt;
&lt;li&gt;The new &lt;code&gt;Details&lt;/code&gt; column is always present in CSV output; use &lt;code&gt;NoDetailsParsing&lt;/code&gt; to keep it empty for performance&lt;/li&gt;
&lt;li&gt;Existing scripts that parse CSV by column position need to account for the new &lt;code&gt;Details&lt;/code&gt; column (position 17, before ComputerName)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Release notes v1.0.0 (2026-01-23)</title><link>https://DNSServerDebugLogParser.andibellstedt.com/changelog/release-v1.0.0/</link><pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/changelog/release-v1.0.0/</guid><description>&lt;h3 id="added"&gt;Added&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Initial release&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Convert-DNSDebugLogFile&lt;/code&gt; - High-performance parser for Windows DNS Server debug log files&lt;/li&gt;
&lt;li&gt;Parses all 15 standard fields from DNS debug logs into structured CSV format&lt;/li&gt;
&lt;li&gt;Supports customizable CSV delimiters (default: semicolon)&lt;/li&gt;
&lt;li&gt;Optional ComputerName column for multi-server log consolidation&lt;/li&gt;
&lt;li&gt;Three output modes: CSV data only, statistics only, or both&lt;/li&gt;
&lt;li&gt;Statistical summaries aggregating activity by client IP, protocol, and query type&lt;/li&gt;
&lt;li&gt;Pipeline support for batch processing multiple log files&lt;/li&gt;
&lt;li&gt;Header validation to ensure data integrity (can be bypassed if needed)&lt;/li&gt;
&lt;li&gt;Optional automatic compression of output files (ZIP format)&lt;/li&gt;
&lt;li&gt;Optional removal of source files after successful processing&lt;/li&gt;
&lt;li&gt;Culture-aware date parsing and formatting for international DNS servers&lt;/li&gt;
&lt;li&gt;Optimized for large files (100MB + ) using streaming I/O and efficient string operations&lt;/li&gt;
&lt;li&gt;Compatible with PowerShell 5.1+ (Desktop and Core editions)&lt;/li&gt;
&lt;li&gt;Supports Windows Server 2016+ and DNS Server 2012 R2 through 2025 log formats&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Release notes v1.1.0 (2026-01-23)</title><link>https://DNSServerDebugLogParser.andibellstedt.com/changelog/release-v1.1.0.0/</link><pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/changelog/release-v1.1.0.0/</guid><description>&lt;h2 id="added"&gt;Added&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: ContextFilter parameter for selective log parsing
&lt;ul&gt;
&lt;li&gt;Filter log entries by context type: PACKET (DNS queries/responses), EVENT (server events), or Note (diagnostic information)&lt;/li&gt;
&lt;li&gt;Allows focused analysis on specific log entry types&lt;/li&gt;
&lt;li&gt;Default: All (includes all context types)&lt;/li&gt;
&lt;li&gt;Use cases: Focus on DNS traffic only, monitor server events, troubleshoot diagnostic issues&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NEW&lt;/strong&gt;: Information field in CSV output
&lt;ul&gt;
&lt;li&gt;Captures detailed information for EVENT and Note context entries&lt;/li&gt;
&lt;li&gt;Examples: &amp;ldquo;The DNS server has started.&amp;rdquo;, &amp;ldquo;Zone loading completed&amp;rdquo;, socket errors, internal state messages&lt;/li&gt;
&lt;li&gt;Enhances visibility into DNS server operational events and diagnostics&lt;/li&gt;
&lt;li&gt;Field is populated when Context is EVENT or Note; empty for PACKET entries&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="changed"&gt;Changed&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BREAKING&lt;/strong&gt;: ComputerName column now always included at the end of all output records
&lt;ul&gt;
&lt;li&gt;Previously: ComputerName was conditionally included at the beginning when parameter was specified&lt;/li&gt;
&lt;li&gt;Now: ComputerName always present as the last column; empty when parameter not specified&lt;/li&gt;
&lt;li&gt;Benefit: Consistent output structure simplifies multi-server log consolidation and automated processing&lt;/li&gt;
&lt;li&gt;Impact: Existing scripts that parse column positions or expect conditional column presence must be updated&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="added-1"&gt;Added&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Context filtering to focus on specific log entry types (PACKET, EVENT, NOTE) via ContextFilter parameter&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="improved"&gt;Improved&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Refactored comment-based help for Convert-DNSDebugLogFile for better clarity and conciseness&lt;/li&gt;
&lt;li&gt;Updated parameter descriptions to be more informative and actionable&lt;/li&gt;
&lt;li&gt;Improved example documentation with more focused and practical use cases&lt;/li&gt;
&lt;li&gt;Enhanced about_DNSServer.DebugLogParser help file to reflect current functionality&lt;/li&gt;
&lt;li&gt;Enhanced verbose logging to provide more detailed progress information during processing&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Legal Notice</title><link>https://DNSServerDebugLogParser.andibellstedt.com/impressum/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/impressum/</guid><description>&lt;div&gt;&lt;a id="td-block-0" class="td-anchor-no-extra-offset"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;section class="row td-box td-box--primary td-box--height-auto"&gt;
&lt;div class="col"&gt;
&lt;div class="h1"&gt;
&lt;h1 id="information-pursuant-to-section-5-of-the-german-telemedia-act-tmg"&gt;Information pursuant to Section 5 of the German Telemedia Act (TMG)&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;br&gt;
&lt;h2 id="legal-notice"&gt;Legal notice&lt;/h2&gt;
&lt;p&gt;Andreas Bellstedt&lt;br&gt;
Brunnenstr. 38&lt;br&gt;
75387 Neubulach&lt;br&gt;
Germany&lt;/p&gt;
&lt;br&gt;
&lt;h2 id="contact"&gt;Contact&lt;/h2&gt;
&lt;p&gt;Email: &lt;a href="mailto:blog@andibellstedt.com"&gt;blog@andibellstedt.com&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2 id="legal-form--business-status"&gt;Legal form / business status&lt;/h2&gt;
&lt;p&gt;This website is operated by a private individual / sole proprietor.&lt;/p&gt;
&lt;br&gt;
&lt;h2 id="responsible-for-content-pursuant-to-section-552-of-the-german-interstate-broadcasting-treaty-rstv"&gt;Responsible for content pursuant to Section 55(2) of the German Interstate Broadcasting Treaty (RStV)&lt;/h2&gt;
&lt;p&gt;Andreas Bellstedt&lt;br&gt;
(Address above)&lt;/p&gt;
&lt;br&gt;
&lt;h2 id="liability-for-content"&gt;Liability for content&lt;/h2&gt;
&lt;p&gt;As a service provider, we are responsible for our own content on these pages in accordance with Section 7(1) TMG under general law. Pursuant to Sections 8–10 TMG, however, we are not obligated to monitor transmitted or stored third‑party information or to investigate circumstances that indicate illegal activity.&lt;/p&gt;</description></item><item><title>Privacy Policy</title><link>https://DNSServerDebugLogParser.andibellstedt.com/privacy-policy/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/privacy-policy/</guid><description>&lt;div&gt;&lt;a id="td-block-0" class="td-anchor-no-extra-offset"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;section class="row td-box td-box--primary td-box--height-auto"&gt;
&lt;div class="col"&gt;
&lt;div class="h1"&gt;
&lt;h1 id="privacy-policy"&gt;Privacy Policy&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;br&gt;
&lt;h2 id="1-privacy-at-a-glance"&gt;1. Privacy at a Glance&lt;/h2&gt;
&lt;h3 id="general-notes"&gt;General Notes&lt;/h3&gt;
&lt;p&gt;The following notes provide a simple overview of what happens to your personal data when you visit this website. Personal data are all data with which you can be personally identified. Detailed information on the topic of data protection can be found in our privacy policy listed below this text.&lt;/p&gt;
&lt;h3 id="data-collection-on-this-website"&gt;Data Collection on this Website&lt;/h3&gt;
&lt;h4 id="who-is-responsible-for-data-collection-on-this-website"&gt;Who is responsible for data collection on this website?&lt;/h4&gt;
&lt;p&gt;The data processing on this website is carried out by the website operator. Their contact details can be found in the section “Notice on the Data Controller” in this privacy policy.&lt;/p&gt;</description></item><item><title>About the Author</title><link>https://DNSServerDebugLogParser.andibellstedt.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/about/</guid><description>&lt;link rel="preload" as="image" href="https://DNSServerDebugLogParser.andibellstedt.com/images/main-background_hu_fa24d3b9a9ebf86.jpg" media="(max-width: 1200px)"&gt;
&lt;link rel="preload" as="image" href="https://DNSServerDebugLogParser.andibellstedt.com/images/main-background_hu_96620a9289dc443e.jpg" media="(min-width: 1200px)"&gt;
&lt;style&gt;
#td-cover-block-0 {
 background-image: url(/images/main-background_hu_fa24d3b9a9ebf86.jpg);
}
@media only screen and (min-width: 1200px) {
 #td-cover-block-0 {
 background-image: url(/images/main-background_hu_96620a9289dc443e.jpg);
 }
}
&lt;/style&gt;
&lt;section id="td-cover-block-0" class="row td-cover-block td-cover-block--height-auto td-below-navbar js-td-cover td-overlay td-overlay--dark -bg-dark" &gt;
 &lt;div class="col-12"&gt;
 &lt;div class="container td-overlay__inner"&gt;
 &lt;div class="text-center"&gt;
 &lt;h1 class="display-1 mt-0 mt-md-5 pb-4"&gt;About the Author&lt;/h1&gt;
 &lt;div class="pt-3 lead"&gt;
 &lt;!-- color="primary bg-gradient td-below-navbar" --&gt;
&lt;p&gt;&lt;img src="https://DNSServerDebugLogParser.andibellstedt.com/images/about/author.png" alt="Me"&gt;&lt;/p&gt;
&lt;!-- prettier-ignore --&gt;
&lt;p class="display-6"&gt;- Andi Bellstedt -&lt;/p&gt;
&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/section&gt;
&lt;div&gt;&lt;a id="td-block-1" class="td-anchor-no-extra-offset"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;section class="row td-box td-box--white td-box--height-auto"&gt;
&lt;div class="col"&gt;
&lt;div class="container"&gt;
&lt;h2 id="hello-to-the-world"&gt;Hello to the World!&lt;/h2&gt;
&lt;br&gt;
&lt;p&gt;I&amp;rsquo;m &lt;strong&gt;Andreas Bellstedt&lt;/strong&gt; — an IT professional with more than &lt;strong&gt;20 years of experience&lt;/strong&gt; across enterprise environments. Usually I am called &lt;strong&gt;Andi&lt;/strong&gt;.&lt;br&gt;
I’m passionate about technology, but even more about applying it in a way that improves reliability, security, and operational efficiency.&lt;/p&gt;</description></item><item><title>Practical usage in a Domain Environment (GPO-driven collection and conversion)</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/examples/gpo-driven-collection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/examples/gpo-driven-collection/</guid><description>&lt;p&gt;This document outlines a practical, end-to-end example of running DNSServer.DebugLogParser in an Active Directory domain environment, focused on converting Windows DNS Server debug logs on domain controllers.&lt;/p&gt;
&lt;p&gt;This example is accompanied by a &lt;a href="../gpo/T0-C-Analytics-DNSDebugLogging.zip"&gt;ZIP archive&lt;/a&gt;, which provide the policy artifacts used to implement the workflow described here.&lt;br&gt;
The most relevant artifacts are &lt;a href="../gpo/backup/manifest.xml" target="_blank" rel="noopener noreferrer"&gt;backup manifest&lt;/a&gt;, &lt;a href="../gpo/backup/{2B6F16BC-0E7C-4787-83D7-2854FED882EE}/gpreport.xml" target="_blank" rel="noopener noreferrer"&gt;GPO report&lt;/a&gt;, &lt;a href="../gpo/backup/{2B6F16BC-0E7C-4787-83D7-2854FED882EE}/DomainSysvol/GPO/Machine/Preferences/Files/Files.xml" target="_blank" rel="noopener noreferrer"&gt;Files.xml&lt;/a&gt;, &lt;a href="../gpo/backup/{2B6F16BC-0E7C-4787-83D7-2854FED882EE}/DomainSysvol/GPO/Machine/Preferences/Files/Set-DNSServerDebugLogging.ps1" target="_blank" rel="noopener noreferrer"&gt;Set-DNSServerDebugLogging.ps1&lt;/a&gt;, and &lt;a href="../gpo/backup/{2B6F16BC-0E7C-4787-83D7-2854FED882EE}/DomainSysvol/GPO/Machine/Preferences/ScheduledTasks/ScheduledTasks.xml" target="_blank" rel="noopener noreferrer"&gt;ScheduledTasks.xml&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="scenario"&gt;Scenario&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Multiple domain controllers (DCs) host the DNS Server role.&lt;/li&gt;
&lt;li&gt;DNS debug logging is enabled and configured consistently on each DC via a scheduled task (writing log files to &lt;code&gt;C:\Administration\Logs\DNSServer&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;A centrally managed process converts logs into CSV for:
&lt;ul&gt;
&lt;li&gt;security analytics&lt;/li&gt;
&lt;li&gt;operational reporting&lt;/li&gt;
&lt;li&gt;troubleshooting&lt;/li&gt;
&lt;li&gt;compliance/retention&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="target-outcomes"&gt;Target outcomes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Consistent conversion settings across all DCs&lt;/li&gt;
&lt;li&gt;Predictable output location and naming&lt;/li&gt;
&lt;li&gt;Optional compression to reduce storage footprint&lt;/li&gt;
&lt;li&gt;Optional statistics outputs for quick daily rollups&lt;/li&gt;
&lt;li&gt;Minimal host-side risk, with explicit rerun and cleanup considerations&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="suggested-architecture"&gt;Suggested architecture&lt;/h2&gt;
&lt;h3 id="collection-model-local-convert--central-pull"&gt;Collection model: local convert + central pull&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Each DC writes DNS debug logs to disk with rollover enabled.&lt;/li&gt;
&lt;li&gt;Each DC converts rotated &lt;code&gt;*.log&lt;/code&gt; files into a data CSV and statistics CSVs, then compresses the outputs into &lt;code&gt;*.zip&lt;/code&gt; on a schedule (Task Scheduler).&lt;/li&gt;
&lt;li&gt;Outputs are written next to the log files so the pipeline stays simple.&lt;/li&gt;
&lt;li&gt;A central server collects the &lt;code&gt;*.zip&lt;/code&gt; outputs, for example via file share ingestion, scheduled copy, SIEM forwarder, or an agent-based collector.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This model minimizes network reads of large raw log files and keeps parsing close to the data.&lt;/p&gt;</description></item><item><title>Scheduled Task Example</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/examples/scheduletask/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/examples/scheduletask/</guid><description>&lt;p&gt;This script creates a Windows Scheduled Task that runs daily at 2:00 AM. It imports the module and processes all the log file in the folder where the script is executed (in this example &amp;ldquo;C:\Administration\Logs\DNS&amp;rdquo;). The process does compress the output into ZIP-files and removes the original to maintain hygiene.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;$actionParams = @{
 Execute = &amp;quot;powershell.exe&amp;quot;
 Argument = '-ExecutionPolicy RemoteSigned -Command &amp;quot;Import-Module DNSServer.DebugLogParser; Get-ChildItem .\*.log | Sort-Object lastwritetime, Name -Descending | Convert-DNSDebugLogFile -ComputerName $env:COMPUTERNAME -Delimiter \&amp;quot;;\&amp;quot; -OutputType Both -ContextFilter Packet -OutputCulture sv-SE -CompressOutput&amp;quot;'
 WorkingDirectory = &amp;quot;C:\Administration\Logs\DNS&amp;quot;
}
$Action = New-ScheduledTaskAction @actionParams

$Trigger = New-ScheduledTaskTrigger -Daily -At &amp;quot;2:00AM&amp;quot;

Register-ScheduledTask -TaskName &amp;quot;Process DNS Logs&amp;quot; -Action $Action -Trigger $Trigger -Description &amp;quot;Convert DNS debug logs to CSV daily&amp;quot;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Search Results</title><link>https://DNSServerDebugLogParser.andibellstedt.com/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/search/</guid><description>&lt;!--
 This page is generated by the search layout and is not meant to be edited directly.
 The content is generated from the search index and the search query.
 The search query is passed as a URL parameter "q", e.g. /en/search?q=example
--&gt;</description></item><item><title>Website information</title><link>https://DNSServerDebugLogParser.andibellstedt.com/site/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/site/</guid><description>&lt;!--
 This comment should stay for translation purposes on pester testing, but the content of this comment is not much relevant for the end user and can be ignored.
 This page is meant to provide information about the website, such as the theme used, build process, and other relevant details.
--&gt;
&lt;h2 id="build-information"&gt;Build information&lt;/h2&gt;
&lt;p&gt;Site built with [&lt;span class="badge bg-primary text-bg-primary fs-6"&gt;Docsy]&lt;/span&gt; theme for Hugo.&lt;/p&gt;</description></item><item><title>Security Analysis Workflow with SQL Server</title><link>https://DNSServerDebugLogParser.andibellstedt.com/docs/examples/security-analysis-sql/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://DNSServerDebugLogParser.andibellstedt.com/docs/examples/security-analysis-sql/</guid><description>&lt;p&gt;This example shows a practical workflow for security analytics: parse a DNS
debug log with &lt;code&gt;Convert-DNSDebugLogFile&lt;/code&gt;, import the generated CSV into SQL
Server, and run a query that highlights unusually high volumes of TXT record
lookups.&lt;/p&gt;
&lt;p&gt;For best interoperability, this example writes timestamps in an ISO-like format
by using &lt;code&gt;-OutputCulture 'sv-SE'&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="required-modules"&gt;Required modules&lt;/h2&gt;
&lt;p&gt;This example uses the following PowerShell modules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DNSServer.DebugLogParser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SqlServer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Install them if needed:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Install-Module -Name DNSServer.DebugLogParser -Scope CurrentUser
Install-Module -Name SqlServer -Scope CurrentUser
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="scenario"&gt;Scenario&lt;/h2&gt;
&lt;p&gt;Use this workflow when you want to move parsed DNS debug log data into SQL
Server so you can:&lt;/p&gt;</description></item></channel></rss>