How to set up a 'listening' Unix domain socket

Robert Latest boblatest at yahoo.com
Mon Mar 22 11:02:07 EDT 2021


> Chris Angelico wrote:

[Helpful stuff]

I'm actually trying to implement a SocketHandler for a Python logger. However,
I can't get my handler on the client side to send anything. Do I need to
subclass logging.SocketHandler and fill the various methods with meaning? The
documentation doesn't say so.

I've noticed that when the server is not running, logging.SocketHandler creates
the socket. I don't understand why it would; isn't it the server's job to
create the socket?

################## CLIENT ############################

import socket
import pickle
from logging import getLogger
from logging.handlers import SocketHandler

SOCKET = '/tmp/test.socket'

# This doesn't send anything to the socket
_log = getLogger(__name__)
_log.addHandler(SocketHandler(None, SOCKET))
_log.error('Logging something')

# String gets sent to socket
sock = socket.socket(socket.AF_UNIX)
sock.connect(SOCKET)
sock.send(b"Hello, world")
sock.close()

# Pickled object works fine
sock = socket.socket(socket.AF_UNIX)
sock.connect(SOCKET)
sock.send(pickle.dumps(dict(a=1)))
sock.close()


################## SERVER ############################

import os
import pickle
from socketserver import UnixStreamServer, StreamRequestHandler

SOCKET = '/tmp/test.socket'

class Handler(StreamRequestHandler):

    def handle(self):
        data = self.rfile.read()
        try:
            obj = pickle.loads(data)
        except:
            print('Unpickled: ', data)
        else:
            print('Pickled: ', type(obj))

if os.path.exists(SOCKET):
    os.unlink(SOCKET)
with UnixStreamServer(SOCKET, Handler) as server:
    server.serve_forever()



More information about the Python-list mailing list