NewsBlur-viq/vendor/mms-agent/logConfig.py
2020-06-17 03:56:44 -04:00

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