Skip to content

AxonOps — AI-Native Control Plane for Open Source Data Platforms

Kafka Log Analysis

Guide to analyzing Apache Kafka logs for troubleshooting and diagnostics.


Log FilePurposeKey Information
server.logMain broker logErrors, warnings, startup/shutdown
controller.logController operationsLeader elections, partition assignments
state-change.logPartition state changesISR changes, leadership changes
kafka-authorizer.logAuthorization decisionsACL evaluations
kafka-request.logRequest loggingClient requests (if enabled)
log-cleaner.logLog compactionCompaction progress, errors
kafkaServer-gc.logJVM GC logsGC events, pause times
# Linux/Standard installation
/var/log/kafka/
/opt/kafka/logs/
# Kubernetes
/var/log/containers/kafka-*.log
# Docker
docker logs <kafka-container>

PatternMeaningAction
FATALFatal errorInvestigate immediately
OutOfMemoryErrorHeap exhaustedIncrease heap, check for leaks
KafkaStorageExceptionDisk failureCheck disk health
OfflinePartitionsCount > 0Partitions offlineRestore brokers
Terminal window
# Find critical errors
grep -E "FATAL|OutOfMemoryError|KafkaStorageException" server.log
PatternMeaningAction
ERRORError conditionInvestigate root cause
NotLeaderForPartitionStale metadataUsually transient
UnknownTopicOrPartitionTopic doesn’t existCreate topic or fix config
Connection.*refusedNetwork issueCheck connectivity
Authentication failedAuth errorCheck credentials
Terminal window
# Find errors
grep "ERROR" server.log | tail -100
# Filter by component
grep "ERROR.*\[Controller\]" controller.log
PatternMeaningAction
WARNWarning conditionMonitor frequency
ISR shrunkReplica fell behindCheck replica health
Connection.*timed outSlow networkInvestigate latency
Request.*too largeLarge requestCheck client config
Terminal window
# Count warnings by type
grep "WARN" server.log | cut -d: -f4 | sort | uniq -c | sort -rn
PatternMeaning
Partition.*LeaderLeadership change
ISR.*expandedReplica rejoined ISR
ISR.*shrunkReplica left ISR
state.*OnlinePartitionPartition came online
state.*OfflinePartitionPartition went offline
Terminal window
# Track leadership changes
grep "Leader" state-change.log | tail -50
# Track ISR changes
grep "ISR" state-change.log | tail -50

Terminal window
# Search for pattern
grep "pattern" server.log
# Case-insensitive search
grep -i "error" server.log
# Search with context
grep -B 5 -A 5 "Exception" server.log
# Search multiple files
grep "ERROR" /var/log/kafka/*.log
Terminal window
# Filter by time range
awk '/2024-01-15 10:/ && /2024-01-15 11:/' server.log
# Last hour
grep "$(date -d '1 hour ago' '+%Y-%m-%d %H')" server.log
# Count errors per hour
grep "ERROR" server.log | cut -d' ' -f1-2 | cut -d: -f1-2 | uniq -c
Terminal window
# Most common errors
grep "ERROR" server.log | \
sed 's/.*ERROR/ERROR/' | \
cut -d: -f1-2 | \
sort | uniq -c | sort -rn | head -20
# Most common exceptions
grep -oE "[A-Z][a-zA-Z]+Exception" server.log | \
sort | uniq -c | sort -rn
Terminal window
# Find events around a timestamp
grep "2024-01-15 10:30" server.log | head -50
# Correlate across files
timestamp="2024-01-15 10:30"
for log in server.log controller.log state-change.log; do
echo "=== $log ==="
grep "$timestamp" $log | head -10
done

Terminal window
# Enable debug for specific logger
kafka-configs.sh --bootstrap-server kafka:9092 \
--entity-type broker-loggers \
--entity-name 0 \
--alter \
--add-config kafka.server=DEBUG
# Verify logger level
kafka-configs.sh --bootstrap-server kafka:9092 \
--entity-type broker-loggers \
--entity-name 0 \
--describe
# Reset to default
kafka-configs.sh --bootstrap-server kafka:9092 \
--entity-type broker-loggers \
--entity-name 0 \
--alter \
--delete-config kafka.server
LoggerPurpose
kafka.serverServer operations
kafka.controllerController operations
kafka.networkNetwork/request handling
kafka.logLog management
kafka.request.loggerRequest details
kafka.authorizer.loggerACL decisions
kafka.coordinator.groupConsumer group coordination
kafka.coordinator.transactionTransaction coordination
log4j.properties
# Debug controller
log4j.logger.kafka.controller=DEBUG
# Debug network
log4j.logger.kafka.network=DEBUG
# Debug replication
log4j.logger.kafka.server.ReplicaManager=DEBUG
log4j.logger.kafka.server.ReplicaFetcherThread=DEBUG
# Debug authorization
log4j.logger.kafka.authorizer.logger=DEBUG
# Request logging (verbose)
log4j.logger.kafka.request.logger=DEBUG

log4j.properties
log4j.logger.kafka.request.logger=DEBUG
# Separate file for requests
log4j.appender.requestAppender=org.apache.log4j.RollingFileAppender
log4j.appender.requestAppender.File=${kafka.logs.dir}/kafka-request.log
log4j.appender.requestAppender.MaxFileSize=100MB
log4j.appender.requestAppender.MaxBackupIndex=10
log4j.logger.kafka.request.logger=DEBUG,requestAppender
log4j.additivity.kafka.request.logger=false
[timestamp] Completed request:[RequestType] with correlation id [id]
in queue time ms:[queue_time],
local time ms:[local_time],
remote time ms:[remote_time],
throttle time ms:[throttle_time],
response size:[size]
Terminal window
# Extract latency metrics
grep "Completed request" kafka-request.log | \
awk '{
for(i=1;i<=NF;i++) {
if($i ~ /local/) print $i, $(i+1), $(i+2), $(i+3)
}
}' | \
sort -t: -k4 -rn | head -20

[2024-01-15 10:30:00,123] INFO [Controller id=1] Partition [topic,0]
has been elected as leader at epoch 5 (kafka.controller.KafkaController)
[2024-01-15 10:30:00,125] INFO [Partition topic-0 broker=1]
ISR updated to [1,2,3] (kafka.cluster.Partition)

Interpretation: Leadership change occurred. Check for broker failures if unexpected.

[2024-01-15 10:30:00,123] WARN [Partition topic-0 broker=1]
Shrinking ISR from [1,2,3] to [1,2] (kafka.cluster.Partition)

Interpretation: Broker 3 fell behind and was removed from ISR. Check:

  • Broker 3 health
  • Network connectivity
  • Disk I/O on broker 3
[2024-01-15 10:30:00,123] INFO [GroupCoordinator 0]:
Member consumer-1 in group my-group has left (kafka.coordinator.group.GroupCoordinator)
[2024-01-15 10:30:01,456] INFO [GroupCoordinator 0]:
Preparing to rebalance group my-group (kafka.coordinator.group.GroupCoordinator)

Interpretation: Consumer left group, triggering rebalance. Check:

  • Consumer health
  • Session timeout settings
  • Processing time
[2024-01-15 10:30:00,123] INFO [SocketServer listenerType=BROKER, nodeId=1]
Failed authentication with /10.0.0.100
(Authentication failed during authentication due to:
Authentication failed: credentials do not match) (kafka.network.SocketServer)

Interpretation: Client failed to authenticate. Check:

  • Client credentials
  • SASL configuration
  • User exists in SCRAM store
[2024-01-15 10:30:00,123] ERROR [Log partition=topic-0 dir=/var/kafka-logs]
Error while flushing log (kafka.log.Log)
java.io.IOException: No space left on device

Interpretation: Disk full. Action:

  • Add storage
  • Reduce retention
  • Delete old topics

# Configure rolling file appender
log4j.appender.kafkaAppender=org.apache.log4j.RollingFileAppender
log4j.appender.kafkaAppender.File=${kafka.logs.dir}/server.log
log4j.appender.kafkaAppender.MaxFileSize=100MB
log4j.appender.kafkaAppender.MaxBackupIndex=10
log4j.appender.kafkaAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.kafkaAppender.layout.ConversionPattern=[%d] %p %m (%c)%n
# Root logger
log4j.rootLogger=INFO, kafkaAppender
/etc/logrotate.d/kafka
/var/log/kafka/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}

# JSON format for log aggregation
log4j.appender.kafkaAppender.layout=net.logstash.log4j.JSONEventLayoutV1
# Filebeat configuration
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/kafka/*.log
multiline:
pattern: '^\['
negate: true
match: after
fields:
service: kafka
environment: production
output.elasticsearch:
hosts: ["elasticsearch:9200"]
index: "kafka-logs-%{+yyyy.MM.dd}"