Device Integration
9 minute read
This page provides configuration examples for setting up syslog forwarding from various sources to Edge Delta.
Configuring Syslog Sources
Rsyslog Configuration
Configure rsyslog to forward logs to Edge Delta:
# /etc/rsyslog.conf or /etc/rsyslog.d/edge-delta.conf
# Forward all logs to Edge Delta via UDP
*.* @<edge-delta-host>:5514
# Forward only critical logs via TCP for guaranteed delivery
*.crit @@<edge-delta-host>:6514
# Forward specific facilities
auth,authpriv.* @<edge-delta-host>:5514
kern.* @<edge-delta-host>:5514
mail.err @@<edge-delta-host>:6514
# Forward with custom template (RFC 5424)
$ActionForwardDefaultTemplate RSYSLOG_SyslogProtocol23Format
*.* @<edge-delta-host>:5514
This rsyslog configuration demonstrates different forwarding patterns for various use cases. The single @ symbol indicates UDP transport while double @@ specifies TCP. The selector syntax (facility.priority) controls which messages are forwarded—for example, *.crit sends all critical-level messages, while auth,authpriv.* sends all authentication-related logs regardless of severity. The last section enables RFC 5424 formatting using rsyslog’s built-in template for modern syslog protocol compliance.
After configuration, restart rsyslog:
sudo systemctl restart rsyslog
Syslog-ng Configuration
Configure syslog-ng to forward to Edge Delta:
# /etc/syslog-ng/syslog-ng.conf
destination d_edge_delta {
network("<edge-delta-host>" port(5514) transport("udp"));
};
# For TCP with RFC 5424
destination d_edge_delta_tcp {
syslog("<edge-delta-host>"
port(6514)
transport("tcp")
flags(syslog-protocol));
};
log {
source(s_src);
destination(d_edge_delta);
};
This syslog-ng configuration creates two destination definitions for Edge Delta. The first uses the network() driver for simple UDP forwarding, while the second uses the syslog() driver with the syslog-protocol flag to enable RFC 5424 formatting over TCP. The log statement connects your existing log source (s_src) to the Edge Delta destination. You can modify the log statement to include filters or use the TCP destination instead by changing d_edge_delta to d_edge_delta_tcp.
Network Device Configuration
Cisco IOS
Configure Cisco IOS devices to forward syslog messages to Edge Delta. The logging trap command sets the minimum severity level (informational captures levels 0-6), while logging origin-id hostname ensures each message includes the device hostname for identification.
logging host <edge-delta-host> transport udp port 5514
logging trap informational
logging origin-id hostname
Juniper Junos
Configure Juniper devices to send syslog messages to Edge Delta. The first command specifies the destination host and port, the second sets the minimum severity level (any info captures all facilities at info level and above), and facility-override remaps all messages to the local0 facility for consistent processing.
set system syslog host <edge-delta-host> port 5514
set system syslog host <edge-delta-host> any info
set system syslog host <edge-delta-host> facility-override local0
FortiGate Firewall
FortiGate firewalls require RFC 6587 Octet Counting when using reliable (TCP) mode. This configuration demonstrates how to receive FortiGate logs with proper framing support.
Edge Delta Configuration:
nodes:
- name: fortigate_syslog
type: syslog_input
protocol: rfc5424
transport_protocol: tcp
port: 514
enable_octet_counting: true
max_log_size: 10MiB
location: America/New_York
FortiGate CLI Configuration:
config log syslogd setting
set status enable
set server "<edge-delta-host>"
set port 514
set mode reliable
set facility local7
set format rfc5424
end
The mode reliable setting triggers TCP with RFC 6587 Octet Counting. FortiGate logs include rich structured data that Edge Delta automatically parses into the structured_data field for easy downstream filtering and analysis.
Palo Alto Networks Firewall
Palo Alto Networks firewalls can send logs in both BSD (RFC 3164) and structured (RFC 5424) formats. For modern deployments, RFC 5424 is recommended.
Edge Delta Configuration:
nodes:
- name: palo_alto_syslog
type: syslog_input
protocol: rfc5424
transport_protocol: tcp
port: 514
max_log_size: 5MiB
location: UTC
Palo Alto CLI Configuration:
configure
set shared log-settings syslog EdgeDelta-Server
server EdgeDelta-Server transport TCP
server EdgeDelta-Server server <edge-delta-host>
server EdgeDelta-Server port 514
server EdgeDelta-Server format IETF
server EdgeDelta-Server facility LOG_USER
commit
The format IETF setting enables RFC 5424 structured syslog. Palo Alto logs contain detailed threat intelligence, user information, and application data in the structured data field.
Cisco ASA Firewall
Cisco ASA firewalls use traditional BSD syslog format (RFC 3164). Configure for UDP to match Cisco’s default behavior, or use TCP for guaranteed delivery of security events.
Edge Delta Configuration (UDP):
nodes:
- name: cisco_asa_syslog
type: syslog_input
protocol: rfc3164
transport_protocol: udp
port: 514
udp_async:
readers: 4
processors_count: 4
max_queue_length: 1000
location: America/Los_Angeles
Edge Delta Configuration (TCP for critical logs):
nodes:
- name: cisco_asa_syslog_tcp
type: syslog_input
protocol: rfc3164
transport_protocol: tcp
port: 1514
max_log_size: 2MiB
location: America/Los_Angeles
Cisco ASA CLI Configuration:
logging enable
logging timestamp
logging trap informational
logging host inside <edge-delta-host> udp/514
# For TCP (use different port to avoid conflicts)
logging host inside <edge-delta-host> tcp/1514
F5 BIG-IP
F5 BIG-IP supports both RFC 3164 and RFC 5424 formats.
Edge Delta Configuration:
nodes:
- name: f5_syslog
type: syslog_input
protocol: rfc5424
transport_protocol: tcp
port: 514
max_log_size: 5MiB
location: UTC
F5 TMSH Configuration:
# Create remote syslog destination
tmsh create sys syslog remote-servers add { EdgeDelta { host <edge-delta-host> remote-port 514 } }
# Configure what to log
tmsh modify sys syslog include "
destination remote_servers {
EdgeDelta { }
}
"
Linux IPTables
Enable iptables logging and forward the resulting kernel messages to Edge Delta. The LOG target writes packet information to the kernel log with a custom prefix for easy identification. The --log-level 4 corresponds to the warning severity. After enabling iptables logging, configure rsyslog to forward these kernel warnings using the configuration shown in the rsyslog section above.
# Forward iptables logs
iptables -A INPUT -j LOG --log-prefix "iptables: " --log-level 4
# Configure rsyslog to forward kern.warning to Edge Delta
Application Integration
Python Application
Python’s built-in logging framework provides native syslog integration through the SysLogHandler class, allowing applications to send structured logs directly to Edge Delta without requiring system-level syslog configuration. This approach gives developers fine-grained control over which application events are forwarded and how they’re formatted.
import logging
import logging.handlers
# Configure syslog handler
handler = logging.handlers.SysLogHandler(
address=('<edge-delta-host>', 5514),
facility=logging.handlers.SysLogHandler.LOG_USER,
socktype=socket.SOCK_DGRAM # UDP
)
# Set format for RFC 5424
formatter = logging.Formatter('%(message)s')
handler.setFormatter(formatter)
# Add to logger
logger = logging.getLogger()
logger.addHandler(handler)
logger.setLevel(logging.INFO)
# Use in application
logger.info("Application started successfully")
logger.error("Database connection failed")
This configuration creates a syslog handler that sends messages over UDP to port 5514 using the USER facility. The formatter is kept minimal to allow the message content to be properly formatted according to syslog standards. Once configured, all log statements at INFO level and above will be automatically forwarded to Edge Delta, where they’ll be parsed and enriched with the appropriate syslog fields including timestamp, hostname, and severity based on the log level used.
Java Application (Log4j2)
Log4j2 provides enterprise-grade logging capabilities for Java applications with built-in syslog support. The Syslog appender can be configured declaratively through XML configuration files, enabling centralized log management without modifying application code. This approach is particularly valuable in microservices architectures where consistent logging across services is critical.
<!-- log4j2.xml -->
<Configuration>
<Appenders>
<Syslog name="EdgeDelta"
format="RFC5424"
host="<edge-delta-host>"
port="5514"
protocol="UDP"
appName="MyApp"
facility="USER"
includeMDC="true">
<PatternLayout pattern="%m"/>
</Syslog>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="EdgeDelta"/>
</Root>
</Loggers>
</Configuration>
This Log4j2 configuration creates a Syslog appender that formats messages according to RFC 5424 standards and sends them via UDP to Edge Delta. The includeMDC="true" setting ensures that any Mapped Diagnostic Context (MDC) data, such as request IDs or user identifiers, is included as structured data in the syslog message. The PatternLayout is kept simple to prevent double-formatting, allowing Log4j2’s syslog appender to properly structure the message with all required syslog fields.
Docker Container Logging
Docker’s logging driver architecture allows containers to send their stdout and stderr streams directly to syslog destinations without requiring any changes to the containerized application. This container-level approach ensures that all output from the application, including startup messages and uncaught exceptions, is captured and forwarded to Edge Delta.
# Configure Docker to send container logs via syslog
docker run --log-driver=syslog \
--log-opt syslog-address=udp://<edge-delta-host>:5514 \
--log-opt syslog-format=rfc5424 \
--log-opt tag="{{.Name}}/{{.ID}}" \
myapp:latest
The Docker syslog driver configuration uses RFC 5424 format for structured logging and includes container metadata through the tag template. The {{.Name}}/{{.ID}} tag format provides both the container name and a unique identifier in each log message, making it easy to correlate logs across container restarts or scaling events. This approach works seamlessly with container orchestrators like Docker Swarm or standalone Docker hosts, though Kubernetes users typically rely on the Edge Delta DaemonSet for log collection instead.
Testing Syslog Configuration
After configuring your systems, you can test the connection using these methods:
Using Logger Command
# Send test message from Linux/Unix systems
logger -n <edge-delta-host> -P 5514 -p user.info "Test message from $(hostname)"
# Test with different priorities
logger -n <edge-delta-host> -P 5514 -p user.error "Test error message"
logger -n <edge-delta-host> -P 5514 -p user.crit "Test critical message"
Using Netcat for Manual Testing
# Send RFC 5424 formatted test message via UDP
echo '<14>1 2025-09-04T12:00:00Z test-host app - - - Test connection' | nc -u -w1 <edge-delta-host> 5514
# Test TCP connection
echo '<14>1 2025-09-04T12:00:00Z test-host app - - - TCP test' | nc -w1 <edge-delta-host> 6514
Testing RFC 6587 Octet Counting
Test octet counting framing required by FortiGate:
# Manually construct octet-counted message
# Format: <byte-count><space><message>
# Message: <34>1 2025-10-06T12:00:00Z test app - - - Octet test
# Calculate length (52 bytes in this example)
MSG='<34>1 2025-10-06T12:00:00Z test app - - - Octet test'
LENGTH=${#MSG}
echo "${LENGTH} ${MSG}" | nc <edge-delta-host> 514
# Test with longer message
MSG='<34>1 2025-10-06T12:00:00Z hostname myapp 123 ID47 - This is a longer test message for octet counting validation'
LENGTH=${#MSG}
echo "${LENGTH} ${MSG}" | nc <edge-delta-host> 514
Testing RFC 5424 Structured Data
Test structured data parsing with realistic examples:
# FortiGate-style structured data
echo '<34>1 2025-10-06T12:00:00Z firewall01 fortios 5678 ID47 [fortigate@32473 vd="root" logid="0000000013" type="traffic" subtype="forward"] Traffic allowed' | nc <edge-delta-host> 514
# Cisco-style structured data
echo '<134>1 2025-10-06T12:00:00Z switch01 ios 1234 LINK-3-UPDOWN [cisco@9 interface="GigabitEthernet1/0/1" state="up"] Interface state changed' | nc <edge-delta-host> 514
# Multiple structured data elements
echo '<34>1 2025-10-06T12:00:00Z app01 myapp 999 MSG123 [origin@123 ip="10.0.0.5"][meta@123 user="john" session="abc"] User login successful' | nc <edge-delta-host> 514
Testing Multiline Logs
Test multiline log handling (TCP only):
# Java stack trace simulation
cat <<'EOF' | nc <edge-delta-host> 514
<134>Oct 6 12:00:00 appserver java: Exception in thread "main"
<134>Oct 6 12:00:00 appserver java: at com.example.Main.main(Main.java:15)
<134>Oct 6 12:00:00 appserver java: Caused by: java.lang.NullPointerException
<134>Oct 6 12:00:00 appserver java: at com.example.Helper.process(Helper.java:42)
EOF
Note: With proper multiline.line_start_pattern configuration, these should be assembled into a single log entry.
High-Volume Load Testing
Test async UDP performance with high message rates:
# Install hping3 for high-rate UDP testing
sudo apt-get install hping3 # Debian/Ubuntu
sudo yum install hping3 # RHEL/CentOS
# Generate high-rate UDP syslog traffic
# Adjust loop count and sleep interval for desired message rate
for i in {1..10000}; do
echo "<134>Oct 6 12:00:00 test syslog: Load test message $i" | nc -u -w0 <edge-delta-host> 514 &
if [ $((i % 100)) -eq 0 ]; then sleep 0.1; fi
done
# Monitor for dropped packets
watch -n 1 'netstat -su | grep "packet receive errors"'
Performance Benchmark Script
Create a simple benchmark to measure throughput:
#!/bin/bash
# syslog-benchmark.sh
HOST="<edge-delta-host>"
PORT=514
MESSAGES=10000
echo "Sending $MESSAGES messages to $HOST:$PORT"
START=$(date +%s.%N)
for i in $(seq 1 $MESSAGES); do
echo "<134>Oct 6 12:00:00 benchmark test: Message $i" | nc -u -w0 $HOST $PORT 2>/dev/null
done
END=$(date +%s.%N)
ELAPSED=$(echo "$END - $START" | bc)
RATE=$(echo "scale=2; $MESSAGES / $ELAPSED" | bc)
echo "Sent $MESSAGES messages in $ELAPSED seconds"
echo "Average rate: $RATE messages/second"
Run the benchmark:
chmod +x syslog-benchmark.sh
./syslog-benchmark.sh
Verify Receipt
Check Edge Delta Live Capture or logs to confirm messages are being received and processed correctly. For structured data tests, verify that the structured_data field is properly populated with the key-value pairs.