Skip to content

Instantly share code, notes, and snippets.

@xcvbn23
Forked from ank-everstake/gelf_to_file.py
Last active October 28, 2023 10:11
Show Gist options
  • Save xcvbn23/22ea383e7943979d7ac9323dbba083d0 to your computer and use it in GitHub Desktop.
Save xcvbn23/22ea383e7943979d7ac9323dbba083d0 to your computer and use it in GitHub Desktop.
Gelf Log Listener in Python
#!/usr/bin/env python
import gzip
import socket
import sys
import zlib
from pathlib import Path
def persist(event: dict):
print("persist", event)
path = Path("events.log")
path = path.open("a")
path.write(f"{event}\n")
path.close()
def decode(event: bytes) -> str:
print("decode event")
event = event.decode()
return event
def decompress_zlib(data: bytes) -> bytes | None:
try:
print("decompress zlib event")
event = zlib.decompress(data)
return event
except Exception as e:
print("zlib decompress failed", e)
def decompress_gzip(data: bytes) -> bytes | None:
try:
print("decompress gzip event")
event = gzip.decompress(data)
return event
except Exception as e:
print("gzip decompress failed.", e)
if __name__ == "__main__":
HOST = "127.0.0.1" # use, 0.0.0.0 symbolic name meaning all available interfaces
PORT = 12201 # default port for GELF UDP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # this creates UDP socket
print("socket created")
try:
s.bind((HOST, PORT))
except socket.error as e:
print("bind failed. Error Code : " + str(e[0]) + " Message " + e[1])
sys.exit()
print("socket bind complete")
print("reading stream now")
while True:
# 8192 is the largest size that a udp packet can handle
data, addr = s.recvfrom(1024) # buffer size is 1024 bytes
print("ingested event from", addr)
event = decompress_gzip(data) or decompress_zlib(data)
if event:
event = decode(event)
else:
print("uncompressed event")
event = decode(data)
persist(event)
@xcvbn23
Copy link
Author

xcvbn23 commented Oct 28, 2023

Example producer:

docker run \
      --log-driver gelf --log-opt gelf-address=udp://127.0.0.1:12201 --log-opt gelf-compression-type=gzip \
      alpine /bin/sh -c "while true; do echo hello world; sleep 1; done;"

Configuration options here https://docs.docker.com/config/containers/logging/gelf/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment