Skip to content

Instantly share code, notes, and snippets.

@gleicon
Created December 21, 2010 12:14
Show Gist options
  • Select an option

  • Save gleicon/749857 to your computer and use it in GitHub Desktop.

Select an option

Save gleicon/749857 to your computer and use it in GitHub Desktop.

Revisions

  1. gleicon created this gist Dec 21, 2010.
    55 changes: 55 additions & 0 deletions txsyslogd.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,55 @@
    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    # launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
    # launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist

    from twisted.internet import reactor, stdio, defer
    from twisted.internet.protocol import Protocol, Factory
    from twisted.protocols.basic import LineReceiver
    import time, re, math, json

    #<22>Nov 1 00:12:04 gleicon-vm1 postfix/smtpd[4880]: connect from localhost[127.0.0.1]
    severity = ['emerg', 'alert', 'crit', 'err', 'warn', 'notice', 'info', 'debug', ]

    facility = ['kern', 'user', 'mail', 'daemon', 'auth', 'syslog', 'lpr', 'news',
    'uucp', 'cron', 'authpriv', 'ftp', 'ntp', 'audit', 'alert', 'at', 'local0',
    'local1', 'local2', 'local3', 'local4', 'local5', 'local6', 'local7',]

    fs_match = re.compile("<(.+)>(.*)", re.I)

    class SyslogdProtocol(LineReceiver):
    delimiter = '\n'
    def connectionMade(self):
    print 'Connection from %r' % self.transport


    def lineReceived(self, line):
    k = {}
    k['line'] = line.strip()
    (fac, sev) = self._calc_lvl(k['line'])
    k['host'] = self.transport.getHost().host
    k['tstamp'] = time.time()
    k['facility'] = fac
    k['severity'] = sev
    print json.dumps(k)

    def _calc_lvl(self, line):
    lvl = fs_match.split(line)
    if lvl and len(lvl) > 1:
    i = int(lvl[1])
    fac = int(math.floor(i / 8))
    sev = i - (fac * 8)
    return (facility[fac], severity[sev])
    return (None, None)

    class SyslogdFactory(Factory):
    protocol = SyslogdProtocol

    def main():
    factory = SyslogdFactory()
    reactor.listenTCP(25000, factory, 10)
    reactor.run()

    if __name__ == '__main__':
    main()