# EasyElasticLogger **Repository Path**: lovelydouble/easy-elastic-logger ## Basic Information - **Project Name**: EasyElasticLogger - **Description**: 一个轻量级、易于使用的.NET日志库,专门用于将结构化日志写入Elasticsearch。支持多种.NET平台,包括.NET Framework和.NET Core/.NET 5+ - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-25 - **Last Updated**: 2025-12-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EasyElasticLogger > 🚀🚀🚀 A lightweight, easy-to-use .NET logging library specifically designed for writing structured logs to Elasticsearch. Supports multiple .NET platforms, including .NET Framework and .NET Core/.NET 5+
**Simple & Easy to Use | Feature Rich | Production Ready**
## Features | Feature Category | Description | |----------|----------| | ✅ **Multi-Platform Support** | Compatible with .NET Framework 4.7.2+, .NET Framework 4.8, .NET Standard 2.0, .NET Standard 2.1 | | ✅ **Structured Logging** | Write logs to Elasticsearch in structured format for easy querying and analysis | | ✅ **High Performance** | Built-in log buffering mechanism with batch sending for improved performance | | ✅ **Flexible Configuration** | Supports multiple configuration methods including code configuration and JSON file configuration | | ✅ **Rich Log Levels** | Supports Debug, Info, Warn, Error, Fatal five log levels | | ✅ **Secure Connection** | Supports HTTPS and basic authentication | | ✅ **Index Management** | Supports fixed index and date-based rolling index strategies | --- ## Use Cases ### Systems requiring centralized ELK logging for unified analysis - Systems requiring real-time log monitoring and alerts - Scenarios requiring log visualization and analysis with Kibana ### .NET Framework-based applications - **WinForm** desktop applications (.NET Framework 4.7.2/4.8) - **WPF** desktop applications (.NET Framework 4.7.2/4.8) - **WebForm** traditional web applications (.NET Framework 4.7.2/4.8) - **Windows Services** and background task programs (.NET Framework 4.7.2/4.8) - **Console applications** logging requirements (.NET Framework 4.7.2/4.8) ### .NET Core/.NET 5+ based applications - ASP.NET Core Web API applications - .NET Core console applications - Cross-platform applications (Windows/Linux/macOS) ### Diagnostic and operational logging requirements in special development environments - AutoCAD plugin logging (based on .NET Framework) - Revit and other BIM software plugin development (based on .NET Framework) - Industrial software plugin diagnostics and operational monitoring --- ## Compatibility Information | Log Library Version | Compatible with Elasticsearch 8.x | Compatible with Elasticsearch 9.x | Compatible with Elasticsearch 10.x | |---------------------|-----------------------------------|-----------------------------------|------------------------------------| | 9.x | ❌ no | ✅ yes | ✅ yes | | 8.x | ✅ yes | ✅ yes | ❌ no | --- ## Installation Install via NuGet Package Manager: ```bash Install-Package EasyElasticLogger ``` Or via .NET CLI: ```bash dotnet add package EasyElasticLogger ``` --- ## 🚀🚀🚀 Quick Start ### 1. Basic Usage ```csharp using EasyElasticLogger.ES.Logging; // Initialize during application startup (in Program.cs or Startup.cs) // Create configuration var config = new LoggerConfiguration { Enabled = true, IndexPrefix = "demo-app-log", ApplicationName = "DemoApplication", Cluster = new ClusterConfiguration { Nodes = new List { "http://localhost:9200" } // Note: In actual usage, you need to provide valid Elasticsearch connection information } }; // Initialize static logger ElasticLogger.Initialize(config); // Use static methods directly anywhere you need to log // Synchronous logging ElasticLogger.Info("This is an info log"); ElasticLogger.Warn("This is a warning log"); ElasticLogger.Error("This is an error log", new Exception("Test exception")); // Asynchronous logging await ElasticLogger.InfoAsync("This is an async info log"); await ElasticLogger.ErrorAsync("This is an async error log", new Exception("Test exception")); ``` --- ## ⚙⚙⚙ Configuration Methods Configuration loading priority: **Direct parameter > JSON configuration** ### 1. Direct Parameter Configuration ```csharp var config = new LoggerConfiguration { Enabled = true, IndexPrefix = "myapp-log", IndexStrategy = IndexStrategy.DailyRolling, ApplicationName = "MyApplication", BatchSize = 100, TimeoutMs = 10000, Cluster = new ClusterConfiguration { Nodes = new List { "http://localhost:9200" }, Username = "elastic", Password = "password", UseSsl = false, SkipSslVerification = false, ConnectionTimeoutMs = 5000, MaxRetries = 2 } }; ElasticLogger.Initialize(config); ``` ### 2. JSON Configuration File (Supports environment-specific configuration) ```csharp // Automatically looks for logger-config.Production.json or logger-config.json ElasticLogger.InitializeFromJson("logger-config.json", "Production"); ``` #### JSON Configuration File Examples **Default Configuration (logger-config.json)** ```json { "Enabled": true, "IndexPrefix": "myapp-log", "IndexStrategy": "DailyRolling", "ApplicationName": "MyApplication", "BatchSize": 100, "TimeoutMs": 10000, "Cluster": { "Nodes": ["http://localhost:9200"], "Username": "elastic", "Password": "password", "UseSsl": false, "SkipSslVerification": false, "ConnectionTimeoutMs": 5000, "MaxRetries": 2 } } ``` **Production Environment Configuration (logger-config.Production.json)** ```json { "Enabled": true, "IndexPrefix": "myapp-log-prod", "IndexStrategy": "DailyRolling", "ApplicationName": "MyProductionApp", "BatchSize": 100, "TimeoutMs": 10000, "Cluster": { "Nodes": ["http://prod-es1:9200", "http://prod-es2:9200", "http://prod-es3:9200"], "Username": "elastic", "Password": "prod_password", "UseSsl": true, "SkipSslVerification": false, "ConnectionTimeoutMs": 10000, "MaxRetries": 3 } } ``` **Usage Examples** ```csharp // Use default JSON configuration file ElasticLogger.InitializeFromJson("logger-config.json"); // Use environment-specific JSON configuration file ElasticLogger.InitializeFromJson("logger-config.json", "Production"); ``` ### 3. Custom Configuration File Path ```csharp // Initialize with custom configuration file path and environment ElasticLogger.InitializeFromJson(@"C:\MyApp\config\logger-config.json", "Production"); ``` --- ## Logging Examples ### Synchronous Logging ```csharp // Debug level log ElasticLogger.Debug("Debug information", "MyClass.Method"); // Info level log ElasticLogger.Info("General information", "MyClass.Method"); // Warn level log ElasticLogger.Warn("Warning message", "MyClass.Method"); // Error level log ElasticLogger.Error("Error message", new Exception("Exception details"), "MyClass.Method"); // Fatal level log ElasticLogger.Fatal("Critical error", new Exception("Exception details"), "MyClass.Method"); // Log with additional data var userData = new { UserId = 123, UserName = "John" }; ElasticLogger.Info("User login", "UserService.Login", userData); ``` ### Asynchronous Logging ```csharp // Asynchronously log different levels await ElasticLogger.DebugAsync("Debug information", "MyClass.Method"); await ElasticLogger.InfoAsync("General information", "MyClass.Method"); await ElasticLogger.WarnAsync("Warning message", "MyClass.Method"); await ElasticLogger.ErrorAsync("Error message", new Exception("Exception details"), "MyClass.Method"); await ElasticLogger.FatalAsync("Critical error", new Exception("Exception details"), "MyClass.Method"); ``` --- ## Configuration Parameters Detailed ### Logger Configuration Items | Property | Type | Default Value | Description | |------|------|--------|------| | `Enabled` | `bool` | `true` | Whether to enable logging functionality | | `IndexPrefix` | `string` | `"app-log"` | Index prefix | | `IndexStrategy` | `IndexStrategy` | `DailyRolling` | Index strategy (Fixed/DailyRolling) | | `FixedIndexName` | `string` | `null` | Fixed index name (only used when IndexStrategy is Fixed) | | `ApplicationName` | `string` | `"DefaultApp"` | Application name | | `BatchSize` | `int` | `100` | Batch size for log sending | | `TimeoutMs` | `int` | `10000` | Send timeout (milliseconds) | ### Cluster Configuration Items | Property | Type | Default Value | Description | |------|------|--------|------| | `Nodes` | `List` | `empty` | List of Elasticsearch node addresses | | `Username` | `string` | `null` | Username (for Basic authentication) | | `Password` | `string` | `null` | Password (for Basic authentication) | | `UseSsl` | `bool` | `false` | Whether to enable SSL | | `SkipSslVerification` | `bool` | `false` | Whether to skip SSL certificate verification | | `ConnectionTimeoutMs` | `int` | `5000` | Connection timeout (milliseconds) | | `MaxRetries` | `int` | `2` | Maximum retry attempts | ### IndexStrategy Index Strategies | Strategy | Description | |------|------| | **Fixed** | Fixed index, all logs written to the same index | | **DailyRolling** | Date-based rolling index, generates a new index daily (default) | --- ## License This project uses the **MIT License** - see the LICENSE file for details. --- ## Configuration and Usage Examples for Different Environments ### .NET Framework/.NET Core/.NET 5+ Environment Configuration and Usage #### 1. Initialization and Usage in Program.cs ```csharp using EasyElasticLogger.ES.Configuration; using EasyElasticLogger.ES.Logging; using System; using System.Collections.Generic; namespace MyNetFrameworkApp { class Program { static void Main(string[] args) { // Initialize logger InitializeLogger(); // Log at different levels ElasticLogger.Info("Application starting", "Program.Main"); try { // Simulate business logic DoWork(); } catch (Exception ex) { ElasticLogger.Error("Unhandled exception in application", ex, "Program.Main"); } ElasticLogger.Info("Application ending", "Program.Main"); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } static void InitializeLogger() { var config = new LoggerConfiguration { Enabled = true, IndexPrefix = "myapp-log", ApplicationName = "MyNetFrameworkApp", Cluster = new ClusterConfiguration { Nodes = new List { "http://localhost:9200" }, Username = "elastic", Password = "your_password" } }; ElasticLogger.Initialize(config); Console.WriteLine("Logger initialization completed"); } static void DoWork() { ElasticLogger.Info("Starting business logic", "Program.DoWork"); // Simulate some work System.Threading.Thread.Sleep(1000); // Log with additional data var userData = new { UserId = 1001, UserName = "John", Action = "Query data" }; ElasticLogger.Info("User performing action", "UserService.QueryData", userData); ElasticLogger.Info("Business logic completed", "Program.DoWork"); } } } ``` ### ASP.NET Core Web API Environment Configuration and Usage #### 1. appsettings.json Configuration Example ```json { "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "ElasticLogger": { "Enabled": true, "IndexPrefix": "webapi-log", "ApplicationName": "MyWebApiApp", "Cluster": { "Nodes": [ "http://localhost:9200" ], "Username": "elastic", "Password": "your_password", "UseSsl": false, "SkipSslVerification": false } }, "AllowedHosts": "*" } ``` #### 2. Initialization and Usage in Program.cs ```csharp using EasyElasticLogger.ES.Configuration; using EasyElasticLogger.ES.Logging; var builder = WebApplication.CreateBuilder(args); // Add controller services builder.Services.AddControllers(); // Initialize ElasticLogger from configuration var elasticLoggerConfig = new LoggerConfiguration { Enabled = builder.Configuration.GetValue("ElasticLogger:Enabled"), IndexPrefix = builder.Configuration.GetValue("ElasticLogger:IndexPrefix") ?? "webapi-log", ApplicationName = builder.Configuration.GetValue("ElasticLogger:ApplicationName") ?? "MyWebApiApp", Cluster = new ClusterConfiguration { Nodes = builder.Configuration.GetSection("ElasticLogger:Cluster:Nodes").Get>() ?? new List { "http://localhost:9200" }, Username = builder.Configuration.GetValue("ElasticLogger:Cluster:Username"), Password = builder.Configuration.GetValue("ElasticLogger:Cluster:Password"), UseSsl = builder.Configuration.GetValue("ElasticLogger:Cluster:UseSsl"), SkipSslVerification = builder.Configuration.GetValue("ElasticLogger:Cluster:SkipSslVerification") } }; ElasticLogger.Initialize(elasticLoggerConfig); // Log application startup ElasticLogger.Info("Web API application starting"); var app = builder.Build(); // Configure HTTP request pipeline if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseAuthorization(); app.MapControllers(); // Log after application startup completion app.Lifetime.ApplicationStarted.Register(() => { ElasticLogger.Info("Web API application successfully started"); }); app.Run(); ``` #### 3. Logging Usage in Controller ```csharp using Microsoft.AspNetCore.Mvc; using EasyElasticLogger.ES.Logging; namespace MyWebApiApp.Controllers { [ApiController] [Route("[controller]")] public class UserController : ControllerBase { [HttpGet("{id}")] public IActionResult GetUser(int id) { try { ElasticLogger.Info($"Starting user query, User ID: {id}", "UserController.GetUser"); // Simulate database query var user = new { Id = id, Name = "John", Email = "john@example.com" }; // Log with additional data ElasticLogger.Info("User query successful", "UserController.GetUser", user); return Ok(user); } catch (Exception ex) { ElasticLogger.Error($"User query failed, User ID: {id}", ex, "UserController.GetUser"); return StatusCode(500, "Internal server error"); } } [HttpPost] public async Task CreateUser([FromBody] CreateUserRequest request) { try { ElasticLogger.Info("Starting user creation", "UserController.CreateUser", request); // Simulate async database operation await Task.Delay(100); // Log asynchronously await ElasticLogger.InfoAsync("User creation successful", "UserController.CreateUser", request); return Ok(new { Message = "User created successfully" }); } catch (Exception ex) { await ElasticLogger.ErrorAsync("User creation failed", ex, "UserController.CreateUser", request); return StatusCode(500, "Internal server error"); } } } public class CreateUserRequest { public string Name { get; set; } public string Email { get; set; } } } ```
**Making Logging Simple Yet Powerful** ✨✨✨