Python Logging in home Verzeichnis (unter Windows) mit YAML config

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.
Antworten
Benutzeravatar
TheGrudge
User
Beiträge: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

Hi,

ich muss für ein Projekt logging implementieren, und verwende hierfür die integrierte logging library.
Es soll durch den Anwender steuerbar sein, also habe ich mich dazu entschieden, die config in YAML umzusetzen, logging bietet dafür ja Methoden zum laden.

Ich schaffe es nun leider aber nicht, einen filename so anzugeben, dass er ins HOME Verzeichnis des Anwenders schreibt.
Ich habe ~, %HOMEPATH% usw versucht, scheitert aber leider alles.

Wie kann ich einen Pfad in YAML so angeben, dass Python auf das Home-Verzeichnis des Benutzers loggt?
Ich habe da im Moment keine Idee.
Es gibt im os-Modul noch expanduser, aber das kann ich hier nicht verwenden, da durchaus auch mal absolute Pfade angegeben werden können.
Die Defaulteinstellung soll jedoch das Home-Verzeichnis sein.

Im Moment habe ich sowas, aber das löst er nach c:\\program files\\project\\%HOMEPATH%\\my.log auf.

Code: Alles auswählen

handlers:
  file:
    class: logging.handlers.RotatingFileHandler
    level: DEBUG
    formatter: detailed
    filename: "%HOMEPATH%\my.log"
    maxBytes: 10485760
    backupCount: 3
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kannst du mal zeigen wie du das machst? Denn wirklich "eingebaut" ist das doch nicht.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

%HOMEPATH% wird doch eher mit expandvars ersetzt, und falls es ein absoluter Pfad ist, passiert gar nichts.
Benutzeravatar
TheGrudge
User
Beiträge: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

Ich initialisiere logging so:

Code: Alles auswählen

        
        config_file = os.path.join(os.path.dirname(__file__), 'logger.yml')

        if os.path.exists(config_file):
            with open(config_file, 'rt') as f:
                config = yaml.safe_load(f.read())
            logging.config.dictConfig(config)
        else:
            logging.basicConfig(level=logging.INFO)
und danach nutze ich es in den Modulen, z.B.

Code: Alles auswählen

logger = logging.getLogger(__name__)
logger.debug('Hallo Test')
Benutzeravatar
TheGrudge
User
Beiträge: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

Hmmm ich könnte ja das Dictionary nachher manipulieren, wenn es übr YAML nicht funktioniert. Werde ich dann mal probieren...
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich arbeite selten mit YAML, aber das Problem hier ist klar der YAML-Parser. Du musst schauen, ob der so ein feature kennt. Ggf. kannst du das os.environ-Woerterbuch beim parsen mit reingeben, und das Ding kann das dann alleine.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@TheGrudge: natürlich mußt Du das Dictionary nachher manipulieren. Woher soll YAML wissen, was die Bedeutung dieses Strings ist? Und an welcher Stelle, Du welche Transformation möchtest.
Benutzeravatar
TheGrudge
User
Beiträge: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

Naja ich hätte jetzt "erwartet" dass die dictConfig Funktion von logging das automatisch macht. Aber das scheint hier nicht der Fall zu sein. Da auch zusätzliche FileHandler hinzukonfiguriert werden können (müssen / dürfen), muss ich wohl alle "filename" Attribute anpassen.
Benutzeravatar
TheGrudge
User
Beiträge: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

Ich mache es im Moment so (ohne Checks ob der Pfad schreibbar ist, einfach mal zum Test):

Code: Alles auswählen

    def update_filename_paths(self, config: Dict) -> None:
        for key, value in config.items():
            if isinstance(value, dict):
                self.update_filename_paths(value)
            elif key == 'filename':
                new_path = os.path.expanduser(config[key])
                config[key] = new_path
Das scheint so erst einmal zu funktionieren.
Antworten