Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
0de4b1d
Update README.md
zhenyatnk Dec 21, 2021
08e885a
Merge branch 'pekabon:master' into master
zhenyatnk Dec 23, 2021
5199bd4
Скорректирована логика выделения закладок (#6)
zhenyatnk Dec 25, 2021
a3326a9
Update README.md
zhenyatnk Dec 25, 2021
c41b53e
Update README.md
zhenyatnk Dec 25, 2021
cb7f667
Merge branch 'pekabon:master' into master
zhenyatnk Dec 26, 2021
0eba3f9
Merge branch 'pekabon:master' into master
zhenyatnk Dec 28, 2021
eb8935f
Merge branch 'pekabon:master' into master
zhenyatnk Dec 28, 2021
4e9807f
Merge branch 'pekabon:master' into master
zhenyatnk Jan 14, 2022
f1474d0
Merge branch 'pekabon:master' into master
zhenyatnk Apr 1, 2022
16b4fa8
Merge branch 'pekabon:master' into master
zhenyatnk Apr 12, 2022
1c94909
Merge branch 'pekabon:master' into master
zhenyatnk Jun 3, 2022
ba9b272
Merge branch 'pekabon:master' into master
zhenyatnk Sep 26, 2022
f540127
Merge branch 'pekabon:master' into master
zhenyatnk Nov 20, 2022
45810ca
Merge branch 'pekabon:master' into master
zhenyatnk Mar 3, 2023
6e85fe6
Merge branch 'pekabon:master' into master
zhenyatnk Sep 10, 2026
25b8ca7
Add saved searches and copy-as-displayed (#7)
zhenyatnk Sep 10, 2026
2db222e
Update README.md
zhenyatnk Sep 11, 2026
414604c
Update README.md
zhenyatnk Sep 11, 2026
b285c8e
Config opencode and upgrade deps (#8)
zhenyatnk Sep 11, 2026
e871f2e
Add time filter, timeline, filter chips, theme switcher and search na…
zhenyatnk Sep 11, 2026
a5c223a
Migrate UI to WPF-UI, fix dark theme and share JSON folding across vi…
zhenyatnk Sep 11, 2026
67619a3
update readme
zhenyatnk Sep 11, 2026
bd04e24
Optimizations (#12)
zhenyatnk Sep 15, 2026
7346d85
Rename project to LogGrokX + Add installer and release workflow, inje…
zhenyatnk Sep 15, 2026
0b37ead
Fix smoke test PowerShell variable interpolation
zhenyatnk Sep 15, 2026
241de09
Fix installer registry flags
zhenyatnk Sep 15, 2026
a425b04
Drop .txt file association from installer
zhenyatnk Sep 15, 2026
d6b5620
Add text zoom controls, center navigation targets, drop exit button
zhenyatnk Sep 17, 2026
79cde5e
Add BenchmarkDotNet project and CI benchmark workflows
zhenyatnk Sep 17, 2026
20c9ea3
Group consecutive log lines by thread
zhenyatnk Sep 17, 2026
9e17f32
Add application icon
zhenyatnk Sep 17, 2026
eb3431f
Add support window with version and links
zhenyatnk Sep 17, 2026
0ef7ca7
Merge pull request #14 from zhenyatnk/scale
zhenyatnk Sep 17, 2026
6c4e838
Document thread grouping and support window
zhenyatnk Sep 17, 2026
5858f46
Fix benchmark CI runs and document release workflow
zhenyatnk Sep 17, 2026
a522080
Show latest release version badge in README
zhenyatnk Sep 17, 2026
e9f974e
Add LogGrokX.Data unit tests and fix bugs they uncovered
zhenyatnk Sep 19, 2026
92e5953
Merge pull request #15 from zhenyatnk/utests
zhenyatnk Sep 19, 2026
0a8e2b5
Add settings window for appsettings.yaml
zhenyatnk Sep 19, 2026
b70a58e
Merge pull request #16 from zhenyatnk/ui_settings
zhenyatnk Sep 19, 2026
0c4bb67
Fix line centering for multi-line entries
zhenyatnk Sep 19, 2026
872dba3
Disable Mica backdrop to fix blank auto-hide flyout
zhenyatnk Sep 19, 2026
3650098
Document disabled Mica backdrop in README and AGENTS.md
zhenyatnk Sep 19, 2026
4207410
Merge pull request #17 from zhenyatnk/fix_center
zhenyatnk Sep 19, 2026
ad66412
Add merged files view for multiple log files (#18)
zhenyatnk Sep 20, 2026
1fd085e
Add feature guide with Full HD demo screenshots (#19)
zhenyatnk Sep 20, 2026
3b8ac21
fix: align mark toggle point to the top of a line (#24)
Dolaxom Sep 25, 2026
4f812ec
Timeline: показывать время при наведении (#25)
zhenyatnk Sep 26, 2026
a762026
Горизонтальное скроллирование вторым колесом мыши (#26)
zhenyatnk Sep 26, 2026
b1067ea
Автообновление: проверка новых версий, WPF-диалог и silent-установка …
zhenyatnk Sep 26, 2026
fc2d6c0
Проверка обновлений: аутентификация на прокси учётными данными Window…
zhenyatnk Sep 26, 2026
39c76d6
Перенос строки в сообщении относится к колонке Message (#31) (#32)
zhenyatnk Sep 27, 2026
d0f4815
Проверка обновлений при первом запуске в новом дне (#36) (#37)
zhenyatnk Sep 27, 2026
744d5ce
Копирование строк без обрезки многоточием (#33) (#34)
zhenyatnk Sep 28, 2026
b097650
Ускорение раскрытия JSON-блоков (#38) (#39)
zhenyatnk Sep 28, 2026
8c89e17
Проверка обновлений без исчерпания лимита GitHub API (#40) (#41)
zhenyatnk Sep 28, 2026
334b6e5
Do not copy .pdb into self-contained publication (#42)
fanglores Sep 29, 2026
9a0ae46
Make disposable (#44)
pkaptur Sep 30, 2026
f094fdb
Множественное выделение строк в результатах поиска (#43) (#46)
zhenyatnk Sep 30, 2026
70053cb
Повысить надёжность чтения индексов и уменьшить лишнюю работу при заг…
pkaptur Oct 1, 2026
c0a0317
Подгонять ширину столбца Message по содержимому при загрузке (#47)
zhenyatnk Oct 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
65 changes: 65 additions & 0 deletions .github/workflows/benchmarks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: Benchmarks

on:
schedule:
- cron: '0 3 * * *'
workflow_dispatch:

concurrency:
group: benchmarks
cancel-in-progress: false

permissions:
contents: read
actions: read

jobs:

benchmarks:

runs-on: windows-latest

steps:
- name: Checkout
uses: actions/checkout@v4

# Skip the scheduled run when HEAD is unchanged since the last successful benchmark run
- name: Detect changes since last benchmark run
id: changes
if: github.event_name == 'schedule'
uses: actions/github-script@v7
with:
script: |
const runs = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: 'benchmarks.yml',
status: 'success',
per_page: 1,
});
const last = runs.data.workflow_runs[0];
const changed = !last || last.head_sha !== context.sha;
core.info(`last=${last?.head_sha ?? 'none'} current=${context.sha} changed=${changed}`);
core.setOutput('changed', changed);

- name: Install .NET Core
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.changed == 'true'
uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x

- name: Run benchmarks
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.changed == 'true'
run: dotnet run --project LogGrokX.Benchmarks -c Release -- --filter "*" --exporters json html

- name: Upload results
if: github.event_name == 'workflow_dispatch' || steps.changes.outputs.changed == 'true'
uses: actions/upload-artifact@v4
with:
name: benchmark-results-${{ github.sha }}
path: BenchmarkDotNet.Artifacts/
if-no-files-found: error

- name: No changes
if: github.event_name == 'schedule' && steps.changes.outputs.changed != 'true'
run: echo "No changes since the last successful benchmark run; skipping."
7 changes: 3 additions & 4 deletions .github/workflows/build_upload.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@ jobs:
steps:
# Install the .NET Core workload
- name: Install .NET Core
uses: actions/setup-dotnet@v1
uses: actions/setup-dotnet@v4
with:
dotnet-version: 7.0.x
include-prerelease: true
dotnet-version: 10.0.x

# Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild
- name: Setup MSBuild.exe
Expand All @@ -40,5 +39,5 @@ jobs:
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: LogGrokCore-build-${{ github.run_number }}
name: LogGrokX-build-${{ github.run_number }}
path: ${{ github.workspace }}/bin/Release/**/*
270 changes: 270 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,270 @@
name: Release

on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
version:
description: 'Version tag (e.g. 1.0.0)'
required: true
type: string

permissions:
contents: write

concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false

jobs:
release:
runs-on: windows-latest
timeout-minutes: 60

env:
VERSION: ${{ github.event.inputs.version || github.ref_name }}

steps:
- name: Checkout
uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Install .NET
uses: actions/setup-dotnet@v6
with:
dotnet-version: 10.0.x
cache: true
cache-dependency-path: '**/*.csproj'

- name: Determine version
id: version
shell: pwsh
run: |
$ver = "${{ env.VERSION }}" -replace '^[vV]', ''
if (-not $ver) { $ver = "1.0.0" }
if ($ver -notmatch '^\d+\.\d+\.\d+([-+][0-9A-Za-z.-]+)?$') {
throw "Invalid version '$ver'. Expected SemVer, e.g. 1.2.3 or 1.2.3-beta.1"
}
$core = $ver -replace '\+.*$', ''
$isPrerelease = $core -match '-'
$tag = "${{ env.VERSION }}"
if ($tag -notmatch '^[vV]') { $tag = "v$tag" }
echo "RELEASE_VERSION=$ver" >> $env:GITHUB_OUTPUT
echo "RELEASE_TAG=$tag" >> $env:GITHUB_OUTPUT
echo "IS_PRERELEASE=$($isPrerelease.ToString().ToLower())" >> $env:GITHUB_OUTPUT
echo "Version: $ver (tag: $tag)"

- name: Restore
run: dotnet restore

- name: Run tests
run: dotnet test --configuration Release --no-restore --nologo --verbosity normal

- name: Publish self-contained (x64)
run: |
dotnet publish LogGrokX/LogGrokX.csproj `
--configuration Release `
--runtime win-x64 `
--self-contained true `
-p:PublishSingleFile=true `
-p:CopyOutputSymbolsToPublishDirectory=false `
-p:IncludeNativeLibrariesForSelfExtract=true `
-p:EnableCompressionInSingleFile=true `
-p:Version=${{ steps.version.outputs.RELEASE_VERSION }} `
--nologo `
--output ./publish/win-x64-selfcontained

- name: Publish framework-dependent (x64)
run: |
dotnet publish LogGrokX/LogGrokX.csproj `
--configuration Release `
--runtime win-x64 `
--self-contained false `
-p:Version=${{ steps.version.outputs.RELEASE_VERSION }} `
--nologo `
--output ./publish/win-x64-fdd

- name: Publish self-contained (x86)
run: |
dotnet publish LogGrokX/LogGrokX.csproj `
--configuration Release `
--runtime win-x86 `
--self-contained true `
-p:PublishSingleFile=true `
-p:CopyOutputSymbolsToPublishDirectory=false `
-p:IncludeNativeLibrariesForSelfExtract=true `
-p:EnableCompressionInSingleFile=true `
-p:Version=${{ steps.version.outputs.RELEASE_VERSION }} `
--nologo `
--output ./publish/win-x86-selfcontained

- name: Publish framework-dependent (x86)
run: |
dotnet publish LogGrokX/LogGrokX.csproj `
--configuration Release `
--runtime win-x86 `
--self-contained false `
-p:Version=${{ steps.version.outputs.RELEASE_VERSION }} `
--nologo `
--output ./publish/win-x86-fdd

- name: Smoke test (version)
shell: pwsh
run: |
$expected = "${{ steps.version.outputs.RELEASE_VERSION }}"
$expectedNumeric = $expected -replace '^(\d+\.\d+\.\d+).*$', '$1'
foreach ($arch in @("x64", "x86")) {
$exe = "./publish/win-$arch-selfcontained/LogGrokX.exe"
if (-not (Test-Path $exe)) { throw "Executable not found: $exe" }

$info = (Get-Item $exe).VersionInfo
if ($info.ProductVersion -ne $expected) {
throw "ProductVersion mismatch for ${arch}: expected '$expected', got '$($info.ProductVersion)'"
}
if ($info.FileVersion -ne $expectedNumeric) {
throw "FileVersion mismatch for ${arch}: expected '$expectedNumeric', got '$($info.FileVersion)'"
}

$stdout = New-TemporaryFile
$process = Start-Process -FilePath $exe -ArgumentList "--version" -Wait -PassThru -RedirectStandardOutput $stdout
$reported = (Get-Content $stdout -Raw).Trim()
Remove-Item $stdout -Force
if ($process.ExitCode -ne 0) { throw "Smoke test exit code for ${arch}: $($process.ExitCode)" }
if ($reported -ne $expected) {
throw "Reported version mismatch for ${arch}: expected '$expected', got '$reported'"
}
Write-Host "Smoke test passed for ${arch}: $reported"
}

- name: Install Inno Setup
shell: pwsh
run: |
choco install innosetup --version=6.7.1 -y --no-progress
echo "C:\Program Files (x86)\Inno Setup 6" >> $env:GITHUB_PATH

- name: Build installers
shell: pwsh
run: |
$version = "${{ steps.version.outputs.RELEASE_VERSION }}"
$iscc = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"

# Bundle the self-contained builds so the installers do not require a .NET runtime.
New-Item -ItemType Directory -Force -Path ./installer/publish-x64 | Out-Null
New-Item -ItemType Directory -Force -Path ./installer/publish-x86 | Out-Null
Copy-Item -Path ./publish/win-x64-selfcontained/* -Destination ./installer/publish-x64/ -Recurse
Copy-Item -Path ./publish/win-x86-selfcontained/* -Destination ./installer/publish-x86/ -Recurse

& $iscc `
/DMyAppVersion="$version" `
/DMyArchSuffix=x64 `
/DMyArchitecturesAllowed=x64compatible `
/DMySourceDir=publish-x64 `
/O"./artifacts" `
"./installer/LogGrokX.iss"

& $iscc `
/DMyAppVersion="$version" `
/DMyArchSuffix=x86 `
/DMyArchitecturesAllowed=x86compatible `
"/DMyArchitecturesInstallIn64BitModeLine=;" `
"/DMyAppIdLine=AppId={{E9F2AF62-B22A-458C-88CF-1078F8A6CB65}-x86" `
/DMySourceDir=publish-x86 `
/O"./artifacts" `
"./installer/LogGrokX.iss"

- name: Sign installers
shell: pwsh
env:
CODESIGN_CERTIFICATE: ${{ secrets.CODESIGN_CERTIFICATE }}
CODESIGN_CERTIFICATE_PASSWORD: ${{ secrets.CODESIGN_CERTIFICATE_PASSWORD }}
run: |
if (-not $env:CODESIGN_CERTIFICATE) {
Write-Host "CODESIGN_CERTIFICATE is not configured; skipping code signing."
exit 0
}
$certPath = Join-Path $env:RUNNER_TEMP "codesign.pfx"
[IO.File]::WriteAllBytes($certPath, [Convert]::FromBase64String($env:CODESIGN_CERTIFICATE))
$signtool = Get-ChildItem "${env:ProgramFiles(x86)}\Windows Kits\10\bin" -Recurse -Filter signtool.exe -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -match '\\x64\\' } |
Sort-Object FullName -Descending | Select-Object -First 1
if (-not $signtool) { throw "signtool.exe was not found." }
$files = Get-ChildItem ./artifacts -File -Filter "*-setup.exe"
foreach ($file in $files) {
& $signtool.FullName sign /fd SHA256 /td SHA256 /tr "http://timestamp.digicert.com" /f $certPath /p $env:CODESIGN_CERTIFICATE_PASSWORD $file.FullName
if ($LASTEXITCODE -ne 0) { throw "Signing failed: $($file.FullName)" }
}
Remove-Item $certPath -Force

- name: Create ZIP archives
shell: pwsh
run: |
$version = "${{ steps.version.outputs.RELEASE_VERSION }}"
Compress-Archive -Path ./publish/win-x64-selfcontained/* -DestinationPath "./artifacts/LogGrokX-$version-win-x64-selfcontained.zip"
Compress-Archive -Path ./publish/win-x64-fdd/* -DestinationPath "./artifacts/LogGrokX-$version-win-x64-portable.zip"
Compress-Archive -Path ./publish/win-x86-selfcontained/* -DestinationPath "./artifacts/LogGrokX-$version-win-x86-selfcontained.zip"
Compress-Archive -Path ./publish/win-x86-fdd/* -DestinationPath "./artifacts/LogGrokX-$version-win-x86-portable.zip"

- name: Generate checksums
shell: pwsh
run: |
Get-ChildItem ./artifacts -File | Sort-Object Name | ForEach-Object {
$hash = (Get-FileHash -Algorithm SHA256 -Path $_.FullName).Hash
"$hash $($_.Name)"
} | Set-Content -Path ./artifacts/SHA256SUMS.txt -Encoding ascii
Get-Content ./artifacts/SHA256SUMS.txt

- name: Upload artifacts
uses: actions/upload-artifact@v7
with:
name: LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}
path: ./artifacts/*
retention-days: 14

- name: Create GitHub Release
uses: softprops/action-gh-release@v3
with:
tag_name: ${{ steps.version.outputs.RELEASE_TAG }}
name: LogGrokX ${{ steps.version.outputs.RELEASE_VERSION }}
draft: false
prerelease: ${{ steps.version.outputs.IS_PRERELEASE == 'true' }}
generate_release_notes: true
files: |
./artifacts/LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-x64-setup.exe
./artifacts/LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-x86-setup.exe
./artifacts/LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-win-x64-selfcontained.zip
./artifacts/LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-win-x64-portable.zip
./artifacts/LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-win-x86-selfcontained.zip
./artifacts/LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-win-x86-portable.zip
./artifacts/SHA256SUMS.txt
body: |
## Installation

### Installer (Recommended)
- 64-bit Windows: `LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-x64-setup.exe`
- 32-bit Windows: `LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-x86-setup.exe`

Run the installer matching your Windows version.
- Self-contained: no .NET runtime required
- Creates Start Menu shortcut
- Optional desktop shortcut
- Optional .log/.txt file associations
- Standard uninstaller via Add/Remove Programs

### Portable (Self-contained)
No .NET runtime required — extract and run.
- `LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-win-x64-selfcontained.zip` (64-bit)
- `LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-win-x86-selfcontained.zip` (32-bit)

### Portable (Framework-dependent)
Requires [.NET 10 runtime](https://dotnet.microsoft.com/download/dotnet/10.0) — extract and run.
- `LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-win-x64-portable.zip` (64-bit)
- `LogGrokX-${{ steps.version.outputs.RELEASE_VERSION }}-win-x86-portable.zip` (32-bit)

## Verification
SHA-256 checksums for all assets are provided in `SHA256SUMS.txt`.

## Requirements
- Windows 10 or later
Loading
Loading