mirror of
https://github.com/viq/NewsBlur.git
synced 2025-04-13 09:38:09 +00:00
125 lines
3.6 KiB
Python
Executable file
125 lines
3.6 KiB
Python
Executable file
"""
|
|
(C) Copyright 2011, 10gen
|
|
|
|
This is a label on a mattress. Do not modify this file!
|
|
"""
|
|
|
|
# App
|
|
import settings as _settings
|
|
|
|
# Mongo
|
|
import pymongo, bson
|
|
|
|
# Python
|
|
import logging, threading, time, logging.handlers, urllib.request, urllib.error, urllib.parse, platform, socket, queue
|
|
|
|
socket.setdefaulttimeout( _settings.socket_timeout )
|
|
|
|
class LogRelayThread( threading.Thread ):
|
|
""" The log relay thread - batch messages """
|
|
|
|
def __init__( self, recordQueue ):
|
|
""" Construct the object """
|
|
self.recordQueue = recordQueue
|
|
self.logUrl = _settings.logging_url % { 'key' : _settings.mms_key }
|
|
self.pythonVersion = platform.python_version()
|
|
|
|
try:
|
|
self.hostname = platform.uname()[1]
|
|
except:
|
|
self.hostname = 'UNKNOWN'
|
|
|
|
self.pymongoVersion = pymongo.version
|
|
threading.Thread.__init__( self )
|
|
|
|
def run( self ):
|
|
""" The agent process """
|
|
while True:
|
|
try:
|
|
# Let the records batch for five seconds
|
|
time.sleep( 5 )
|
|
|
|
self._processRecords()
|
|
|
|
except Exception:
|
|
pass
|
|
|
|
def _processRecords( self ):
|
|
""" Process the log records """
|
|
records = []
|
|
|
|
try:
|
|
while not self.recordQueue.empty():
|
|
|
|
record = self.recordQueue.get( True, 1 )
|
|
|
|
if record is None:
|
|
break
|
|
|
|
data = { }
|
|
data['levelname'] = record.levelname
|
|
data['msg'] = record.msg
|
|
data['filename'] = record.filename
|
|
data['threadName'] = record.threadName
|
|
|
|
# This is to deal with older versions of python.
|
|
try:
|
|
data['funcName'] = record.funcName
|
|
except Exception:
|
|
pass
|
|
|
|
data['process'] = record.process
|
|
data['lineno'] = record.lineno
|
|
data['pymongoVersion'] = self.pymongoVersion
|
|
data['pythonVersion'] = self.pythonVersion
|
|
data['hostname'] = self.hostname
|
|
|
|
records.append( data )
|
|
|
|
if len( records ) >= 10:
|
|
break
|
|
|
|
except queue.Empty:
|
|
pass
|
|
|
|
if len( records ) == 0:
|
|
return
|
|
|
|
# Send the data back to mms.
|
|
res = None
|
|
try:
|
|
res = urllib.request.urlopen( self.logUrl, bson.BSON.encode( { 'records' : records }, check_keys=False ) )
|
|
res.read()
|
|
finally:
|
|
if res is not None:
|
|
res.close()
|
|
|
|
class MmsRemoteHandler( logging.Handler ):
|
|
""" The mms remote log handler """
|
|
def __init__( self ):
|
|
""" Construct a new object """
|
|
logging.Handler.__init__( self )
|
|
self.recordQueue = queue.Queue( 250 )
|
|
self.logRelay = LogRelayThread( self.recordQueue )
|
|
self.logRelay.setName( 'LogRelay' )
|
|
self.logRelay.start()
|
|
|
|
def emit( self, record ):
|
|
""" Send the record to the remote servers """
|
|
try:
|
|
if record is not None:
|
|
self.recordQueue.put_nowait( record )
|
|
except Exception:
|
|
pass
|
|
|
|
def initLogger( ):
|
|
""" Initialize the logger """
|
|
logger = logging.getLogger('MMS')
|
|
streamHandler = logging.StreamHandler()
|
|
streamHandler.setFormatter( logging.Formatter('%(asctime)s %(levelname)s %(message)s') )
|
|
logger.addHandler( streamHandler )
|
|
logging.handlers.MmsRemoteHandler = MmsRemoteHandler
|
|
logger.addHandler( logging.handlers.MmsRemoteHandler() )
|
|
logger.setLevel( logging.INFO )
|
|
return logger
|
|
|