Logging Overview
NATS Server provides flexible logging capabilities to monitor server operations, debug issues, and audit activity.
Log Levels
NATS supports multiple log levels:
- Info - Normal operational messages (default)
- Warning - Warning messages for potential issues
- Error - Error messages for failures
- Fatal - Fatal errors that cause server shutdown
- Debug - Detailed debugging information
- Trace - Protocol-level tracing
Log Output Configuration
Standard Error (Default)
By default, logs go to stderr:
Output:
[1] 2026/03/04 10:15:30.123456 [INF] Starting nats-server
[1] 2026/03/04 10:15:30.123789 [INF] Version: 2.10.0
[1] 2026/03/04 10:15:30.124012 [INF] Git: [abc1234]
File Output
Redirect logs to a file:
log_file: "/var/log/nats-server.log"
Or via command line:
nats-server --log /var/log/nats-server.log
Log File Rotation
Automatic log rotation based on size:
log_file: "/var/log/nats-server.log"
log_size_limit: 1073741824 # 1GB in bytes
max_traced_msg_len: 256
From logger/log.go implementation, when the log file reaches the size limit:
- Current log renamed to
nats-server.log.2026.03.04.10.15.30
- New log file created
- Configurable maximum number of archived log files
Disable Timestamps
Remove timestamps from logs:
Or via command line:
Debug Logging
Enable detailed debug output:
Or via command line:
nats-server -D
# or
nats-server --debug
Debug logs show:
- Client connections and disconnections
- Subscription operations
- Route establishment
- Account operations
- Authentication attempts
Example debug output:
[1] 2026/03/04 10:15:35.123456 [DBG] 127.0.0.1:52461 - cid:1 - Client connection created
[1] 2026/03/04 10:15:35.123789 [DBG] 127.0.0.1:52461 - cid:1 - Client connection closed: Client Closed
Trace Logging
Enable protocol-level tracing:
Or via command line:
nats-server -V
# or
nats-server --trace
Trace logs show raw protocol messages:
[1] 2026/03/04 10:15:35.123456 [TRC] 127.0.0.1:52461 - cid:1 - <<- [PUB test 5]
[1] 2026/03/04 10:15:35.123457 [TRC] 127.0.0.1:52461 - cid:1 - <<- MSG_PAYLOAD: ["hello"]
[1] 2026/03/04 10:15:35.123458 [TRC] 127.0.0.1:52462 - cid:2 - ->> [MSG test 2 5]
Verbose Trace
Trace including system account (from main.go:51):
Or debug and verbose trace:
Limit Traced Message Length
Limit message payload length in trace logs:
max_traced_msg_len: 256 # bytes
Or via command line:
nats-server -V --max_traced_msg_len 256
Trace logging significantly impacts performance. Use only for debugging.
Syslog Support
Send logs to syslog or Windows Event Log:
Local Syslog
Or via command line:
nats-server -s
# or
nats-server --syslog
Remote Syslog
Send to remote syslog server:
remote_syslog: "udp://syslog.example.com:514"
Or via command line:
nats-server -r udp://syslog.example.com:514
# or
nats-server --remote_syslog udp://syslog.example.com:514
Syslog Configuration
From logger/syslog.go, NATS supports:
- Unix socket:
/dev/log, /var/run/syslog
- UDP:
udp://host:port
- TCP:
tcp://host:port
Example:
remote_syslog: "tcp://logs.company.com:514"
Default log format (from logger/log.go:74-95):
[PID] YYYY/MM/DD HH:MM:SS.microseconds [LEVEL] message
Example:
[12345] 2026/03/04 10:15:30.123456 [INF] Starting nats-server
Components
- [PID] - Process ID (optional, enabled with
pid: true)
- YYYY/MM/DD HH:MM:SS.microseconds - Timestamp with microsecond precision
- [LEVEL] - Log level: INF, WRN, ERR, FTL, DBG, TRC
- message - Log message
Colored Output
When outputting to terminal, logs can be colored:
# Colors are automatically enabled for terminal output
nats-server -D
Colors are disabled when logging to file or piping output.
Structured Logging
NATS logs include structured information:
Client Connection Logs
[1] 2026/03/04 10:15:35.123456 [DBG] 127.0.0.1:52461 - cid:1 - Client connection created
Fields:
- IP address and port
- Connection ID (cid)
- Event description
Account Logs
[1] 2026/03/04 10:15:35.123456 [INF] Account "PRODUCTION" created
Authentication Logs
[1] 2026/03/04 10:15:35.123456 [DBG] 127.0.0.1:52461 - cid:1 - User "alice" authenticated
Error Logs
[1] 2026/03/04 10:15:35.123456 [ERR] Authorization violation for subscription "secret.data" by user "bob"
Log Configuration Examples
Production Configuration
log_file: "/var/log/nats/server.log"
log_size_limit: 1073741824 # 1GB
logtime: true
debug: false
trace: false
Development Configuration
logtime: true
debug: true
trace: true
max_traced_msg_len: 1024
High-Volume Production
log_file: "/var/log/nats/server.log"
log_size_limit: 536870912 # 512MB
logtime: true
debug: false
trace: false
remote_syslog: "udp://syslog.company.com:514"
Debugging Issues
log_file: "/tmp/nats-debug.log"
logtime: true
debug: true
trace: true
max_traced_msg_len: 2048
Log Rotation Strategy
Size-Based Rotation
From logger/log.go implementation:
log_file: "/var/log/nats-server.log"
log_size_limit: 104857600 # 100MB
Behavior:
- When log reaches 100MB, rotate
- Old log renamed with timestamp
- New log file created
- Process continues without interruption
External Rotation (logrotate)
Use system log rotation:
/etc/logrotate.d/nats-server:
/var/log/nats-server.log {
daily
rotate 7
compress
delaycompress
notifempty
missingok
postrotate
/usr/bin/killall -SIGUSR1 nats-server
endscript
}
Reopen log file:
nats-server --signal reopen
Runtime Log Control
Change log levels without restart:
# Enable debug logging
nats-server --signal ldm
# Reload configuration (includes log settings)
nats-server --signal reload
From main.go:39, supported signals:
ldm - Toggle debug and trace logging
reopen - Reopen log file
reload - Reload configuration
Log Level Impact
- Info/Warn/Error: Minimal performance impact
- Debug: Low to moderate impact (~5-10% overhead)
- Trace: Significant impact (~20-50% overhead)
Recommendations
- Production: Use info level only
- Staging: Enable debug for issues
- Development: Use debug or trace freely
- Performance testing: Disable debug and trace
Async Logging
From logger/log.go implementation, file logging is buffered:
- Writes are buffered to reduce I/O
- Automatic flush on rotation
- Minimal blocking of main thread
Monitoring Logs
Log Aggregation
Forward logs to aggregation systems:
remote_syslog: "udp://logstash.company.com:514"
Or use file monitoring:
tail -f /var/log/nats-server.log | your-log-shipper
Alerting
Monitor for critical patterns:
[ERR] - Error conditions
[FTL] - Fatal errors
Authorization violation - Security issues
slow consumer - Performance issues
Best Practices
1. Use Appropriate Log Levels
# Production
debug: false
trace: false
# Debugging
debug: true
trace: false # Only when needed
2. Rotate Logs
log_file: "/var/log/nats-server.log"
log_size_limit: 1073741824 # Prevent disk fill
3. Limit Trace Payload
trace: true
max_traced_msg_len: 256 # Prevent huge logs
4. Centralize Logs
remote_syslog: "udp://logs.company.com:514"
5. Monitor Log Growth
# Check log file size
du -h /var/log/nats-server.log
# Monitor log rate
tail -f /var/log/nats-server.log | pv -l > /dev/null
6. Secure Log Files
chmod 640 /var/log/nats-server.log
chown nats:adm /var/log/nats-server.log