Änderung einer logger-Config durch den Config-Parser

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
martin86_mu
User
Beiträge: 16
Registriert: Montag 10. März 2008, 15:51

Änderung einer logger-Config durch den Config-Parser

Beitragvon martin86_mu » Montag 10. März 2008, 16:36

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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Beitragvon Zap » Montag 10. März 2008, 16:48

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 ;)
martin86_mu
User
Beiträge: 16
Registriert: Montag 10. März 2008, 15:51

Beitragvon martin86_mu » Dienstag 11. März 2008, 09:20

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
BlackJack

Beitragvon BlackJack » Dienstag 11. März 2008, 10:47

Müsste man nicht mindestens zweimal die Datei mit `seek()` wieder "zurückspulen"? Aber selbst wenn das klappt, ist das ziemlich unschön.
martin86_mu
User
Beiträge: 16
Registriert: Montag 10. März 2008, 15:51

Beitragvon martin86_mu » Mittwoch 12. März 2008, 09:19

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
martin86_mu
User
Beiträge: 16
Registriert: Montag 10. März 2008, 15:51

Beitragvon martin86_mu » Mittwoch 12. März 2008, 16:28

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
BlackJack

Beitragvon BlackJack » Mittwoch 12. März 2008, 17:51

Das Modul `StringIO` wurde doch schon genannt.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Beitragvon Zap » Mittwoch 12. März 2008, 18:46

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.
martin86_mu
User
Beiträge: 16
Registriert: Montag 10. März 2008, 15:51

Beitragvon martin86_mu » Donnerstag 13. März 2008, 09:23

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ß

Wer ist online?

Mitglieder in diesem Forum: martinjo