-
-
Save xcvbn23/22ea383e7943979d7ac9323dbba083d0 to your computer and use it in GitHub Desktop.
Gelf Log Listener in Python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Example producer:
Configuration options here https://docs.docker.com/config/containers/logging/gelf/