Browse Source

Refactor logging configuration and add log format options

master
Matteo Benedetto 1 year ago
parent
commit
e69b8c2ba9
  1. 6
      .env
  2. 103
      README.md
  3. 63
      lib/log.py
  4. 5
      main.py
  5. 5
      more.py

6
.env

@ -1 +1,5 @@
LOG_LEVEL=DEBUG 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'

103
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": "<module>",
"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.
```

63
lib/log.py

@ -2,40 +2,57 @@ import logging
import os import os
import json import json
import socket 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): class JsonFormatter(logging.Formatter):
def format(self, record): def format(self, record):
log_record = { log_record = {
'timestamp': self.formatTime(record, self.datefmt),
'level': record.levelname,
'message': record.getMessage(),
'name': record.name, 'name': record.name,
'msg': record.getMessage(),
'levelname': record.levelname,
'levelno': record.levelno,
'pathname': record.pathname,
'filename': record.filename, 'filename': record.filename,
'funcName': record.funcName, 'module': record.module,
'lineno': record.lineno, 'lineno': record.lineno,
'pathname': record.pathname, 'funcName': record.funcName,
'hostname': socket.gethostname() '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 for extra in LOG_EXTRA:
if hasattr(record, 'extra'): log_record[extra] = getattr(record, extra, None)
log_record.update(record.extra)
return json.dumps(log_record) return json.dumps(log_record)
def setup_logger(name): # Configurazione del logger
logger = logging.getLogger(name) logger = logging.getLogger('logtest')
logger.setLevel(os.getenv('LOG_LEVEL', logging.INFO)) logger.setLevel(LOG_LEVEL)
# Console Handler # Handler per log in formato JSON
console_handler = logging.StreamHandler() json_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.DEBUG) json_handler.setFormatter(JsonFormatter())
# Formatter
formatter = JsonFormatter()
console_handler.setFormatter(formatter)
# Adding handler to the logger # Handler per log leggibile
if not logger.hasHandlers(): human_readable_handler = logging.StreamHandler(sys.stdout)
logger.addHandler(console_handler) 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)

5
main.py

@ -1,7 +1,6 @@
from lib import log from lib.log import logger
from more import more_operations, More from more import more_operations, More
# Utilizzo del logger
logger = log.setup_logger(__name__)
logger.debug('Questo è un messaggio di debug') logger.debug('Questo è un messaggio di debug')
logger.info('Questo è un messaggio informativo') logger.info('Questo è un messaggio informativo')

5
more.py

@ -1,7 +1,4 @@
from lib import log from lib.log import logger
# Utilizzo del logger
logger = log.setup_logger(__name__)
def more_operations(): def more_operations():
logger.debug('Questo è un messaggio di debug') logger.debug('Questo è un messaggio di debug')

Loading…
Cancel
Save