From: Thierry Parmentelat Date: Tue, 28 Sep 2010 16:07:13 +0000 (+0200) Subject: improve server-side logging of exceptions X-Git-Tag: sfa-1.0-1~17 X-Git-Url: http://git.onelab.eu/?p=sfa.git;a=commitdiff_plain;h=04ee37a509b179c89d2584458bbe0d69db5b7c9c improve server-side logging of exceptions --- diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index ffc2dc5c..f3b84906 100755 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -300,9 +300,6 @@ class Sfi: if errors: sys.exit(1) - if self.options.verbose : - print "Contacting Slice Manager at:", sm_url - print "Contacting Registry at:", reg_url # Get key and certificate key_file = self.get_key_file() @@ -312,7 +309,9 @@ class Sfi: self.cert_file = cert_file self.cert = Certificate(filename=cert_file) # Establish connection to server(s) + if self.options.verbose : print "Contacting Registry at:", reg_url self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file, self.options.debug) + if self.options.verbose : print "Contacting Slice Manager at:", sm_url self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file, self.options.debug) return diff --git a/sfa/methods/CreateSliver.py b/sfa/methods/CreateSliver.py index d2654b2c..7c7a00ec 100644 --- a/sfa/methods/CreateSliver.py +++ b/sfa/methods/CreateSliver.py @@ -5,7 +5,6 @@ from sfa.util.parameter import Parameter, Mixed from sfa.util.sfatablesRuntime import run_sfatables import sys from sfa.trust.credential import Credential -from sfa.util.sfalogging import logger class CreateSliver(Method): """ diff --git a/sfa/plc/api-dev.py b/sfa/plc/api-dev.py index 29b0cc80..724d8076 100644 --- a/sfa/plc/api-dev.py +++ b/sfa/plc/api-dev.py @@ -10,6 +10,8 @@ import os import traceback import string import xmlrpclib + +import sfa.util.sfalogging from sfa.trust.auth import Auth from sfa.util.config import * from sfa.util.faults import * @@ -20,7 +22,6 @@ from sfa.trust.certificate import * from sfa.util.namespace import * from sfa.util.api import * from sfa.util.nodemanager import NodeManager -from sfa.util.sfalogging import * from collections import defaultdict @@ -324,7 +325,7 @@ class SfaAPI(BaseAPI): self.hrn = self.config.SFA_INTERFACE_HRN self.time_format = "%Y-%m-%d %H:%M:%S" - self.logger=get_sfa_logger() + self.logger=sfa.util.sfalogging.logger def getPLCShell(self): self.plauth = {'Username': self.config.SFA_PLC_USER, diff --git a/sfa/plc/api.py b/sfa/plc/api.py index 800ac3fd..79555c45 100644 --- a/sfa/plc/api.py +++ b/sfa/plc/api.py @@ -10,6 +10,8 @@ import os import traceback import string import xmlrpclib + +import sfa.util.sfalogging import sfa.util.xmlrpcprotocol as xmlrpcprotocol from sfa.trust.auth import Auth from sfa.util.config import * @@ -21,7 +23,6 @@ from sfa.trust.certificate import * from sfa.util.namespace import * from sfa.util.api import * from sfa.util.nodemanager import NodeManager -from sfa.util.sfalogging import * try: from collections import defaultdict except: @@ -106,7 +107,7 @@ class SfaAPI(BaseAPI): self.hrn = self.config.SFA_INTERFACE_HRN self.time_format = "%Y-%m-%d %H:%M:%S" - self.logger=get_sfa_logger() + self.logger=sfa.util.sfalogging.logger def getPLCShell(self): self.plauth = {'Username': self.config.SFA_PLC_USER, diff --git a/sfa/trust/auth.py b/sfa/trust/auth.py index 88326396..d0d4abf4 100644 --- a/sfa/trust/auth.py +++ b/sfa/trust/auth.py @@ -6,6 +6,7 @@ # +#import sfa.util.sfalogging from sfa.trust.certificate import Keypair, Certificate from sfa.trust.credential import Credential from sfa.trust.trustedroot import TrustedRootList @@ -14,7 +15,6 @@ from sfa.trust.hierarchy import Hierarchy from sfa.util.config import * from sfa.util.namespace import * from sfa.util.sfaticket import * -from sfa.util.sfalogging import logger import sys class Auth: diff --git a/sfa/trust/certificate.py b/sfa/trust/certificate.py index fe7f291d..ca4858bb 100644 --- a/sfa/trust/certificate.py +++ b/sfa/trust/certificate.py @@ -42,11 +42,13 @@ import os import tempfile import base64 import traceback +from tempfile import mkstemp + from OpenSSL import crypto import M2Crypto from M2Crypto import X509 -from tempfile import mkstemp -from sfa.util.sfalogging import logger + +import sfa.util.sfalogging from sfa.util.namespace import urn_to_hrn from sfa.util.faults import * @@ -583,12 +585,12 @@ class Certificate: # if this cert is signed by a trusted_cert, then we are set for trusted_cert in trusted_certs: if self.is_signed_by_cert(trusted_cert): - logger.debug("Cert %s signed by trusted cert %s", self.get_subject(), trusted_cert.get_subject()) + sfa.util.sfalogging.logger.debug("Cert %s signed by trusted cert %s", self.get_subject(), trusted_cert.get_subject()) # verify expiration of trusted_cert ? if not trusted_cert.cert.has_expired(): return trusted_cert else: - logger.debug("Trusted cert %s is expired", trusted_cert.get_subject()) + sfa.util.sfalogging.logger.debug("Trusted cert %s is expired", trusted_cert.get_subject()) # if there is no parent, then no way to verify the chain if not self.parent: diff --git a/sfa/trust/credential.py b/sfa/trust/credential.py index 286894cb..6384afcc 100644 --- a/sfa/trust/credential.py +++ b/sfa/trust/credential.py @@ -31,16 +31,17 @@ import os import datetime -from xml.dom.minidom import Document, parseString from tempfile import mkstemp +from xml.dom.minidom import Document, parseString +from dateutil.parser import parse + +import sfa.util.sfalogging from sfa.trust.certificate import Keypair from sfa.trust.credential_legacy import CredentialLegacy from sfa.trust.rights import * from sfa.trust.gid import * from sfa.util.faults import * -from sfa.util.sfalogging import logger -from dateutil.parser import parse @@ -661,7 +662,7 @@ class Credential(object): trusted_cert_objects.append(GID(filename=f)) ok_trusted_certs.append(f) except Exception, exc: - logger.error("Failed to load trusted cert from %s: %r", f, exc) + sfa.util.sfalogging.logger.error("Failed to load trusted cert from %s: %r", f, exc) trusted_certs = ok_trusted_certs # Use legacy verification if this is a legacy credential @@ -744,7 +745,7 @@ class Credential(object): # Maybe should be (hrn, type) = urn_to_hrn(root_cred_signer.get_urn()) root_cred_signer_type = root_cred_signer.get_type() if (root_cred_signer_type == 'authority'): - #logger.debug('Cred signer is an authority') + #sfa.util.sfalogging.logger.debug('Cred signer is an authority') # signer is an authority, see if target is in authority's domain hrn = root_cred_signer.get_hrn() if root_target_gid.get_hrn().startswith(hrn): diff --git a/sfa/trust/credential_legacy.py b/sfa/trust/credential_legacy.py index c33ed6f3..dc02941d 100644 --- a/sfa/trust/credential_legacy.py +++ b/sfa/trust/credential_legacy.py @@ -14,7 +14,6 @@ from sfa.trust.certificate import Certificate from sfa.trust.rights import * from sfa.trust.gid import * from sfa.util.faults import * -from sfa.util.sfalogging import * ## # Credential is a tuple: diff --git a/sfa/trust/gid.py b/sfa/trust/gid.py index cda25fc3..678c1a3f 100644 --- a/sfa/trust/gid.py +++ b/sfa/trust/gid.py @@ -29,9 +29,10 @@ ### $URL$ import xmlrpclib import uuid + +import sfa.util.sfalogging from sfa.trust.certificate import Certificate from sfa.util.namespace import * -from sfa.util.sfalogging import logger ## # Create a new uuid. Returns the UUID as a string. @@ -81,7 +82,7 @@ class GID(Certificate): Certificate.__init__(self, create, subject, string, filename) if subject: - logger.debug("Creating GID for subject: %s" % subject) + sfa.util.sfalogging.logger.debug("Creating GID for subject: %s" % subject) if uuid: self.uuid = int(uuid) if hrn: diff --git a/sfa/util/api.py b/sfa/util/api.py index cda8c887..65ccc88b 100644 --- a/sfa/util/api.py +++ b/sfa/util/api.py @@ -11,6 +11,7 @@ import traceback import string import xmlrpclib +import sfa.util.sfalogging from sfa.trust.auth import Auth from sfa.util.config import * from sfa.util.faults import * @@ -18,7 +19,6 @@ from sfa.util.debug import * from sfa.trust.credential import * from sfa.trust.certificate import * from sfa.util.namespace import * -from sfa.util.sfalogging import * # See "2.2 Characters" in the XML specification: # @@ -148,7 +148,7 @@ class BaseAPI: self.credential = None self.source = None self.time_format = "%Y-%m-%d %H:%M:%S" - self.logger=get_sfa_logger() + self.logger=sfa.util.sfalogging.logger # load registries from sfa.server.registry import Registries diff --git a/sfa/util/method.py b/sfa/util/method.py index 473bcd17..484b77b3 100644 --- a/sfa/util/method.py +++ b/sfa/util/method.py @@ -14,10 +14,11 @@ import textwrap import xmlrpclib +import sfa.util.sfalogging from sfa.util.faults import * from sfa.util.parameter import Parameter, Mixed, python_type, xmlrpc_type from sfa.trust.auth import Auth -from sfa.util.debug import profile, log +#from sfa.util.debug import profile, log # we inherit object because we use new-style classes for legacy methods class Method (object): @@ -91,9 +92,10 @@ class Method (object): runtime = time.time() - start if self.api.config.SFA_API_DEBUG or hasattr(self, 'message'): + msg=getattr(self,'message',"method %s completed"%methodname) + sfa.util.sfalogging.logger.info(msg) # XX print to some log file # print >> log, "some output" - pass return result @@ -104,9 +106,9 @@ class Method (object): # Prepend caller and method name to expected faults fault.faultString = caller + ": " + self.name + ": " + fault.faultString runtime = time.time() - start - - if self.api.config.SFA_API_DEBUG: - traceback.print_exc() +# if self.api.config.SFA_API_DEBUG: +# traceback.print_exc() + sfa.util.sfalogging.log_exc("Method %s raised an exception"%self.name) raise fault diff --git a/sfa/util/server.py b/sfa/util/server.py index 93c3e814..505c7889 100644 --- a/sfa/util/server.py +++ b/sfa/util/server.py @@ -19,13 +19,14 @@ import SimpleHTTPServer import SimpleXMLRPCServer from OpenSSL import SSL from Queue import Queue + +#import sfa.util.sfalogging from sfa.trust.certificate import Keypair, Certificate from sfa.trust.credential import * from sfa.util.faults import * from sfa.plc.api import SfaAPI from sfa.util.cache import Cache -from sfa.util.debug import log -from sfa.util.sfalogging import logger +#from sfa.util.debug import log ## # Verification callback for pyOpenSSL. We do our own checking of keys because # we have our own authentication spec. Thus we disable several of the normal diff --git a/sfa/util/sfalogging.py b/sfa/util/sfalogging.py index 0e17ccba..006250c3 100644 --- a/sfa/util/sfalogging.py +++ b/sfa/util/sfalogging.py @@ -1,12 +1,14 @@ import logging import os +import traceback #SFA access log initialization TMPDIR = os.getenv("TMPDIR", "/tmp") SFA_HTTPD_ACCESS_LOGFILE = TMPDIR + "/" + 'sfa_httpd_access.log' SFA_ACCESS_LOGFILE='/var/log/sfa_access.log' logger=logging.getLogger() -logger.setLevel(logging.INFO) +#logger.setLevel(logging.INFO) +logger.setLevel(logging.DEBUG) try: logfile=logging.FileHandler(SFA_ACCESS_LOGFILE) @@ -15,8 +17,22 @@ except IOError: # owned by root, but httpd is trying to access it. logfile=logging.FileHandler(SFA_HTTPD_ACCESS_LOGFILE) -formatter = logging.Formatter("%(asctime)s - %(message)s") +formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") logfile.setFormatter(formatter) logger.addHandler(logfile) def get_sfa_logger(): return logger + +# logs an exception - use in an except statement +def log_exc(message): + logger.error("%s BEG TRACEBACK"%message+"\n"+traceback.format_exc().strip("\n")) + logger.error("%s END TRACEBACK"%message) + + +# for investigation purposes, can be placed anywhere +def log_stack(message): + to_log="".join(traceback.format_stack()) + logger.debug("%s BEG STACK"%message+"\n"+to_log) + logger.debug("%s END STACK"%message) + +