group-based-policy/gbpservice/nfp/core/log.py

118 lines
3.6 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from oslo_config import cfg as oslo_config
from oslo_log import log as oslo_logging
from oslo_utils import importutils
from gbpservice.nfp.core import context
import logging
import os
import sys
EVENT = 50
logging.addLevelName(EVENT, "EVENT")
CONF = oslo_config.CONF
if hasattr(sys, 'frozen'): # support for py2exe
_srcfile = "logging%s__init__%s" % (os.sep, __file__[-4:])
elif __file__[-4:].lower() in ['.pyc', '.pyo']:
_srcfile = __file__[:-4] + '.py'
else:
_srcfile = __file__
_srcfile = os.path.normcase(_srcfile)
def currentframe():
"""Return the frame object for the caller's stack frame."""
try:
raise Exception
except Exception:
return sys.exc_info()[2].tb_frame.f_back
if hasattr(sys, '_getframe'):
currentframe = lambda: sys._getframe(3)
class NfpLogAdapter(oslo_logging.KeywordArgumentAdapter):
def event(self, msg, *args, **kwargs):
self.log(EVENT, msg, *args, **kwargs)
class WrappedLogger(logging.Logger):
def __init__(self, name):
logging.Logger.__init__(self, name)
def findCaller(self):
"""
Find the stack frame of the caller so that we can note the source
file name, line number and function name.
"""
f = currentframe()
# On some versions of IronPython, currentframe() returns None if
# IronPython isn't run with -X:Frames.
if f is not None:
f = f.f_back
if f.f_back:
f = f.f_back
rv = "(unknown file)", 0, "(unknown function)"
while hasattr(f, "f_code"):
co = f.f_code
filename = os.path.normcase(co.co_filename)
if filename == _srcfile:
f = f.f_back
continue
rv = (co.co_filename, f.f_lineno, co.co_name)
break
return rv
def _get_nfp_msg(self, msg):
nfp_context = context.get()
log_context = nfp_context['log_context']
if log_context:
ctxt = "[%s] [NFI:%s] [NFD:%s]" % (log_context.get(
'meta_id', '-'),
log_context.get('nfi_id', '-'),
log_context.get('nfd_id', '-'))
msg = "%s %s" % (ctxt, msg)
component = ''
if hasattr(CONF, 'module'):
component = CONF.module
msg = "[%s] %s" % (component, msg)
return msg
def makeRecord(self, name, level, fn,
lno, msg, args, exc_info, func=None, extra=None):
# Prefix log meta id with every log if project is 'nfp'
if extra and extra.get('project') == 'nfp':
msg = self._get_nfp_msg(msg)
return super(WrappedLogger, self).makeRecord(
name, level, fn, lno, msg,
args, exc_info, func=func, extra=extra)
def init_logger(logger_class):
logging.setLoggerClass(importutils.import_class(logger_class))
def getLogger(name, **kwargs):
kwargs.update(project='nfp')
logger = NfpLogAdapter(logging.getLogger(name),
kwargs)
return logger