Seite 1 von 1

Änderung einer logger-Config durch den Config-Parser

Verfasst: Montag 10. März 2008, 16:36
von martin86_mu
Hi alle zusammen!
Ich benutze Python5.2.5 mit Eclipse. Nun zu meinem Problem: Ich möchte in meinem Programm eine Logging-Config-File einlesen, abändern und danach an den Logger übergeben. Nun habe ich eine Lösung gefunden, die jedoch nicht sehr ellegant ist, da ich die abgeänderte Config-File erst noch einmal in einer Datei zwischenspeichere und dann dem Logger übergebe. Mein Code (der funktioniert):

def readConfigFile(cfgFile):
global cfg
cfg = ConfigParser.ConfigParser()
cfg.read(cfgFile)
#Aenderung der Configfile per set( section, option, value)
cfg.set('handler_file_unittest','args',(('log/unittest'+time.strftime('%Y%m%d%H%M%S')+'.log'),'aw'))

#Aufruf der Methode readConfigFile
readConfigFile("logging.conf")

#Erzeugen einer neuen Config-Datei; Speichern der geaenderten Config in diese Datei
new_config_updated = file('temp.conf', 'w')
cfg.write(new_config_updated)
new_config_updated.close()

#Laden der geanderten Config Datei in den Logger
loggingConfFile = 'temp.conf'
loggingSection = 'unittest'
logging.config.fileConfig(loggingConfFile)
log = logging.getLogger(loggingSection)


Hat jemand vielleicht ne Idee wie ich das Zwischenspeichern umgehen kann? Ich habe schon viel probiert, vor allem da man ab Version 2x ja dank der readfp funktion des Config-Parsers dem Logger ausdrücklich auch ein File-Object übergeben kann, doch ich bin noch auf keinen grünen Zweig gekommen. Danke schon mal im voraus,

Gruß Martin

Verfasst: Montag 10. März 2008, 16:48
von Zap
Es gibt noch das Modul "StringIO" und dessen Klasse "StringIO". Ein Examplar von StringIO ist verwendbar wie ein File-Objekt sodass du dieses als Zwischenspeicher verwenden könntest.

(Habe mir den Code jetzt nicht angesehen, nutze in Zukunft für solche CodeSnippets das Python-Highlighting des Forums.)

Eine Sache noch "global" ist in der Regel "pfui" und bestimmt auch hier ;)

Verfasst: Dienstag 11. März 2008, 09:20
von martin86_mu
Hi, danke Zap für deine Antwort und deine Tips.
Das Modul habe ich mir angesehen und ausprobiert aber es hat nicht funktioniert. Ich vermute es liegt daran, dass die "Strukturinformationen" der Logging-Config-File verloren gehen, da dieses in Sektionen aufgeteilt ist und ich erhalte eine Fehlermeldung, dass eine bestimmte Sektion nicht mehr gefunden wird. Nachdem ich nochmal das Modul ConfigParser durchgegangen bin poste ich jetzt mal meinen Code, indem jedoch noch Fehler sind. es hakt auf jeden Fall schon mal an der write-funktion des Config-Parsers doch im Manual steht dass man dieser ein FileObjekt übergibt. Was mache ich falsch?

Gruß Martin

Code: Alles auswählen

import time
import ConfigParser
import re
import logging.config
import sys, logging, logging.handlers, string, socket, struct, os, traceback, types

def readConfigFile(cfgFile):
    cfg = ConfigParser.ConfigParser()
    cfg.readfp(cfgFile)
    cfg.set('handler_file_unittest','args',(('log/unittest'+time.strftime('%Y%m%d%H%M%S')+'.log'),'aw'))
    cfg.write(cfgFile)

loggingConfFile = file('logging.conf', 'r+')

readConfigFile(loggingConfFile) #Aufruf der Methode readConfigFile
logging.config.fileConfig(loggingConfFile) #Übergabe der geänderten Config-File an den Logger
loggingSection = 'unittest' 
log = logging.getLogger(loggingSection)




Traceback (most recent call last):
  File "C:/Dokumente und Einstellungen/KUBAN/workspace/Logger/Logger.py", line 15, in <module>
    readConfigFile(loggingConfFile)
  File "C:/Dokumente und Einstellungen/KUBAN/workspace/Logger/Logger.py", line 11, in readConfigFile
    cfg.write(cfgFile)
  File "C:\Python25\lib\ConfigParser.py", line 369, in write
    fp.write("[%s]\n" % section)
IOError: [Errno 0] Error

Verfasst: Dienstag 11. März 2008, 10:47
von BlackJack
Müsste man nicht mindestens zweimal die Datei mit `seek()` wieder "zurückspulen"? Aber selbst wenn das klappt, ist das ziemlich unschön.

Verfasst: Mittwoch 12. März 2008, 09:19
von martin86_mu
Vielen Dank für deine Hilfe BlackJack, daran hab ich gar nicht gedacht, jetzt funktionierts. Ist jetzt zumindest besser als die Datei zwischenzuspeichern und danach wieder auszulesen. Falls jemand noch ne bessere Lösung einfällt werd ich das gern mal testen. Tolles Forum, weiter so.

Gruß Martin

Verfasst: Mittwoch 12. März 2008, 16:28
von martin86_mu
Hi, ich bins nochmal. Nachdem ich mich erst gefreut hab dass es soweit funktioniert, hilft mir diese Lösung jetzt jedoch doch nicht weiter, denn im Endeffekt wird die originale Config-file überschrieben, obwohl ich die datei nie mit close() schliesse, dafür ist wohl die write() funktion des config-parsers verantwortlich. Jetzt konkret: gibt es vielleicht eine Möglichkeit, die Config-file in ein Objekt-File einzulesen (vielleicht auch ohne file() ), damit das Objekt-File nicht mehr an die Datei auf der Festplatte gebunden ist? Wäre für jegliche Anregungen sehr dankbar!

Gruß Martin

Verfasst: Mittwoch 12. März 2008, 17:51
von BlackJack
Das Modul `StringIO` wurde doch schon genannt.

Verfasst: Mittwoch 12. März 2008, 18:46
von Zap
Schieb dann noch n Minibeispiel nach:

Code: Alles auswählen

In [2]: def my_print(filelike, txt):
   ...:     filelike.write("%s\n" % txt)
   ...:
In [3]: import sys
In [4]: my_print(sys.stdout, "Huhu")
Huhu
In [5]: from StringIO import StringIO
In [6]: io = StringIO()
In [7]: my_print(io, "Huhu")
In [8]: io.getvalue()
Out[8]: 'Huhu\n'
Das ganze Spiel geht auch mit read, seek, flush und Co.

Verfasst: Donnerstag 13. März 2008, 09:23
von martin86_mu
Ok jetzt klappts mit zwischenspeichern in einem IO Fileobjekt. Danke nochmal für das Beispiel Zap, irgenwie bin ich im Manual bei StringIO nicht klar gekommen. gruß