Skip to content

.NET API Reference

loq provides .NET bindings for programmatic log analysis. The Loq.Classic package is a drop-in replacement for the MS Log Parser 2.2 COM API. Works on Windows and Linux — no COM registration required.

Quick Start

Installation

bash
dotnet add package Loq.Classic  # COM-compatible API (MS Log Parser drop-in)
dotnet add package Loq          # Modern C# API (LINQ, async, streaming)

No additional setup needed — packages are on nuget.org.

csharp
using Loq.Classic;
using Loq.Classic.InputFormats;

// Basic query — works on Windows and Linux
using var lp = new LogQuery();
using var rs = lp.Execute("SELECT * FROM 'access.log' WHERE sc-status >= 500");

while (!rs.AtEnd)
{
    var rec = rs.GetRecord();
    Console.WriteLine($"{rec.GetValue("date")}: {rec.GetString("cs-uri-stem")}");
    rs.MoveNext();
}

With format context (configure input parsing)

csharp
using Loq.Classic;
using Loq.Classic.InputFormats;

using var lp = new LogQuery();
var w3c = new COMIISW3CInputContext
{
    iCodepage = 65001,     // UTF-8
    consolidateLogs = true
};

using var rs = lp.Execute(
    "SELECT c-ip, cs(User-Agent), sc-status FROM 'access.log' WHERE sc-status >= 400",
    w3c
);

while (!rs.AtEnd)
{
    var rec = rs.GetRecord();
    Console.WriteLine($"{rec.GetValue("c-ip")}: {rec.GetInt("sc-status")}");
    rs.MoveNext();
}

Batch execution (write to output file)

csharp
using Loq.Classic;
using Loq.Classic.InputFormats;
using Loq.Classic.OutputFormats;

using var lp = new LogQuery();
var csvIn = new COMCSVInputContext { headerRow = true };
var sqlOut = new COMSQLOutputContext
{
    server = "localhost",
    database = "logs",
    createTable = true
};

lp.ExecuteBatch(
    "SELECT * INTO results FROM 'access.log' WHERE sc-status >= 500",
    csvIn, sqlOut
);

Console.WriteLine($"Processed {lp.inputUnitsProcessed} rows");

COM API Compatibility

Loq.Classic implements the full MS Log Parser 2.2 COM API surface:

Core Classes

ClassDescription
LogQueryQuery execution (Execute, ExecuteBatch with format context overloads)
LogRecordSetCursor-based result iteration (AtEnd, MoveNext, GetRecord)
LogRecordRow data access (GetValue, GetValueEx, IsNull, ToNativeString)
LogStringCollectionError message collection (IEnumerable<string>)

LogQuery Properties

PropertyTypeDescription
maxParseErrorsintMax parsing errors before abort (-1 = unlimited)
lastErrorintLast error code
inputUnitsProcessedintRows processed in last ExecuteBatch
outputUnitsProcessedintRows output in last ExecuteBatch
errorMessagesLogStringCollectionError messages from last execution
versionMajintMajor version (2)
versionMinintMinor version (2)

Format Context Classes

16 input format contexts and 11 output format contexts matching every COM interface:

Input: COMCSVInputContext, COMIISW3CInputContext, COMTSVInputContext, COMXMLInputContext, COMIISIISInputContext, COMIISNCSAInputContext, COMIISBINInputContext, COMHttpErrorInputContext, COMURLScanLogInputContext, COMTextLineInputContext, COMTextWordInputContext, COMFileSystemInputContext, COMRegistryInputContext, COMW3CInputContext, COMNetMonInputContext, COMIISIISMSIDInputContext

Output: COMCSVOutputContext, COMTSVOutputContext, COMW3COutputContext, COMIISOutputContext, COMXMLOutputContext, COMSQLOutputContext, COMNativeOutputContext, COMTemplateOutputContext, COMDataGridOutputContext, COMChartOutputContext, COMSYSLOGOutputContext

Migration from MS Log Parser

Before (VBScript):

vbscript
Set lp = CreateObject("MSUtil.LogQuery")
Set csvFmt = CreateObject("MSUtil.LogQuery.CSVInputFormat")
csvFmt.headerRow = True
csvFmt.nSkipLines = 2

Set rs = lp.Execute("SELECT * FROM data.csv", csvFmt)
Do While Not rs.atEnd
    WScript.Echo rs.getRecord().getValue("name")
    rs.moveNext
Loop
rs.close

After (C# with Loq.Classic):

csharp
using Loq.Classic;
using Loq.Classic.InputFormats;

using var lp = new LogQuery();
var csvFmt = new COMCSVInputContext
{
    headerRow = true,
    nSkipLines = 2
};

using var rs = lp.Execute("SELECT * FROM data.csv", csvFmt);
while (!rs.AtEnd)
{
    Console.WriteLine(rs.GetRecord().GetValue("name"));
    rs.MoveNext();
}

Deployment

Linux (Docker)

dockerfile
FROM mcr.microsoft.com/dotnet/runtime:8.0
WORKDIR /app
COPY publish/ .
ENTRYPOINT ["dotnet", "YourApp.dll"]
bash
dotnet publish -c Release -r linux-x64 -o ./publish
docker build -t your-app .
docker run -v $(pwd)/logs:/logs your-app

Windows Service

bash
dotnet publish -c Release -r win-x64 --self-contained

Cross-Platform

The NuGet package includes native libraries for both platforms. Just dotnet publish for your target:

bash
dotnet publish -c Release -r linux-x64    # Linux
dotnet publish -c Release -r win-x64      # Windows

Cross-Platform Advantages

Unlike MS Log Parser (Windows-only COM), Loq.Classic:

  • Runs on Windows, Linux, and containers
  • No COM registration or regsvr32 needed
  • No platform-specific code — same C# on all platforms
  • 2-5x faster (Rust engine with zero-copy parsing)
  • Modern .NET 8 with IDisposable, nullable references

Modern API

For new applications, consider the Loq package with LINQ support, strong typing, and IEnumerable results. See the LLM docs for details.

All rights reserved.