```csharp title="C#"
using Kreuzberg;

var processor = new LoggingPostProcessor();
PostProcessorRegistry.Register(processor);

public class LoggingPostProcessor : IPostProcessor
{
    public string Name => "logging-processor";
    public string Version => "1.0.0";

    public void Initialize()
    {
        Console.WriteLine("Logging post-processor initialized");
    }

    public void Shutdown()
    {
        Console.WriteLine("Logging post-processor shut down");
    }

    public void Process(ExtractionResult result, ExtractionConfig config)
    {
        Console.WriteLine($"Processing: {result.MimeType}, Content length: {result.Content.Length}");

        if (string.IsNullOrEmpty(result.Content))
        {
            Console.WriteLine("Warning: Extracted content is empty");
        }
    }

    public ProcessingStage ProcessingStage()
    {
        return ProcessingStage.Early;
    }

    public bool ShouldProcess(ExtractionResult result, ExtractionConfig config)
    {
        return true;
    }

    public ulong EstimatedDurationMs(ExtractionResult result)
    {
        return 1;
    }

    public int Priority()
    {
        return 10;
    }
}
```
