Twisted - 如何记录服务器收到的FTP命令

时间:2017-12-15 13:27:37

标签: python ftp twisted

我正在使用twisted作为FTP服务器:

Properties props = new Properties();
props.put("batch.size", 16384);
props.put("buffer.memory", 33554432);
Producer<String, String> producer = new KafkaProducer<>(props);
 for (int i = 0; i < 100; i++)
     producer.send(new ProducerRecord<String, String>("my-topic", Integer.toString(i), Integer.toString(i)));

producer.close();

如何从客户端记录每个收到的FTP命令?

1 个答案:

答案 0 :(得分:1)

FTPRealm创建FTPAnonymousShellFTPShell实例(头像)来调解对文件系统的访问。

这些类都实现了IFTPShell。一种解决方案是为FTPRealm创建一个包装器,它将日志包装器应用于它创建的化身。

from twisted.python.components import proxyForInterface

class WrappingRealm(proxyForInterface(IRealm)):
    wrap = staticmethod(logging_wrapper)

    def requestAvatar(self, *a, **kw):
        d = maybeDeferred(
            super(WrappingRealm, self).requestAvatar,
            *a, **kw
        )
        def got_avatar((iface, avatar, logout)):
            return (iface, self.wrap(avatar), logout)
       d.addCallback(got_avatar)
       return d

并实施logging_wrapper之类的内容:

class _LoggingFTPShell(proxyForInterface(IFTPShell)):
    def makeDirectory(self, path):
        log(avatar=self.avatar, operation="makeDirectory", path=path)
        return super(_LoggingFTPShell, self).makeDirectory(path)

    # The same for the rest of the methods of IFTPShell
    # ...

def logging_wrapper(avatar):
    return _LoggingFTPShell(avatar)

这有点单调乏味,因为您必须为接口上的每个方法添加日志记录。但是,由于Twisted的FTP协议实现本身并不提供执行所需日志记录的工具,因此很难解决这个问题。通过一些元编程,您可以节省一些打字(但代价是一些复杂性)。

另一种方法是为Twisted添加补丁,添加您感兴趣的日志记录。