#1065 Use logging module instead of syslog

We can't use syslog if we want to execute ogClient in the Windows
platform.

Use the native logging library so we can attach different handlers
depending on the mode ogClient is executing.

Logging configuration is done via a python dict. There is a different
dict for linux and windows. These dicts define the configuration of the
root logger, handlers and formatters used.

As of now, it is only expected to use the root logger for everything
logging related. The root logger is obtained via:

	LOGGER = logging.getLogger()

More info about handlers, formatters and loggers:
	https://docs.python.org/3/howto/logging.html

Logging configuration is done at startup, just after parsing the json
(knowing ogclient mode). If json parsing goes bad, ogclient will only
print a message to stdout.
more_events
Jose M. Guisado 2021-11-18 10:29:46 +01:00
parent fd1f01d76b
commit 3dfe54968b
3 changed files with 88 additions and 14 deletions

View File

@ -18,6 +18,7 @@ except ImportError:
from src.ogClient import *
from src.log import configure_logging
def main():
@ -36,6 +37,8 @@ def main():
if MODE != 'windows':
signal.signal(SIGPIPE, SIG_DFL)
configure_logging(MODE)
client = ogClient(config=CONFIG)
client.connect()
client.run()

72
src/log.py 100644
View File

@ -0,0 +1,72 @@
import logging
import logging.config
DEFAULT_LOGGING_LINUX = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'formatter.syslog': {
'()': 'logging.Formatter',
'format': 'ogClient: [{levelname}] - {message}',
'style': '{',
},
'formatter.console': {
'()': 'logging.Formatter',
'format': '[{levelname}] - {message}',
'style': '{',
},
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'formatter.console',
'stream': 'ext://sys.stdout',
},
'syslog': {
'level': 'DEBUG',
'class': 'logging.handlers.SysLogHandler',
'formatter': 'formatter.syslog',
'address': '/dev/log',
},
},
'loggers': {
'': {
'handlers': ['syslog', 'console'],
'level': 'DEBUG',
},
}
}
DEFAULT_LOGGING_WIN = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'formatter.console': {
'()': 'logging.Formatter',
'format': 'ogClient: [{levelname}] - {message}',
'style': '{',
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'formatter.console',
'stream': 'ext://sys.stdout',
},
},
'loggers': {
'': {
'handlers': ['console'],
'level': 'DEBUG',
},
}
}
def configure_logging(mode):
if mode == 'windows':
DEFAULT_LOGGING = DEFAULT_LOGGING_WIN
else:
DEFAULT_LOGGING = DEFAULT_LOGGING_LINUX
logging.config.dictConfig(DEFAULT_LOGGING)

View File

@ -16,9 +16,13 @@ import sys
import os
import signal
import syslog
import logging
from logging.handlers import SysLogHandler
from src.restRequest import *
LOGGER = logging.getLogger()
class ThreadState(Enum):
IDLE = 0
BUSY = 1
@ -55,11 +59,9 @@ class restResponse():
return self.msg
if response in {ogResponses.OK, ogResponses.IN_PROGRESS}:
syslog.syslog(syslog.LOG_INFO,
self.msg[:ogRest.LOG_LENGTH])
LOGGER.info(self.msg[:ogRest.LOG_LENGTH])
else:
syslog.syslog(syslog.LOG_ERR,
self.msg[:ogRest.LOG_LENGTH])
LOGGER.warn(self.msg[:ogRest.LOG_LENGTH])
self.msg += '\r\n'
@ -274,16 +276,15 @@ class ogRest():
method = request.get_method()
URI = request.get_uri()
syslog.syslog(syslog.LOG_DEBUG, f'{method}{URI[:ogRest.LOG_LENGTH]}')
LOGGER.debug('%s%s', method, URI[:ogRest.LOG_LENGTH])
if (not "stop" in URI and
not "reboot" in URI and
not "poweroff" in URI and
not "probe" in URI):
if self.state == ThreadState.BUSY:
syslog.syslog(syslog.LOG_ERR,
'Request has been received '
'while ogClient is busy')
LOGGER.warn('Request has been received '
'while ogClient is busy')
response = restResponse(ogResponses.SERVICE_UNAVAILABLE)
client.send(response.get())
return
@ -300,9 +301,8 @@ class ogRest():
elif "refresh" in URI:
self.process_refresh(client)
else:
syslog.syslog(syslog.LOG_ERR,
f'Unsupported request: '
f'{method[:ogRest.LOG_LENGTH]}')
LOGGER.warn('Unsupported request: %s',
{URI[:ogRest.LOG_LENGTH]})
response = restResponse(ogResponses.BAD_REQUEST)
client.send(response.get())
self.state = ThreadState.IDLE
@ -326,9 +326,8 @@ class ogRest():
elif ("image/create" in URI):
self.process_imagecreate(client, request)
else:
syslog.syslog(syslog.LOG_ERR,
f'Unsupported request: '
f'{method[:ogRest.LOG_LENGTH]}')
LOGGER.warn('Unsupported request: %s',
URI[:ogRest.LOG_LENGTH])
response = restResponse(ogResponses.BAD_REQUEST)
client.send(response.get())
self.state = ThreadState.IDLE