[Risolto][Python]salvare i traceback in file con nomi diversi

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
Lapa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 384
Iscrizione: mercoledì 30 dicembre 2009, 17:01

[Risolto][Python]salvare i traceback in file con nomi diversi

Messaggio da Lapa »

Salve a tutti,
ho il seguente problema ho creato uno script che crontab lancia ogni 15 minuti.
Nel file controlla l'ora e quando sono l'una di notte attiva una parte dello script che altrimenti non viene attivata.
Tale parte del programma non viene eseguita completamente probabilmente perché c'è un errore nel codice.
ho due domande:
1) Per capire di che errore si tratta mi piacerebbe che il traceback venisse salvato in un file .txt in modo da poterlo analizzare
2) per fare questo bisognerebbe salvare tutti i traceback con nome file diversi visto che il programma viene lanciato ogni 15 minuti e solo quello dell'1 di notte non funziona del tutto.

P. S. ho provato a lanciare il programma indipendentemente dal'orario e funziona, solo all'una di notte non funziona.

Forse ho spiegato il problema in maniera confusa ma spero di essermi fatto capire ugualmente.

Grazie dell'aiuto

Saluti LaPa
Ultima modifica di Lapa il lunedì 26 aprile 2021, 22:39, modificato 1 volta in totale.
Eterno imbranato su Ubuntu Linux e .... in tantissime altre cose :D
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python]salvare i traceback in file con nomi diversi

Messaggio da nuzzopippo »

Riguardo al "ricavare" il traceback dettagliato, segnalo questa interessante discussione su stack overflow.
Riguardo al "file", potresti fare qualcosa del genere :

Codice: Seleziona tutto

>>> import datetime
>>> try:
	a = 100
	b = 0
	result = a / b
except Exception as e:
	ora = datetime.datetime.now()
	f_name = ora.strftime('%Y_%m_%d-%H_%M') + 'report.log'
	print(f_name)
	msg = repr(e)
	try:
		with open(f_name, 'w') as f:
			f.write(msg)
	except:
		print('Errore scrittura log')

		
2021_04_15-13_36report.log
37
>>> 
Ti produrrebbe

Codice: Seleziona tutto

NzP:~$ cat 2021_04_15-13_36report.log
ZeroDivisionError('division by zero')NzP:~$ 
Ciao
Fatti non foste a viver come bruti ...
Avatar utente
Lapa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 384
Iscrizione: mercoledì 30 dicembre 2009, 17:01

Re: [Python]salvare i traceback in file con nomi diversi

Messaggio da Lapa »

Nuzzo,
Grazie per il link, lo leggerò con calma.
se non ho capito male devo mettere tutto il codice (sono un migliaio di righe) tra
try: e except Exception as e:

e giustamente creare dei file con il contenuto del traceback nominato prefisso+data e ora, quindi tutti diversi.

Ci provo

Grazie
Saluti

LaPa
Eterno imbranato su Ubuntu Linux e .... in tantissime altre cose :D
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python]salvare i traceback in file con nomi diversi

Messaggio da nuzzopippo »

Tutto?

Non conosco il Tuo codice ma certamente la maggior parte dei processi saranno banali e non avranno bisogno di traceback "propri", a meno Tu non voglia intercettare eventuali errori nel codice.

Personalmente, all'avvio della sessione definirei il file di log e farei il trace nei punti "notevoli" o dubbi, appendendo i logs degli eventuali errori occorsi, magari aggiungendovi data ed ora.

Comunque, poi, dipende da ciò che a Te serve davvero.
Fatti non foste a viver come bruti ...
Avatar utente
Lapa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 384
Iscrizione: mercoledì 30 dicembre 2009, 17:01

Re: [Python]salvare i traceback in file con nomi diversi

Messaggio da Lapa »

Caro Pippo,
mi ha fornito 2 file alle 8 e alle 8 e 30 di stamane in cui viene riportato il seguente errore:
"TimeoutError(110, 'Connection timed out')"
e sono giuste segnalazioni in quanto in entrambe le ore non ha aggiornato i dati on line.
ma non mi riporta la linea dove è avvenuto l'errore

inoltre l'errore all'una di notte c'è stato ma non ho nessun file.

Sono sicuro di non avere usato la terminologia giusta.

Uso Thonny se eseguo il mio script con Thonny in shell mi fa vedere il risultato e in caso di errori, in rosso, gli eventuali errori di codice quelle famose frasi che iniziano con "Traceback (most recent call last)" e che ti indicano la riga dove c'è l'errore.
Vorrei salvare tutto il contenuto della shell in un file.
In modo da esplorarli tutti con calma per verificarne gli errori e le righe dove questi sono.

Un'ulteriore domanda: sarebbe possibile che tutti i file .log fossero posizionati in una specifica cartella?

Grazie

Saluti

LaPa
Eterno imbranato su Ubuntu Linux e .... in tantissime altre cose :D
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python]salvare i traceback in file con nomi diversi

Messaggio da nuzzopippo »

Lapa ha scritto:
venerdì 16 aprile 2021, 15:31
....ma non mi riporta la linea dove è avvenuto l'errore
...
Un'ulteriore domanda: sarebbe possibile che tutti i file .log fossero posizionati in una specifica cartella?
Prima l'ulteriore domanda, probabilmente user più esperti Ti daranno migliori indicazioni, personalmente utilizzo due distinti metodi per definire direttrici di servizio ad una mia applicazione :

1° - (lo applico al solo mondo linux) mi rilevo la Home utente e li creo una directory nascosta della applicazione (di norma ".nomeapplicazione") ed all'interno di questa creo le directory per risorse locali, impostazioni e logs.
Tale metodo lo uso per applicazioni risiedenti su di una macchina.

2° - individuo la directory in cui risiede l'applicazione (utilizzo questo metodo da me escogitato, probabilmente c'è di meglio in giro) e li mi creo le sub-directory occorrenti.
Questo metodo lo uso per applicazioni che mi porto in giro su chiavetta/HD portatili, normalmente in fase di sviluppo.

Tieni presente che nel mondo windows esistono varie directory pre-definite (purtroppo così non è per Linux) e sarebbe bene usare quelle ... ovviamente cambiano tra le varie versioni windows :lol: reperire la docs relativa nel caso.

Per il primo punto, la "linea", non me ne sono mai interessato, in genere cerco di risolvere gli errori all'interno del mio codice, comunque san google aiuta e python mette a disposizione un'ottima libreria sotto tale aspetto : "traceback"

Ho voluto testare, mutuando ed adattando il primo esempio della docs, tutto sommato può essere utile per debug di codice complesso, ho creato questo script :

Codice: Seleziona tutto

#!/usr/bin/env python3

import os
import sys
import traceback
import datetime

def run_user_code(env_app, f_log):
    source = input('>>> ')
    try:
        exec(source, env_app)
    except Exception:
        ora = datetime.datetime.now()
        message = ora.strftime('%Y/%m/%d %H:%M:%S')
        message += ' - Exception in user code:\n' + '-'*60 +'\n'
        f = open(f_log, 'a')
        f.write(message)
        traceback.print_exc(file=f)
        message = '\n' + '-'*60 + '\n'
        f.write(message)
        f.close()


if __name__ == '__main__':
    # preparazione environment per i logs
    app_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
    log_dir = os.path.join(app_dir, 'logs')
    if not os.path.exists(log_dir) or not os.path.isdir(log_dir):
        os.mkdir(log_dir)
    ora = datetime.datetime.now()
    f_name = ora.strftime('%Y_%m_%d-%H_%M') + 'report.log'
    f_log = os.path.join(log_dir, f_name)
    env_app = {}
    # esecuzione processi
    while True:
        run_user_code(env_app, f_log)
dato i permessi di esecuzione e testato nella sessione che segue :

Codice: Seleziona tutto

nuzzo@nuzzo-bax:~/src/posts/la_pa$ tree
.
└── lapa_example.py

0 directories, 1 file
nuzzo@nuzzo-bax:~/src/posts/la_pa$ ./lapa_example.py
>>> print('nuzzopippo saluta Lapa')
nuzzopippo saluta Lapa
>>> print('a : b = %.2f' % (10 / 0))
>>> print 'nuzzopippo saluta Lapa'
>>> print('a : b = %.2f' % (10 / 3))
a : b = 3.33
>>> exit()
nuzzo@nuzzo-bax:~/src/posts/la_pa$ tree
.
├── lapa_example.py
└── logs
    └── 2021_04_17-09_17report.log

1 directory, 2 files
nuzzo@nuzzo-bax:~/src/posts/la_pa$ cat logs/2021_04_17-09_11report.log
cat: logs/2021_04_17-09_11report.log: File o directory non esistente
nuzzo@nuzzo-bax:~/src/posts/la_pa$ cat logs/2021_04_17-09_17report.log
2021/04/17 09:18:16 - Exception in user code:
------------------------------------------------------------
Traceback (most recent call last):
  File "./lapa_example.py", line 11, in run_user_code
    exec(source, env_app)
  File "<string>", line 1, in <module>
ZeroDivisionError: division by zero

------------------------------------------------------------
2021/04/17 09:18:40 - Exception in user code:
------------------------------------------------------------
Traceback (most recent call last):
  File "./lapa_example.py", line 11, in run_user_code
    exec(source, env_app)
  File "<string>", line 1
    print 'nuzzopippo saluta Lapa'
          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('nuzzopippo saluta Lapa')?

------------------------------------------------------------
nuzzo@nuzzo-bax:~/src/posts/la_pa$ 
Il discorso è certo da approfondire ma mi sembra soddisfi pienamente il quesito da Te posto.

Spero Ti sia sufficiente. Ciao :ciao:
Fatti non foste a viver come bruti ...
Avatar utente
Lapa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 384
Iscrizione: mercoledì 30 dicembre 2009, 17:01

Re: [Python]salvare i traceback in file con nomi diversi

Messaggio da Lapa »

Ciao NuzzoPippo,
grazie moltissimo per le tue informazioni, il tuo ragionamento e il tuo codice è un po' troppo complesso per il mio livello.

non riesco a capire alcuni passaggi e ad utilizzarlo :(

Comunque avere applicato il codice del tuo primo messaggio all'intero mio script ha messo in luce diversi punti critici.

Per quanto riguarda a capire in che linea mi segnala l'errore avevo pensato di fare in questa maniera: applicherò il tuo codice solo ai punti critici indicando nel prefisso del nome del file .log le righe in modo che il file log avrà un nome del tipo "2021_04_16-08_02reportRigaDa861a867.log"

Almeno un problema lo avrò risolto

Saluti

LaPa
Eterno imbranato su Ubuntu Linux e .... in tantissime altre cose :D
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python]salvare i traceback in file con nomi diversi

Messaggio da nuzzopippo »

In realtà non dovrebbero esserci molte differenze, nella versione che Ti ha funzionato con quanto nel mio primo post, importi traceback poi nel punto in cui registri l'eccezione apri il file di log, mettiamo sia "f"), definisci un dizionario vuoto quale environment della applicazione (diciamo env_app, come nel secondo esempio) e dai

Codice: Seleziona tutto

traceback.print_exc(file=f)
penso dovrebbe funzionare

Provaci, non dovrebbe essere difficile
Fatti non foste a viver come bruti ...
Avatar utente
Lapa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 384
Iscrizione: mercoledì 30 dicembre 2009, 17:01

Re: [Python]salvare i traceback in file con nomi diversi

Messaggio da Lapa »

Ciao a tutti,

alla fine ho provato questo e sembra funzionare.

lo provo ancora per capire tutti gli errori.

Codice: Seleziona tutto

import traceback
from datetime import datetime
try:
    #qui inserisci tutto il codice da provare
    
  
#da qui in poi  scrive il traceback compreso linea dell'errore in un file che verrà nominato ora,min,sec+errorInfo 
#depositato in una specifica cartella
except:
    ora=datetime.now()
    ora=ora.strftime("%H:%M:%S")
    print (ora)
    filename=ora+"errorInfo.txt"
    print(filename)
    #e lo inserisce in una specifica cartella "errori"
    errorFile=open ('/home/pasquale/Documenti/PythonEsercizi/EccezioniDebug/errori/'+str(filename) ,'w')
    errorFile.write(traceback.format_exc())
    errorFile.close()
    print('Le informazioni di traceback sono state scritte nel file ',filename)
Grazie ancora

Saluti
LaPa
Eterno imbranato su Ubuntu Linux e .... in tantissime altre cose :D
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Python]salvare i traceback in file con nomi diversi

Messaggio da vaeVictis »

Ciao.
Quando costruisci path dei file (o di altro), anche se sono stringhe ti conviene usare il metodo join del modulo os.path. In questo modo hai anche una (certa) portabilità, oltre a tutto il resto
Esempio qui:

https://stackoverflow.com/questions/713 ... -in-python
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
Lapa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 384
Iscrizione: mercoledì 30 dicembre 2009, 17:01

Re: [Python]salvare i traceback in file con nomi diversi

Messaggio da Lapa »

vaeVictis ha scritto:
lunedì 19 aprile 2021, 3:46
Ciao.
Quando costruisci path dei file (o di altro), anche se sono stringhe ti conviene usare il metodo join del modulo os.path. In questo modo hai anche una (certa) portabilità, oltre a tutto il resto
Esempio qui:

https://stackoverflow.com/questions/713 ... -in-python
Grazie!

Faccio tesoro
Eterno imbranato su Ubuntu Linux e .... in tantissime altre cose :D
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 19 ospiti