# Formaty wyjściowe

> Kolumny pliku danych CSV, dwa opcjonalne pliki statystyk oraz rzeczywiste przykładowe wyniki, które możesz otworzyć przed uruchomieniem czegokolwiek.

---

LLMS index: [llms.txt](/llms.txt)

---

`Convert-DNSDebugLogFile` generuje do trzech plików na każdy plik dziennika wejściowego:

| Plik | Zawiera | Tworzony gdy |
|---|---|---|
| `<name>.csv` | Jeden wiersz na wpis w dzienniku | `-OutputType CSV` lub `Both` |
| `<name>_Statistic.csv` | Dzienne zliczenie rekordów według kontekstu | `-OutputType Statistic` lub `Both` |
| `<name>_PacketStatistic.csv` | Dzienne zliczenie zapytań według klienta, protokołu, kierunku i typu rekordu | `-OutputType Statistic` lub `Both` |

`Both` jest ustawieniem domyślnym. Wyniki trafiają obok pliku wejściowego, chyba że ustawisz `-OutputFile`.

Przykładowe pliki podlinkowane na tej stronie to rzeczywiste wyniki konwersji, a nie makiety. Pobierz jeden i otwórz go w Excelu, zanim zdecydujesz się na projekt potoku.

## Plik danych CSV

Przykładowy wynik:

| Lokalizacja | Kolumna Szczegóły | Pliki |
|---|---|---|
| en-US | nieuzupełniona | [WithComputerName](../outputformat/en-us.-.dnsdebug-dc01.-.WithComputerName.csv), [NoComputerName](../outputformat/en-us.-.dnsdebug-dc01.-.NoComputerName.csv) |
| de-DE | nieuzupełniona | [WithComputerName](../outputformat/de-de.-.dnsdebug-dc01.-.WithComputerName.-.NoDetails.csv), [NoComputerName](../outputformat/de-de.-.dnsdebug-dc01.-.NoComputerName.-.NoDetails.csv) |
| de-DE | uzupełniona | [WithComputerName](../outputformat/de-de.-.dnsdebug-dc01.-.WithComputerName.-.WithDetails.csv), [NoComputerName](../outputformat/de-de.-.dnsdebug-dc01.-.NoComputerName.-.WithDetails.csv) |

Dwa wiersze z rzeczywistej konwersji — zapytanie DNS i notatka wewnętrzna serwera:

```text
DateTime;ThreadId;Context;PacketId;Protocol;Direction;ClientIP;Xid;Type;Opcode;FlagsHex;FlagsChar;ResponseCode;QuestionType;QuestionName;Information;Details;ComputerName
2026-01-20 23:00:16;0FE0;Packet;000002C53117D990;UDP;Rcv;10.0.0.2;c049;Query;Standard;0001;RecursionDesired;NOERROR;A;"odc.officeapps.live.com";"";"";dc01
2026-01-20 23:00:16;DF0;Note;;;;;;;;;;;;"";"got GQCS failure on a dead socket context status=995, socket=904";"";dc01
```

### Kolumny

Zawsze 18 kolumn, zawsze w tej kolejności:

| # | Kolumna | Znaczenie | Typowe zastosowanie |
|---|---|---|---|
| 1 | `DateTime` | Znacznik czasu wpisu | Filtrowanie po czasie, łączenie z innymi dziennikami |
| 2 | `ThreadId` | Wątek roboczy serwera DNS | Rzadko potrzebne; przydatne przy korelowaniu problemów wewnętrznych serwera |
| 3 | `Context` | Rodzaj wpisu: `Packet`, `Event`, `Note`, `DSPoll`, `Init`, `Lookup`, `Recurse`, `Remote`, `Tombstone` | Pierwszy filtr, który zastosujesz — `Packet` to rzeczywisty ruch DNS |
| 4 | `PacketId` | Wewnętrzny identyfikator pakietu | Parowanie zapytania z odpowiedzią |
| 5 | `Protocol` | `UDP` lub `TCP` | Skoki TCP mogą wskazywać na duże odpowiedzi lub transfery stref |
| 6 | `Direction` | `Rcv` (zapytanie przyszło) lub `Snd` (serwer odpowiedział) | Oddzielenie wolumenu zapytań od odpowiedzi |
| 7 | `ClientIP` | Adres hosta zapytującego | Analiza najaktywniejszych, zakres incydentu |
| 8 | `Xid` | ID transakcji DNS (hex) | Dopasowanie zapytania i odpowiedzi |
| 9 | `Type` | `Query` lub `Response` | |
| 10 | `Opcode` | `Standard`, `Notify`, `Update`, `Unknown` | Oddziela dynamiczne aktualizacje i powiadomienia stref od normalnych zapytań |
| 11 | `FlagsHex` | Surowe flagi nagłówka (hex) | Do głębokiej analizy protokołu |
| 12 | `FlagsChar` | Zdekodowane flagi: `Authoritative`, `Truncated`, `RecursionDesired`, `RecursionAvailable` | Czytelna wersja powyższych |
| 13 | `ResponseCode` | `NOERROR`, `NXDOMAIN`, `SERVFAIL`, … | Raportowanie błędów, poszukiwanie niepowodzeń rozwiązywania |
| 14 | `QuestionType` | Typ rekordu: `A`, `AAAA`, `MX`, `PTR`, `TXT`, … | Wolumen `TXT` to klasyczny wskaźnik tunelowania |
| 15 | `QuestionName` | Zapytana nazwa jako normalny FQDN | Dopasowanie wywiadu zagrożeń, raporty top-domen |
| 16 | `Information` | Wolny tekst dla wpisów `Event` / `Note`; dla bloków szczegółów `Packet` linia nagłówka TCP/UDP | Odczyt komunikatów serwera |
| 17 | `Details` | Reprezentacja JSON bloku szczegółów `Packet`; pusta w innych przypadkach | Pełna inspekcja pakietu bez powrotu do surowego dziennika |
| 18 | `ComputerName` | Serwer źródłowy, z `-ComputerName` | Utrzymanie przypisania zbiorów danych z wielu serwerów |

Dwie rzeczy do zaplanowania:

- **Nie każda kolumna jest wypełniona w każdym wierszu.** Tylko wpisy `Packet` mają IP klienta, nazwę zapytania i kod odpowiedzi. Wiersze `Note` i `Event` zawierają swój tekst w `Information` i pozostawiają kolumny protokołu puste. Zaprojektuj schemat bazy danych i filtry w panelu odpowiednio.
- **`ComputerName` jest zawsze ostatnią kolumną, nawet jeśli nie używasz `-ComputerName`.** Wtedy jest po prostu pusta. To utrzymuje identyczny układ we wszystkich serwerach, więc możesz łączyć pliki z wielu serwerów DNS bez kroku mapowania kolumn.

### Kolumna Szczegóły

Bloki szczegółów pojawiają się tylko, jeśli serwer DNS jest skonfigurowany do logowania pełnych szczegółów pakietów. Gdy istnieją, parser konwertuje je do pojedynczej wartości JSON, aby wiersz pozostał jednoliniowy:

```json
{
  "Socket": "848",
  "Remote": "addr 10.10.0.11, port 60580",
  "Buflength": "0x10000 (65536)",
  "Message": {
    "XID": "0x0001",
    "OPCODE": "0 (QUERY)",
    "RCODE": "0 (NOERROR)",
    "QUESTION": [ { "Name": "berlin.de", "QTYPE": "A (1)", "QCLASS": "1" } ],
    "ANSWER": []
  }
}
```

Parsowanie tych bloków kosztuje czas i znacznie powiększa plik CSV. Jeśli ich nie potrzebujesz, użyj `-NoDetailsParsing` — kolumna pozostaje obecna, ale pusta, a konwersja jest szybsza. Zobacz [Wydajność](../04-performance/).

## Pliki statystyk

Statystyki to dzienne agregaty. Używaj ich, gdy chcesz trend lub podsumowanie i nie chcesz przenosić pełnego zestawu rekordów — są o rzędy wielkości mniejsze niż plik danych.

### Statystyki kontekstu (`*_Statistic.csv`)

Odpowiadają na pytanie: *ile jakiego rodzaju aktywności zdarzyło się danego dnia?*

```text
Date;Context;Count;ComputerName
2026-01-20;Event;2;dc01
2026-01-20;Note;2;dc01
2026-01-20;Packet;12;dc01
```

| Kolumna | Znaczenie |
|---|---|
| `Date` | Dzień, zawsze `yyyy-MM-dd` |
| `Context` | Nazwa kontekstu (`Packet`, `Event`, `Note`, …) |
| `Count` | Liczba rekordów tego kontekstu w danym dniu |
| `ComputerName` | Serwer źródłowy |

Przykładowe pliki: [en-US WithComputerName](../outputformat/en-us.-.dnsdebug-dc01_Statistic.-.WithComputerName.csv), [en-US NoComputerName](../outputformat/en-us.-.dnsdebug-dc01_Statistic.-.NoComputerName.csv), [de-DE WithComputerName](../outputformat/de-de.-.dnsdebug-dc01_Statistic.-.WithComputerName.csv), [de-DE NoComputerName](../outputformat/de-de.-.dnsdebug-dc01_Statistic.-.NoComputerName.csv)

### Statystyki pakietów (`*_PacketStatistic.csv`)

Odpowiadają na pytanie: *kto zapytał o co, jak często, danego dnia?*

```text
Date;ClientIP;Protocol;Direction;QuestionType;Count;ComputerName
2026-01-20;10.0.0.1;UDP;Rcv;A;3;dc01
2026-01-20;10.0.0.1;UDP;Snd;A;3;dc01
2026-01-20;10.0.0.2;UDP;Rcv;A;3;dc01
```

| Kolumna | Znaczenie |
|---|---|
| `Date` | Dzień, zawsze `yyyy-MM-dd` |
| `ClientIP` | Host zapytujący |
| `Protocol` | `UDP` lub `TCP` |
| `Direction` | `Rcv` lub `Snd` |
| `QuestionType` | Typ rekordu DNS |
| `Count` | Liczba pasujących pakietów tego dnia |
| `ComputerName` | Serwer źródłowy |

Przykładowe pliki: [en-US WithComputerName](../outputformat/en-us.-.dnsdebug-dc01_PacketStatistic.-.WithComputerName.csv), [en-US NoComputerName](../outputformat/en-us.-.dnsdebug-dc01_PacketStatistic.-.NoComputerName.csv), [de-DE WithComputerName](../outputformat/de-de.-.dnsdebug-dc01_PacketStatistic.-.WithComputerName.csv), [de-DE NoComputerName](../outputformat/de-de.-.dnsdebug-dc01_PacketStatistic.-.NoComputerName.csv)

<div class="alert alert-info" role="alert"><div class="h4 alert-heading" role="heading">Liczby to sumy, nie unikalne wartości</div>


`Count` to liczba rekordów w tej dziennej grupie. Klient, który zapytał o tę samą nazwę 500 razy, wnosi 500, a nie 1. Jeśli liczba wydaje się zbyt wysoka, zwykle to jest powód.
</div>


## Separator i format daty

Oba typy wyjścia respektują `-Delimiter` (domyślnie `;`) i `-OutputCulture`. Dla wszystkiego, co będzie importowane przez maszynę, używaj znaczników czasu w stylu ISO:

```powershell
Convert-DNSDebugLogFile -InputFile "C:\Logs\dns.log" -OutputCulture 'sv-SE'
```

To daje `2026-01-20 23:00:16`, które SQL Server, Power BI i pandas odczytują bez wskazówki formatu. Szczegóły w [Parametry i opcje](../03-parameters-and-options/).
