Which appender framework should I use (.NET/Java/Python)?
Choose an appender framework based on your technology stack and deployment model. Appenders provide abstraction, prevent vendor lock-in, and enable logging to multiple destinations simultaneously.
.NET Framework → Use Log4Net
Log4Net Appender for .NET Framework 4.x applications:
- ✅ Mature, battle-tested logging framework
- ✅ Nodinite provides custom appender - writes JSON Log Events to intermediate storage
- ✅ Minimal code changes - configure in
app.configorweb.config - ✅ Supports multiple destinations - Nodinite + local files + Splunk simultaneously
Use cases: Legacy BizTalk integrations, ASP.NET web services, Windows services
Example:
log4net.ILog log = log4net.LogManager.GetLogger("MyIntegration");
log.Info("Order processed", new { OrderId = "PO-12345", CustomerId = "ACME" });
.NET Core / .NET 5-8 → Use Serilog
Serilog for modern .NET Core, .NET 5-8, Azure Functions:
- ✅ Structured logging with rich context
- ✅ Nodinite provides Serilog sink - writes to Azure Service Bus, Azure Storage, files
- ✅ Cloud-native - perfect for Azure Functions, microservices, containers
- ✅ High performance - asynchronous writing, batching
Use cases: Azure Functions, ASP.NET Core APIs, microservices, serverless
Example:
Log.Information("Order {OrderId} processed for customer {CustomerId}",
"PO-12345", "ACME");
Java → Use Log4J or SLF4J
Log4J / SLF4J for Java-based integrations:
- ✅ Standard Java logging frameworks
- ✅ Custom appender writes Nodinite JSON Log Events
- ✅ Works with Apache Camel, Spring Boot, webMethods Java services
Use cases: Apache Camel routes, Spring Boot microservices, webMethods integrations
Example:
logger.info("Order {} processed for customer {}", orderId, customerId);
Python → Use Python logging module
Python logging module with custom handler:
- ✅ Built-in Python standard library
- ✅ Custom handler writes JSON to queue/file
- ✅ Structured logging with dictionaries
Use cases: Python batch jobs, Flask/Django APIs, data pipelines
Example:
logging.info("Order processed", extra={
"OrderId": "PO-12345",
"CustomerId": "ACME"
})
Node.js → Use Winston or Bunyan
Winston / Bunyan for Node.js integrations:
- ✅ Popular Node.js logging libraries
- ✅ Custom transport writes JSON Log Events
- ✅ Supports structured logging
Use cases: Express.js APIs, Node.js microservices, serverless functions
Example (Winston):
logger.info("Order processed", {
orderId: "PO-12345",
customerId: "ACME"
});
Custom JSON Generation → Any Platform
Handcraft JSON Log Events for platforms without appender support:
- ✅ Works with any technology (Go, Rust, PHP, Ruby, PowerShell, etc.)
- ✅ Full control over JSON structure
- ✅ Follow JSON Log Event specification
Use cases: MuleSoft (use Mule ESB Custom Connector), IBM Sterling, TEIS, custom platforms
Example (any language):
{
"LogAgentValueId": 42,
"EndPointName": "Custom Integration",
"OriginalMessageTypeName": "PurchaseOrder#1.0",
"ApplicationInterchangeId": "a1b2c3d4-e5f6-7890",
"LogMessage": "Order processed",
"StateCode": 0,
"Body": "<Order>...</Order>"
}
Decision Matrix
| Platform | Recommended Framework | Why |
|---|---|---|
| .NET Framework 4.x | Log4Net Appender | Mature, proven, minimal changes |
| .NET Core / .NET 5-8 | Serilog | Modern, cloud-native, structured |
| Azure Functions | Serilog | Serverless-optimized |
| Java (Camel, Spring) | Log4J / SLF4J | Java standard |
| Python | logging module |
Built-in, simple |
| Node.js | Winston / Bunyan | Popular, flexible |
| MuleSoft | Mule ESB Custom Connector | Pre-built connector |
| webMethods | Log4J (Java services) or custom | Platform-specific |
| Other platforms | Custom JSON generation | Universal compatibility |
Need templates? Review Hello World Sample (.NET) or Mule ESB Custom Connector for reference implementations.
Related Topics:
Log4Net Appender Documentation
Serilog Documentation
JSON Log Event Format
See all FAQs: Troubleshooting Overview
Next Step
Back to Custom Logging Overview