Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
d5ccff3
initial commit
Hirogen Nov 11, 2025
00bdf86
Merge branch 'Development' into plugin-repository-optimizations
Hirogen Nov 13, 2025
23e7f2d
merge error
Nov 14, 2025
52d49d8
review comments
Nov 14, 2025
987ea8d
review comments
Hirogen Nov 14, 2025
2142ef9
hashes for plugins
Hirogen Nov 17, 2025
ffdf6c9
update plugins
Hirogen Nov 18, 2025
07de0b0
a few more updates
Hirogen Nov 18, 2025
1c2e911
unit test fix
Hirogen Nov 18, 2025
65efe7d
update plugins
Hirogen Nov 18, 2025
c09a552
update readme
Hirogen Nov 18, 2025
8add42d
unittests
Nov 19, 2025
1a25392
even more tests
Nov 19, 2025
3ede763
small fix
Nov 19, 2025
2c3dc97
Merge branch 'plugin-repository-optimizations' of https://github.com/…
Hirogen Nov 19, 2025
271c8e2
update more changes
Hirogen Nov 19, 2025
8d8c565
update yml
Hirogen Nov 19, 2025
1a354e2
plugin hashes
Hirogen Nov 19, 2025
e810e89
remove agen files
Hirogen Nov 19, 2025
9930fef
remove rider folders
Hirogen Nov 19, 2025
204cb5e
remove agent files
Hirogen Nov 19, 2025
00353f2
remove no longer need script
Hirogen Nov 19, 2025
92963f7
another file to remove
Hirogen Nov 19, 2025
34951a9
code quality fixes
Hirogen Nov 19, 2025
0d1c1f1
github action -.-
Hirogen Nov 19, 2025
85c96c5
chore: update plugin hashes [skip ci]
github-actions[bot] Nov 19, 2025
9ba5504
path.join
Hirogen Nov 19, 2025
a16e7f3
Merge branch 'plugin-repository-optimizations' of https://github.com/…
Hirogen Nov 19, 2025
1e7d9ab
chore: update plugin hashes [skip ci]
github-actions[bot] Nov 19, 2025
caa7d9c
unit tests fix
Hirogen Nov 19, 2025
27f5800
Merge branch 'plugin-repository-optimizations' of https://github.com/…
Hirogen Nov 19, 2025
157820a
chore: update plugin hashes [skip ci]
github-actions[bot] Nov 19, 2025
2e498ec
unit test fixes and code quality
Nov 20, 2025
e78a54f
chore: update plugin hashes [skip ci]
github-actions[bot] Nov 20, 2025
fda25ae
review fixes
Nov 20, 2025
c15919c
Merge branch 'plugin-repository-optimizations' of https://github.com/…
Nov 20, 2025
12f1f11
chore: update plugin hashes [skip ci]
github-actions[bot] Nov 20, 2025
4aac8c8
small things
Nov 20, 2025
588daff
Merge branch 'plugin-repository-optimizations' of https://github.com/…
Nov 20, 2025
2ba52b8
chore: update plugin hashes [skip ci]
github-actions[bot] Nov 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 30 additions & 6 deletions .github/workflows/build_dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,32 @@ on:

env:
Solution: src/LogExpert.sln
Test_Project: src/LogExpert.Tests/LogExpert.Tests.csproj
Test_Project_LogExpert: src/LogExpert.Tests/LogExpert.Tests.csproj
Test_Project_ColumnizerLib: src/ColumnizerLib.UnitTests/ColumnizerLib.UnitTests.csproj
Test_Project_PluginRegistry: src/PluginRegistry.Tests/PluginRegistry.Tests.csproj
Test_Project_RegexColumnizer: src/RegexColumnizer.UnitTests/RegexColumnizer.UnitTests.csproj

jobs:
build:
permissions:
contents: read

permissions:
contents: write # Changed to 'write' for committing
pull-requests: write # Added for PR operations

strategy:
fail-fast: false
matrix:
configuration: [Debug, Release]

runs-on: windows-latest
name: Build Application - ${{ matrix.configuration }}

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
ref: ${{ github.head_ref }} # Checkout the PR branch

- name: Install .NET Core
uses: actions/setup-dotnet@v4
Expand All @@ -40,6 +46,24 @@ jobs:
run: |
dotnet build ${{ env.Solution }} --nologo -v quiet -c ${{ matrix.configuration }}

- name: Generate Plugin Hashes
if: matrix.configuration == 'Release'
run: dotnet run --project src/PluginHashGenerator.Tool/PluginHashGenerator.Tool.csproj -- "bin/Release/" "src/PluginRegistry/PluginHashGenerator.Generated.cs" Release

- name: Commit Updated Hashes
if: matrix.configuration == 'Release'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add src/PluginRegistry/PluginHashGenerator.Generated.cs
git diff --staged --quiet
if ($LASTEXITCODE -ne 0) {
git commit -m "chore: update plugin hashes [skip ci]"
git push
} else {
Write-Host "No changes to commit"
}

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ This is a clone from (no longer exists) <https://logexpert.codeplex.com/>

## Overview

LogExpert is a Windows tail program (a GUI replacement for the Unix tail command).
LogExpert is a Windows feature rich tail program (a GUI replacement for the Unix tail command) with support for plugins, highlighting, filtering, bookmarking, columnizing and more.

Summary of (most) features:

Expand Down
7 changes: 4 additions & 3 deletions build/_build.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@
<ItemGroup>
<PackageReference Include="chocolatey" Version="2.5.1" />
<PackageReference Include="GitVersion.Core" Version="6.5.0" />
<PackageReference Include="Microsoft.Build" Version="17.14.28" />
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="17.14.28" />
<PackageReference Include="NuGet.CommandLine" Version="6.14.0">
<PackageReference Include="Microsoft.Build" Version="18.0.2" />
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="18.0.2" />
<PackageReference Include="NuGet.CommandLine" Version="7.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="NuGet.Versioning" Version="7.0.0" />
<PackageReference Include="Nuke.Common" Version="9.0.4" />
<PackageReference Include="Nuke.GitHub" Version="7.0.0" />
<PackageReference Include="NUnit.ConsoleRunner" Version="3.20.2" />
Expand Down
24 changes: 12 additions & 12 deletions src/AutoColumnizer/AutoColumnizer.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using LogExpert;

using System;

using LogExpert;

namespace AutoColumnizer;

public class AutoColumnizer : ILogLineColumnizer
Expand All @@ -10,53 +10,53 @@ public class AutoColumnizer : ILogLineColumnizer

public string Text => GetName();

public bool IsTimeshiftImplemented()
public bool IsTimeshiftImplemented ()
{
return true;
}

public string GetName()
public string GetName ()
{
return "Auto Columnizer";
}

public string GetDescription()
public string GetDescription ()
{
return "Automatically find the right columnizer for any file";
}


public int GetColumnCount()
public int GetColumnCount ()
{
throw new NotImplementedException();
}

public string[] GetColumnNames()
public string[] GetColumnNames ()
{
throw new NotImplementedException();
}

public IColumnizedLogLine SplitLine(ILogLineColumnizerCallback callback, ILogLine line)
public IColumnizedLogLine SplitLine (ILogLineColumnizerCallback callback, ILogLine line)
{
throw new NotImplementedException();
}

public void SetTimeOffset(int msecOffset)
public void SetTimeOffset (int msecOffset)
{
throw new NotImplementedException();
}

public int GetTimeOffset()
public int GetTimeOffset ()
{
throw new NotImplementedException();
}

public DateTime GetTimestamp(ILogLineColumnizerCallback callback, ILogLine line)
public DateTime GetTimestamp (ILogLineColumnizerCallback callback, ILogLine line)
{
throw new NotImplementedException();
}

public void PushValue(ILogLineColumnizerCallback callback, int column, string value, string oldValue)
public void PushValue (ILogLineColumnizerCallback callback, int column, string value, string oldValue)
{
}

Expand Down
6 changes: 6 additions & 0 deletions src/AutoColumnizer/AutoColumnizer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,10 @@
<ProjectReference Include="..\ColumnizerLib\ColumnizerLib.csproj" />
</ItemGroup>

<ItemGroup>
<None Update="AutoColumnizer.manifest.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
19 changes: 19 additions & 0 deletions src/AutoColumnizer/AutoColumnizer.manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "AutoColumnizer",
"version": "1.0.0",
"author": "LogExpert Team",
"description": "Automatically detects and applies the appropriate columnizer for any log file format",
"apiVersion": "1.0",
"requires": {
"logExpert": ">=1.20.0",
"dotnet": "10.0"
},
"permissions": [
"filesystem:read",
"config:read"
],
"dependencies": {},
"main": "AutoColumnizer.dll",
"url": "https://github.com/LogExperts/LogExpert",
"license": "MIT"
}
4 changes: 3 additions & 1 deletion src/ColumnizerLib/Column.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;

namespace LogExpert;
using LogExpert;

namespace ColumnizerLib;

public class Column : IColumn
{
Expand Down
19 changes: 10 additions & 9 deletions src/ColumnizerLib/ILogExpertLogger.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;

namespace LogExpert;

/// <summary>
Expand All @@ -17,29 +12,35 @@ public interface ILogExpertLogger
/// The logger in LogExpert will automatically add the class and the method name of the caller.
/// </summary>
/// <param name="msg">A message to be logged.</param>
void Info(string msg);
void Info (string msg);

/// <summary>
/// Writes an informational message using the specified format provider.
/// </summary>
/// <param name="formatProvider">An object that supplies culture-specific formatting information for the message. Cannot be null.</param>
/// <param name="msg">The informational message to write. Cannot be null.</param>
void Info (IFormatProvider formatProvider, string msg);

/// <summary>
/// Logs a message on DEBUG level to LogExpert#s log file. The logfile is only active in debug builds.
/// The logger in LogExpert will automatically add the class and the method name of the caller.
/// </summary>
/// <param name="msg">A message to be logged.</param>
void Debug(string msg);
void Debug (string msg);

/// <summary>
/// Logs a message on WARN level to LogExpert#s log file. The logfile is only active in debug builds.
/// The logger in LogExpert will automatically add the class and the method name of the caller.
/// </summary>
/// <param name="msg">A message to be logged.</param>
void LogWarn(string msg);
void LogWarn (string msg);

/// <summary>
/// Logs a message on ERROR level to LogExpert#s log file. The logfile is only active in debug builds.
/// The logger in LogExpert will automatically add the class and the method name of the caller.
/// </summary>
/// <param name="msg">A message to be logged.</param>
void LogError(string msg);
void LogError (string msg);

#endregion
}
28 changes: 28 additions & 0 deletions src/ColumnizerLib/IPluginContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
namespace LogExpert;

/// <summary>
/// Provides context information to plugins during initialization.
/// </summary>
public interface IPluginContext
{
/// <summary>
/// Logger for the plugin to use for diagnostic output.
/// </summary>
ILogExpertLogger Logger { get; }

/// <summary>
/// Directory where the plugin assembly is located.
/// </summary>
string PluginDirectory { get; }

/// <summary>
/// Version of the host application (LogExpert).
/// </summary>
Version HostVersion { get; }

/// <summary>
/// Directory where the plugin can store configuration files.
/// Typically %APPDATA%\LogExpert\Plugins\{PluginName}\
/// </summary>
string ConfigurationDirectory { get; }
}
27 changes: 27 additions & 0 deletions src/ColumnizerLib/IPluginLifecycle.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace LogExpert;

/// <summary>
/// Defines lifecycle events for plugins.
/// Plugins can optionally implement this interface to receive lifecycle notifications.
/// </summary>
public interface IPluginLifecycle
{
/// <summary>
/// Called when the plugin is first loaded.
/// Use this to initialize resources, load configuration, etc.
/// </summary>
/// <param name="context">Context providing information about the host environment</param>
void Initialize (IPluginContext context);

/// <summary>
/// Called when the application is shutting down.
/// Use this to cleanup resources, save state, etc.
/// </summary>
void Shutdown ();

/// <summary>
/// Called when the plugin should reload its configuration.
/// Use this to refresh settings without restarting the application.
/// </summary>
void Reload ();
}
9 changes: 3 additions & 6 deletions src/CsvColumnizer/CsvColumnizer.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Versioning;
using System.Windows.Forms;

using ColumnizerLib;

using CsvHelper;

Expand Down Expand Up @@ -216,7 +213,7 @@ public void Configure (ILogLineColumnizerCallback callback, string configDir)

public void LoadConfig (string configDir)
{
var configPath = Path.Combine(configDir, CONFIGFILENAME);
var configPath = Path.Join(configDir, CONFIGFILENAME);

if (!File.Exists(configPath))
{
Expand Down
6 changes: 6 additions & 0 deletions src/CsvColumnizer/CsvColumnizer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,10 @@
</Compile>
</ItemGroup>

<ItemGroup>
<None Update="CsvColumnizer.manifest.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
21 changes: 21 additions & 0 deletions src/CsvColumnizer/CsvColumnizer.manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "CsvColumnizer",
"version": "1.0.0",
"author": "LogExpert Team",
"description": "Parses CSV (Comma-Separated Values) log files into columns with configurable delimiters and quote characters",
"apiVersion": "1.0",
"requires": {
"logExpert": ">=1.10.0",
"dotnet": ">=8.0"
},
"permissions": [
"filesystem:read",
"config:read"
],
"dependencies": {
"CsvHelper": "30.0.0"
},
"main": "CsvColumnizer.dll",
"url": "https://github.com/LogExperts/LogExpert",
"license": "MIT"
}
21 changes: 21 additions & 0 deletions src/DefaultPlugins/DefaultPlugins.manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "DefaultPlugins",
"version": "1.0.0",
"author": "LogExpert Team",
"description": "Collection of default plugins including Search, Highlight, and Action keyword handlers",
"apiVersion": "1.0",
"requires": {
"logExpert": ">=1.10.0",
"dotnet": ">=8.0"
},
"permissions": [
"filesystem:read",
"filesystem:write",
"config:read",
"network:connect"
],
"dependencies": {},
"main": "DefaultPlugins.dll",
"url": "https://github.com/LogExperts/LogExpert",
"license": "MIT"
}
1 change: 1 addition & 0 deletions src/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="NLog" Version="6.0.6" />
<PackageVersion Include="NuGet.CommandLine" Version="6.14.0" />
<PackageVersion Include="NuGet.Versioning" Version="7.0.0" />
<PackageVersion Include="Nuke.Common" Version="9.0.4" />
<PackageVersion Include="Nuke.GitHub" Version="7.0.0" />
<PackageVersion Include="NUnit" Version="4.4.0" />
Expand Down
Loading
Loading