From f2f5e9c8a8be6970c2683045ef9993ba60a0d63b Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Wed, 15 Aug 2012 11:20:18 -0400 Subject: made logging to syslog configurable and default for all logging --- src/lib/Bcfg2/Client/Frame.py | 15 +++++---------- src/lib/Bcfg2/Client/Tools/APK.py | 4 ++-- src/lib/Bcfg2/Client/Tools/Action.py | 2 +- src/lib/Bcfg2/Client/Tools/__init__.py | 8 ++++---- src/lib/Bcfg2/Logger.py | 32 +++++++++++++++----------------- src/lib/Bcfg2/Options.py | 8 +++++++- src/lib/Bcfg2/Server/Admin/Query.py | 3 ++- src/lib/Bcfg2/Server/Core.py | 2 +- src/sbin/bcfg2 | 16 +++++++++++----- src/sbin/bcfg2-admin | 3 ++- src/sbin/bcfg2-info | 2 +- src/sbin/bcfg2-lint | 2 +- src/sbin/bcfg2-test | 2 +- 13 files changed, 53 insertions(+), 46 deletions(-) diff --git a/src/lib/Bcfg2/Client/Frame.py b/src/lib/Bcfg2/Client/Frame.py index bfdc90d38..a050464e2 100644 --- a/src/lib/Bcfg2/Client/Frame.py +++ b/src/lib/Bcfg2/Client/Frame.py @@ -133,7 +133,6 @@ class Frame: for entry in problems: self.logger.error("%s:%s:%s" % (entry.tag, entry.get('type'), entry.get('name'))) - self.logger.error("") self.find_dups(config) @@ -163,7 +162,6 @@ class Frame: self.logger.debug("The following entries are included multiple times:") for entry in multi: self.logger.debug(entry) - self.logger.debug("") def __getattr__(self, name): if name in ['extra', 'handled', 'modified', '__important__']: @@ -371,7 +369,6 @@ class Frame: if mbundles: self.logger.info("The Following Bundles have been modified:") self.logger.info([mbun.get('name') for mbun in mbundles]) - self.logger.info("") tbm = [(t, b) for t in self.tools for b in mbundles] for tool, bundle in tbm: try: @@ -414,10 +411,10 @@ class Frame: def CondDisplayState(self, phase): """Conditionally print tracing information.""" - self.logger.info('\nPhase: %s' % phase) - self.logger.info('Correct entries:\t%d' % + self.logger.info('Phase: %s' % phase) + self.logger.info('Correct entries: %d' % list(self.states.values()).count(True)) - self.logger.info('Incorrect entries:\t%d' % + self.logger.info('Incorrect entries: %d' % list(self.states.values()).count(False)) if phase == 'final' and list(self.states.values()).count(False): for entry in self.states.keys(): @@ -429,9 +426,9 @@ class Frame: else: self.logger.info(" %s:%s" % (entry.tag, entry.get('name'))) - self.logger.info('Total managed entries:\t%d' % + self.logger.info('Total managed entries: %d' % len(list(self.states.values()))) - self.logger.info('Unmanaged entries:\t%d' % len(self.extra)) + self.logger.info('Unmanaged entries: %d' % len(self.extra)) if phase == 'final' and self.setup['extra']: for entry in self.extra: etype = entry.get('type') @@ -442,8 +439,6 @@ class Frame: self.logger.info(" %s:%s" % (entry.tag, entry.get('name'))) - self.logger.info("") - if ((list(self.states.values()).count(False) == 0) and not self.extra): self.logger.info('All entries correct.') diff --git a/src/lib/Bcfg2/Client/Tools/APK.py b/src/lib/Bcfg2/Client/Tools/APK.py index aaaf2472f..d70916792 100644 --- a/src/lib/Bcfg2/Client/Tools/APK.py +++ b/src/lib/Bcfg2/Client/Tools/APK.py @@ -24,8 +24,8 @@ class APK(Bcfg2.Client.Tools.PkgTool): for pkg in zip(names, nameversions): pkgname = pkg[0] version = pkg[1][len(pkgname) + 1:] - self.logger.debug(" pkgname: %s\n version: %s" % - (pkgname, version)) + self.logger.debug(" pkgname: %s" % pkgname) + self.logger.debug(" version: %s" % version) self.installed[pkgname] = version def VerifyPackage(self, entry, modlist): diff --git a/src/lib/Bcfg2/Client/Tools/Action.py b/src/lib/Bcfg2/Client/Tools/Action.py index e13134e1f..52d4e6a3f 100644 --- a/src/lib/Bcfg2/Client/Tools/Action.py +++ b/src/lib/Bcfg2/Client/Tools/Action.py @@ -61,7 +61,7 @@ class Action(Bcfg2.Client.Tools.Tool): else: return rc == 0 else: - self.logger.debug("In dryrun mode: not running action:\n %s" % + self.logger.debug("In dryrun mode: not running action: %s" % (entry.get('name'))) return False diff --git a/src/lib/Bcfg2/Client/Tools/__init__.py b/src/lib/Bcfg2/Client/Tools/__init__.py index 1f191fce3..026c7ade0 100644 --- a/src/lib/Bcfg2/Client/Tools/__init__.py +++ b/src/lib/Bcfg2/Client/Tools/__init__.py @@ -209,10 +209,10 @@ class Tool(object): missing = self.missing_attrs(entry) if missing: - self.logger.error("Incomplete information for entry %s:%s; cannot install" \ - % (entry.tag, entry.get('name'))) - self.logger.error("\t... due to absence of %s attribute" % \ - (":".join(missing))) + self.logger.error("Incomplete information for entry %s:%s; cannot " + "install due to absence of attribute(s): %s" % + (entry.tag, entry.get('name'), + ", ".join(missing))) return False return True diff --git a/src/lib/Bcfg2/Logger.py b/src/lib/Bcfg2/Logger.py index 903209ac3..26c1d52f6 100644 --- a/src/lib/Bcfg2/Logger.py +++ b/src/lib/Bcfg2/Logger.py @@ -126,20 +126,15 @@ class FragmentingSysLogHandler(logging.handlers.SysLogHandler): """ pass - -def add_console_handler(level): +def add_console_handler(level=logging.DEBUG): """Add a logging handler that logs at a level to sys.stdout.""" console = logging.StreamHandler(sys.stdout) - if level is True: - console.setLevel(logging.DEBUG) - else: - console.setLevel(level) + console.setLevel(level) # tell the handler to use this format console.setFormatter(TermiosFormatter()) logging.root.addHandler(console) - -def add_syslog_handler(procname, syslog_facility): +def add_syslog_handler(procname, syslog_facility, level=logging.DEBUG): """Add a logging handler that logs as procname to syslog_facility.""" try: try: @@ -150,7 +145,7 @@ def add_syslog_handler(procname, syslog_facility): syslog = FragmentingSysLogHandler(procname, ('localhost', 514), syslog_facility) - syslog.setLevel(logging.DEBUG) + syslog.setLevel(level) syslog.setFormatter(logging.Formatter('%(name)s[%(process)d]: %(message)s')) logging.root.addHandler(syslog) except socket.error: @@ -158,15 +153,13 @@ def add_syslog_handler(procname, syslog_facility): except: print("Failed to activate syslogging") - -def add_file_handler(to_file): +def add_file_handler(to_file, level=logging.DEBUG): """Add a logging handler that logs to to_file.""" filelog = logging.FileHandler(to_file) - filelog.setLevel(logging.DEBUG) + filelog.setLevel(level) filelog.setFormatter(logging.Formatter('%(asctime)s %(name)s[%(process)d]: %(message)s')) logging.root.addHandler(filelog) - def setup_logging(procname, to_console=True, to_syslog=True, syslog_facility='daemon', level=0, to_file=None): """Setup logging for Bcfg2 software.""" @@ -174,11 +167,16 @@ def setup_logging(procname, to_console=True, to_syslog=True, return if to_console: - add_console_handler(to_console) + if to_console == True: + clvl = min(logging.WARNING, level) + else: + clvl = min(to_console, level) + add_console_handler(clvl) if to_syslog: - add_syslog_handler(procname, syslog_facility) + slvl = min(level, logging.INFO) + add_syslog_handler(procname, syslog_facility, level=slvl) if to_file is not None: - add_file_handler(to_file) + add_file_handler(to_file, level=level) - logging.root.setLevel(level) + logging.root.setLevel(logging.DEBUG) logging.already_setup = True diff --git a/src/lib/Bcfg2/Options.py b/src/lib/Bcfg2/Options.py index 320a219d3..4c6fb06d7 100644 --- a/src/lib/Bcfg2/Options.py +++ b/src/lib/Bcfg2/Options.py @@ -805,6 +805,11 @@ LOGGING_FILE_PATH = \ cmd='-o', odesc='', cf=('logging', 'path')) +LOGGING_SYSLOG = \ + Option('Log to syslog', + default=True, + cook=get_bool, + cf=('logging', 'syslog')) DEBUG = \ Option("Enable debugging output", default=False, @@ -871,7 +876,8 @@ CLI_COMMON_OPTIONS = dict(configfile=CFILE, help=HELP, verbose=VERBOSE, encoding=ENCODING, - logging=LOGGING_FILE_PATH) + logging=LOGGING_FILE_PATH, + syslog=LOGGING_SYSLOG) DAEMON_COMMON_OPTIONS = dict(daemon=DAEMON, listen_all=SERVER_LISTEN_ALL) diff --git a/src/lib/Bcfg2/Server/Admin/Query.py b/src/lib/Bcfg2/Server/Admin/Query.py index 6c4d3c4b6..f81ec41d2 100644 --- a/src/lib/Bcfg2/Server/Admin/Query.py +++ b/src/lib/Bcfg2/Server/Admin/Query.py @@ -22,7 +22,8 @@ class Query(Bcfg2.Server.Admin.MetadataCore): def __init__(self, setup): Bcfg2.Server.Admin.MetadataCore.__init__(self, setup) logging.root.setLevel(100) - Bcfg2.Logger.setup_logging(100, to_console=False, to_syslog=False) + Bcfg2.Logger.setup_logging(100, to_console=False, + to_syslog=setup['syslog']) def __call__(self, args): Bcfg2.Server.Admin.MetadataCore.__call__(self, args) diff --git a/src/lib/Bcfg2/Server/Core.py b/src/lib/Bcfg2/Server/Core.py index 660d2c3ef..f25542eae 100644 --- a/src/lib/Bcfg2/Server/Core.py +++ b/src/lib/Bcfg2/Server/Core.py @@ -64,7 +64,7 @@ class BaseCore(object): self.logger.setLevel(level) Bcfg2.Logger.setup_logging('bcfg2-server', to_console=True, - to_syslog=True, + to_syslog=setup['syslog'], to_file=setup['logging'], level=level) diff --git a/src/sbin/bcfg2 b/src/sbin/bcfg2 index 4c1514117..21de6a3fd 100755 --- a/src/sbin/bcfg2 +++ b/src/sbin/bcfg2 @@ -51,7 +51,7 @@ class Client: if self.setup['debug']: level = 0 Bcfg2.Logger.setup_logging('bcfg2', - to_syslog=False, + to_syslog=self.setup['syslog'], level=level, to_file=self.setup['logging']) self.logger = logging.getLogger('bcfg2') @@ -97,11 +97,13 @@ class Client: script.write(probe.text) script.close() os.close(scripthandle) - os.chmod(script.name, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | - stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH | - stat.S_IWUSR) # 0755 + os.chmod(script.name, + stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | + stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH | + stat.S_IWUSR) # 0755 ret.text = os.popen(script.name).read().strip() - self.logger.info("Probe %s has result:\n%s" % (name, ret.text)) + self.logger.info("Probe %s has result:" % name) + self.logger.info(ret.text) finally: os.unlink(script.name) except: @@ -121,6 +123,8 @@ class Client: # begin configuration times['start'] = time.time() + self.logger.info("Starting Bcfg2 client run at %s" % times['start']) + if self.setup['file']: # read config from file try: @@ -314,6 +318,8 @@ class Client: "%s" % err) raise SystemExit(2) + self.logger.info("Finished Bcfg2 client run at %s" % time.time()) + if __name__ == '__main__': signal.signal(signal.SIGINT, cb_sigint_handler) client = Client() diff --git a/src/sbin/bcfg2-admin b/src/sbin/bcfg2-admin index 9b28d9bd5..8790cadee 100755 --- a/src/sbin/bcfg2-admin +++ b/src/sbin/bcfg2-admin @@ -50,7 +50,8 @@ def main(): level = logging.INFO else: level = logging.WARNING - Bcfg2.Logger.setup_logging('bcfg2-admin', to_syslog=False, level=level) + Bcfg2.Logger.setup_logging('bcfg2-admin', to_syslog=setup['syslog'], + level=level) # Provide help if requested or no args were specified if (not setup['args'] or len(setup['args']) < 1 or diff --git a/src/sbin/bcfg2-info b/src/sbin/bcfg2-info index bba8eca7c..d8dd4a3c8 100755 --- a/src/sbin/bcfg2-info +++ b/src/sbin/bcfg2-info @@ -664,7 +664,6 @@ class infoCore(cmd.Cmd, Bcfg2.Server.Core.BaseCore): self.do_loop() if __name__ == '__main__': - Bcfg2.Logger.setup_logging('bcfg2-info', to_syslog=False) optinfo = dict(profile=Bcfg2.Options.CORE_PROFILE, mconnect=Bcfg2.Options.SERVER_MCONNECT, interactive=Bcfg2.Options.INTERACTIVE, @@ -678,6 +677,7 @@ if __name__ == '__main__': USAGE]) setup.parse(sys.argv[1:]) + Bcfg2.Logger.setup_logging('bcfg2-info', to_syslog=setup['syslog']) if setup['args'] and setup['args'][0] == 'help': print(setup.hm) sys.exit(0) diff --git a/src/sbin/bcfg2-lint b/src/sbin/bcfg2-lint index 8a5f55ae4..1038beca8 100755 --- a/src/sbin/bcfg2-lint +++ b/src/sbin/bcfg2-lint @@ -86,7 +86,7 @@ if __name__ == '__main__': setup = Bcfg2.Options.OptionParser(optinfo) setup.parse(sys.argv[1:]) - log_args = dict(to_syslog=False, to_console=logging.WARNING) + log_args = dict(to_syslog=setup['syslog'], to_console=logging.WARNING) if setup['verbose']: log_args['to_console'] = logging.DEBUG Bcfg2.Logger.setup_logging('bcfg2-info', **log_args) diff --git a/src/sbin/bcfg2-test b/src/sbin/bcfg2-test index 83d409944..8323eeb22 100755 --- a/src/sbin/bcfg2-test +++ b/src/sbin/bcfg2-test @@ -73,7 +73,7 @@ def main(): setup.parse(sys.argv[1:]) if setup['verbose']: - Bcfg2.Logger.setup_logging("bcfg2-test", to_syslog=False) + Bcfg2.Logger.setup_logging("bcfg2-test", to_syslog=setup['syslog']) core = Bcfg2.Server.Core.BaseCore(setup) -- cgit v1.2.3-1-g7c22