- 3 minutes to read

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.config or web.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 → Use Serilog

Serilog for modern .NET Core, .NET, 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