[threading][logging] erreur de loggage dans un thread
Je débute avec les Thread et j'ai un souci avec la manipulation des threads et du module logging en même temps:
Pour mes test, j'ai défini une fonction toute simple qui affiche un nombre avec une boucle et je le logue en même temps dans un fichier
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| import threading as t
import logging
def a(n):
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s',
filename='./a.log',
filemode='a')
logger = logging.getLogger('alog')
for i in range(n):
print i
logger.log(10,str(i)) |
si je l'exécute bêtement
pas de problème, à l'écran, j'ai bien l'impression des nombres de 1 à 100 ainsi que dans mon fichier a.log
par contre, si je l'éxecute à partir d'un thread:
Code:
1 2
| c = t.Thread(name=None,target=a,kwargs={'n':100})
c.start() |
A la première exécution (avec compilation), je n'ai aucune erreur mais ensuite (donc sans compilation), j'ai l'erreur suivante qui apparaît après un certains nombres d'itérations dans le for (7, pourquoi 7 ?) quand il veut logger.
Citation:
Traceback (most recent call last):
File "C:\Python24\Lib\logging\__init__.py", line 735, in emit
self.stream.write(fs % msg)
ValueError: I/O operation on closed file
Dans mon fichier a.log, j'ai simplement les nombres de 0 à 6
Citation:
2005-10-10 15:05:37,765 DEBUG 0
2005-10-10 15:05:37,765 DEBUG 1
2005-10-10 15:05:37,765 DEBUG 2
2005-10-10 15:05:37,765 DEBUG 3
2005-10-10 15:05:37,765 DEBUG 4
2005-10-10 15:05:37,765 DEBUG 5
2005-10-10 15:05:37,765 DEBUG 6
Par contre, si à la fin de mon prog (juste après avoir lancé le c.start()), je rajoute:
Code:
1 2
| while c.isAlive():
continue |
je n'ai plus jamais d'erreur (mais c'était juste pour voir si ca pouvait venir que mon thread s'arrête alors qu'il n'a pas finit sa tâche)
Avez-vous une idée de comment puis-je remédier à mon problème ?