Added log for all initial loggable objects

Added removing logs at object destroy (models)
This commit is contained in:
Adolfo Gómez
2013-01-31 14:24:29 +00:00
parent a1f72833a4
commit a740207b8e
3 changed files with 98 additions and 30 deletions

View File

@@ -1,5 +1,4 @@
# -*- coding: utf-8 -*-
#
# Copyright (c) 2013 Virtual Cable S.L.
# All rights reserved.
@@ -31,6 +30,15 @@
@author: Adolfo Gómez, dkmaster at dkmon dot com
'''
from uds.models import UserService
from uds.models import DeployedServicePublication
from uds.models import DeployedService
from uds.models import Service
from uds.models import Provider
from uds.models import User
from uds.models import Group
from uds.models import Authenticator
from uds.models import Log
from uds.core.util import log
from uds.core.util.Config import GlobalConfig
@@ -40,6 +48,18 @@ logger = logging.getLogger(__name__)
OT_USERSERVICE, OT_PUBLICATION, OT_DEPLOYED_SERVICE, OT_SERVICE, OT_PROVIDER, OT_USER, OT_GROUP, OT_AUTHENTICATOR = xrange(8)
# Dict for translations
transDict = {
UserService : OT_USERSERVICE,
DeployedServicePublication : OT_PUBLICATION,
DeployedService : OT_DEPLOYED_SERVICE,
Service : OT_SERVICE,
Provider : OT_PROVIDER,
User : OT_USER,
Group : OT_GROUP,
Authenticator : OT_AUTHENTICATOR
}
class LogManager(object):
'''
Manager for logging (at database) events
@@ -54,31 +74,36 @@ class LogManager(object):
if LogManager._manager == None:
LogManager._manager = LogManager()
return LogManager._manager
# User Service log section
def __logUserService(self, userService, level, message, source):
def __log(self, owner_type, owner_id, level, message, source):
'''
Logs a message associated to an user service
Logs a message associated to owner
'''
from uds.models import getSqlDatetime
qs = Log.objects.filter(owner_id = userService.id, owner_type = OT_USERSERVICE)
qs = Log.objects.filter(owner_id = owner_id, owner_type = owner_type)
# First, ensure we do not have more than requested logs, and we can put one more log item
if qs.count() >= GlobalConfig.MAX_LOGS_PER_ELEMENT.getInt():
for i in qs.order_by('-created',)[GlobalConfig.MAX_LOGS_PER_ELEMENT.getInt()-1:]: i.delete()
# now, we add new log
Log.objects.create(owner_type = OT_USERSERVICE, owner_id = userService.id, created = getSqlDatetime(), source = source, level = level, data = message)
def __getUserServiceLogs(self, userService, limit):
Log.objects.create(owner_type = owner_type, owner_id = owner_id, created = getSqlDatetime(), source = source, level = level, data = message)
def __getLogs(self, owner_type, owner_id, limit):
'''
Get all logs associated with an user service, ordered by date
'''
qs = Log.objects.filter(owner_id = userService.id, owner_type = OT_USERSERVICE)
return [{'date': x.created, 'level': x.level, 'source': x.source, 'message': x.data} for x in qs.order_by('created')][:limit]
qs = Log.objects.filter(owner_id = owner_id, owner_type = owner_type)
return [{'date': x.created, 'level': x.level, 'source': x.source, 'message': x.data} for x in reversed(qs.order_by('-created')[:limit])]
def __clearLogs(self, owner_type, owner_id):
'''
Clears all logs related to user service
'''
Log.objects.filter(owner_id = owner_id, owner_type = owner_type).delete()
def doLog(self, wichObject, level, message, source = log.UNKNOWN):
'''
@@ -86,21 +111,39 @@ class LogManager(object):
If the object provided do not accepts associated loggin, it simply ignores the request
'''
from uds.models import UserService
if type(level) is not int:
level = log.logLevelFromStr(level)
if type(wichObject) is UserService:
self.__logUserService(wichObject, level, message, source)
owner_type = transDict.get(type(wichObject), None)
if owner_type is not None:
self.__log(owner_type, wichObject.id, level, message, source)
else:
logger.debug('Requested doLog for a type of object not covered: {0}'.format(wichObject))
def getLogs(self, wichObject, limit = GlobalConfig.MAX_LOGS_PER_ELEMENT.getInt()):
from uds.models import UserService
'''
Get the logs associated with "wichObject", limiting to "limit" (default is GlobalConfig.MAX_LOGS_PER_ELEMENT)
'''
if type(wichObject) is UserService:
return self.__getUserServiceLogs(wichObject, limit)
owner_type = transDict.get(type(wichObject), None)
if owner_type is not None:
return self.__getLogs(owner_type, wichObject.id, limit)
else:
logger.debug('Requested getLogs for a type of object not covered: {0}'.format(wichObject))
return []
def clearLogs(self, wichObject):
'''
Clears all logs related to wichObject
Used mainly at object database removal (parent object)
'''
owner_type = transDict.get(type(wichObject), None)
if owner_type is not None:
self.__clearLogs(owner_type, wichObject.id)
else:
logger.debug('Requested clearLogs for a type of object not covered: {0}'.format(wichObject))