diff --git a/.env b/.env index 4d94bed..49f3858 100644 --- a/.env +++ b/.env @@ -1 +1,5 @@ -LOG_LEVEL=DEBUG \ No newline at end of file +LOG_NAME=logtest +LOG_LEVEL=WARNING +LOG_PATTERN='[%(asctime)s] %(levelname)s in %(filename)s:%(lineno)d: %(message)s' +LOG_FORMAT=json +LOG_EXTRA='cause,ansia' \ No newline at end of file diff --git a/README.md b/README.md index e69de29..5ae75fc 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,103 @@ +Enne2: @workspace questa è una applicazione per testare una libreria per standardizzare la generaziine di log.Scrivi un reade.md + +Workspace: Ecco un esempio di [`README.md`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2Fhome%2Fenne2%2FDevelopment%2Floggertest%2FREADME.md%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%2C%228a21fabb-9260-4ac3-8053-b1cf9b41c10a%22%5D "/home/enne2/Development/loggertest/README.md") per la tua applicazione: + +```markdown +# Logger Test Application + +Questa applicazione è progettata per testare una libreria che standardizza la generazione di log. Utilizza un formato di log configurabile tramite variabili d'ambiente e supporta sia formati leggibili che JSON. + +## Struttura del Progetto + +``` +. +├── __pycache__/ +├── .env +├── .gitignore +├── lib/ +│ ├── __init__.py +│ ├── __pycache__/ +│ └── log.py +├── main.py +├── more.py +└── README.md +``` + +## Configurazione + +Le configurazioni per il logger sono definite nel file [`.env`]. Ecco un esempio di configurazione: + +```properties +LOG_NAME=logtest +LOG_LEVEL=WARNING +LOG_PATTERN='[%(asctime)s] %(levelname)s in %(filename)s:%(lineno)d: %(message)s' +LOG_FORMAT=json +LOG_EXTRA='cause,ansia' +``` + +- **LOG_NAME**: Nome del logger. +- **LOG_LEVEL**: Livello di log (DEBUG, INFO, WARNING, ERROR, CRITICAL). +- **LOG_PATTERN**: Pattern per il formato leggibile. +- **LOG_FORMAT**: Formato del log [`json`] o [`human`]. +- **LOG_EXTRA**: Campi extra da includere nei log. + +## Utilizzo + +### Esecuzione del Programma + +Per eseguire il programma, assicurati di avere Python installato e di aver configurato il file [`.env`]. Poi esegui: + +```sh +python main.py +``` + +### Esempio di Output + +A seconda della configurazione, l'output dei log sarà in formato leggibile o JSON. Ecco un esempio di output in formato JSON: + +```json +{ + "name": "logtest", + "msg": "Questo è un messaggio di errore", + "levelname": "ERROR", + "levelno": 40, + "pathname": "main.py", + "filename": "main.py", + "module": "main", + "lineno": 10, + "funcName": "", + "created": 1633024800.0, + "msecs": 123.456, + "relativeCreated": 1234.567, + "thread": 12345, + "threadName": "MainThread", + "processName": "MainProcess", + "process": 1234, + "hostname": "hostname", + "pid": 1234, + "cause": "non so", + "ansia": "molta" +} +``` + +## Codice + +### [`lib/log.py`] + +Questo file contiene la configurazione del logger e la definizione del formatter JSON. + +### [`main.py`] + +Questo file contiene il punto di ingresso principale dell'applicazione e alcuni esempi di log. + +### [`more.py`] +Questo file contiene ulteriori operazioni di log e una classe di esempio che utilizza il logger. + +## Contributi + +Se desideri contribuire a questo progetto, sentiti libero di aprire una pull request o di segnalare problemi tramite il sistema di issue di GitHub. + +## Licenza + +Questo progetto è rilasciato sotto la licenza MIT. Vedi il file LICENSE per maggiori dettagli. +``` diff --git a/lib/log.py b/lib/log.py index dd98c27..5288c1a 100644 --- a/lib/log.py +++ b/lib/log.py @@ -2,40 +2,57 @@ import logging import os import json import socket +import sys + +LOG_LEVEL = os.getenv('LOG_LEVEL', 'DEBUG') +LOG_FORMAT = os.getenv('LOG_FORMAT', 'human') +LOG_PATTERN = os.getenv('LOG_PATTERN', '%(asctime)s - %(levelname)s - %(message)s') +LOG_EXTRA = os.getenv('LOG_EXTRA', '').split(',') class JsonFormatter(logging.Formatter): def format(self, record): log_record = { - 'timestamp': self.formatTime(record, self.datefmt), - 'level': record.levelname, - 'message': record.getMessage(), 'name': record.name, + 'msg': record.getMessage(), + 'levelname': record.levelname, + 'levelno': record.levelno, + 'pathname': record.pathname, 'filename': record.filename, - 'funcName': record.funcName, + 'module': record.module, 'lineno': record.lineno, - 'pathname': record.pathname, - 'hostname': socket.gethostname() + 'funcName': record.funcName, + 'created': record.created, + 'msecs': record.msecs, + 'relativeCreated': record.relativeCreated, + 'thread': record.thread, + 'threadName': record.threadName, + 'processName': record.processName, + 'process': record.process, + 'hostname': socket.gethostname(), + 'pid': record.process } - # Merging additional fields from record - if hasattr(record, 'extra'): - log_record.update(record.extra) + for extra in LOG_EXTRA: + log_record[extra] = getattr(record, extra, None) return json.dumps(log_record) -def setup_logger(name): - logger = logging.getLogger(name) - logger.setLevel(os.getenv('LOG_LEVEL', logging.INFO)) +# Configurazione del logger +logger = logging.getLogger('logtest') +logger.setLevel(LOG_LEVEL) - # Console Handler - console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) - - # Formatter - formatter = JsonFormatter() - console_handler.setFormatter(formatter) +# Handler per log in formato JSON +json_handler = logging.StreamHandler(sys.stdout) +json_handler.setFormatter(JsonFormatter()) - # Adding handler to the logger - if not logger.hasHandlers(): - logger.addHandler(console_handler) +# Handler per log leggibile +human_readable_handler = logging.StreamHandler(sys.stdout) +human_formatter = logging.Formatter( + LOG_PATTERN +) +human_readable_handler.setFormatter(human_formatter) - return logger +# Aggiungere gli handler al logger +if LOG_FORMAT == 'json': + logger.addHandler(json_handler) +else: + logger.addHandler(human_readable_handler) \ No newline at end of file diff --git a/main.py b/main.py index 310bd45..56d18ac 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,6 @@ -from lib import log +from lib.log import logger from more import more_operations, More -# Utilizzo del logger -logger = log.setup_logger(__name__) + logger.debug('Questo è un messaggio di debug') logger.info('Questo è un messaggio informativo') diff --git a/more.py b/more.py index 25b6b22..bc39e28 100644 --- a/more.py +++ b/more.py @@ -1,7 +1,4 @@ -from lib import log - -# Utilizzo del logger -logger = log.setup_logger(__name__) +from lib.log import logger def more_operations(): logger.debug('Questo è un messaggio di debug')