From a38d77735a01a34b1afa8ce1928b6629f45af9da Mon Sep 17 00:00:00 2001 From: Macartur Sousa Date: Wed, 26 Apr 2017 12:05:27 -0300 Subject: [PATCH] Improving logs Set logging configuration using etc/kytos/logging.ini Fixed syslog Fix #315 --- etc/kytos/logging.ini | 50 ++++++++++++++++++++-------------------- kytos/core/controller.py | 4 +--- kytos/core/logs.py | 46 +++++++++++++++++++++++------------- 3 files changed, 56 insertions(+), 44 deletions(-) diff --git a/etc/kytos/logging.ini b/etc/kytos/logging.ini index 31d0a8665..984ab1492 100644 --- a/etc/kytos/logging.ini +++ b/etc/kytos/logging.ini @@ -1,38 +1,38 @@ [formatters] -keys: precise,brief - +keys: console,syslog + [handlers] keys: console,syslog - + [loggers] -keys: root,daemon,cli - -[formatter_brief] -format: %(name)s:%(levelname)s: %(message)s - -[formatter_precise] +keys: root,api_server,socket + +[formatter_syslog] format: %(name)s:%(levelname)s %(module)s:%(lineno)d: %(message)s - + +[formatter_console] +format: %(asctime)s - %(levelname)s [%(name)s] (%(threadName)s) %(message)s + [handler_console] class: StreamHandler -args: [] -formatter: brief - +args:[sys.stdout] +formatter: console + [handler_syslog] class: handlers.SysLogHandler -args: [('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER] -formatter: precise - +args: ['/dev/log'] +formatter: syslog + [logger_root] level: INFO -handlers: syslog +handlers: syslog,console -[logger_daemon] +[logger_api_server] level: INFO -qualname: kytos.daemon -handlers: syslog - -[logger_cli] -level: INFO -qualname: kytos.cli -handlers: console +qualname: werkzeug +handlers: + +[logger_socket] +level: ERROR +qualname: engineio +handlers: diff --git a/kytos/core/controller.py b/kytos/core/controller.py index e018e56ba..674cd9a13 100644 --- a/kytos/core/controller.py +++ b/kytos/core/controller.py @@ -110,9 +110,7 @@ def register_websockets(self): def enable_logs(self): """Method used to register kytos log and enable the logs.""" - if self.options.debug: - LogManager.add_syslog() - + LogManager.load_logging_file(self.options.logging) self.log = logging.getLogger(__name__) def start(self): diff --git a/kytos/core/logs.py b/kytos/core/logs.py index fe606c8b8..0821c7dc2 100644 --- a/kytos/core/logs.py +++ b/kytos/core/logs.py @@ -1,24 +1,27 @@ """Handle logs displayed by Kytos SDN Platform.""" import inspect -import logging -import logging.handlers import re +from configparser import RawConfigParser +from logging import Formatter, StreamHandler, config, getLogger __all__ = ('LogManager', 'NAppLog') -FORMAT = '%(asctime)s - %(levelname)s [%(name)s] (%(threadName)s) %(message)s' -logging.basicConfig(format=FORMAT, level=logging.INFO) - class LogManager: """Manage handlers for all loggers.""" + configuration = None + @classmethod - def add_syslog(cls): - """Output all logs to syslog.""" - handler = logging.handlers.SysLogHandler(address='/dev/log') - cls._add_handler(handler) - return handler + def load_logging_file(cls, logging_file): + """Loadding logs configuration from a file. + + Args: + logging_file(str): Address of logging configuration file. + """ + cls.configuration = RawConfigParser() + cls.configuration.read(logging_file) + config.fileConfig(logging_file) @classmethod def add_stream_handler(cls, stream): @@ -27,14 +30,25 @@ def add_stream_handler(cls, stream): Args: stream: Object that supports ``write()`` and ``flush()``. """ - handler = logging.StreamHandler(stream) + handler = StreamHandler(stream) cls._add_handler(handler) return handler - @staticmethod - def _add_handler(handler): - handler.setFormatter(logging.Formatter(FORMAT)) - logging.getLogger().addHandler(handler) + @classmethod + def _add_handler(cls, handler): + """Method used to add a new handler to loggers. + + Args: + handler(Handler): Handle to be added. + """ + options = {} + if cls.configuration: + options = dict(cls.configuration.items('formatter_console')) + + fmt = Formatter(options.get('format', None), + options.get('datefmt', None)) + handler.setFormatter(fmt) + getLogger().addHandler(handler) class NAppLog: @@ -56,7 +70,7 @@ class NAppLog: def __getattribute__(self, name): """Detect NApp ID and use its logger.""" napp_id = detect_napp_id() - logger = logging.getLogger(napp_id) + logger = getLogger(napp_id) return logger.__getattribute__(name)