Seite 1 von 1

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

Verfasst: Mittwoch 20. Februar 2019, 18:22
von TheGrudge
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

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

Verfasst: Mittwoch 20. Februar 2019, 18:28
von __deets__
Kannst du mal zeigen wie du das machst? Denn wirklich "eingebaut" ist das doch nicht.

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

Verfasst: Mittwoch 20. Februar 2019, 18:39
von Sirius3
%HOMEPATH% wird doch eher mit expandvars ersetzt, und falls es ein absoluter Pfad ist, passiert gar nichts.

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

Verfasst: Mittwoch 20. Februar 2019, 19:36
von TheGrudge
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')

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

Verfasst: Donnerstag 21. Februar 2019, 10:49
von TheGrudge
Hmmm ich könnte ja das Dictionary nachher manipulieren, wenn es übr YAML nicht funktioniert. Werde ich dann mal probieren...

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

Verfasst: Donnerstag 21. Februar 2019, 10:53
von __deets__
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.

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

Verfasst: Donnerstag 21. Februar 2019, 13:09
von Sirius3
@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.

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

Verfasst: Donnerstag 21. Februar 2019, 13:53
von TheGrudge
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.

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

Verfasst: Donnerstag 21. Februar 2019, 15:12
von TheGrudge
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.