Logging greift an bestimmter Stelle nicht mehr

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
lord_icon
User
Beiträge: 8
Registriert: Mittwoch 8. März 2023, 17:54

Moin,

ein Script (nicht von mir) soll erweitert werden.
Hierzu möchte ich erstmal am Anfang ein paar infos an die log.log senden.

Mein neuen Abschnitt habe ich immer mit "## NEUER ABSCHNIT" gekennzeichnet sodass man meine Veränderung sieht.
Der erste Abschnitt kommt auch an:
"2023-03-08 16:44:04,809 - mein_neues_log - DEBUG - Dies ist eine Debug-Nachricht für das neue Log."

nur der Eintrag am Ende des Scriptes nicht mehr. Was mache ich an dieser Stelle denn falsch?

Code: Alles auswählen

from __future__ import annotations

import asyncio
import concurrent
import dataclasses
import logging
from concurrent.futures.thread import ThreadExecutor
from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple

from typing_extensions import Literal

from consensus.constants import ConsensusConstants
from file_sync.sender import Sender
from printing.manager import FileManager
from printing.util import (
    remove_file,
    remove_file_directory,
)
from rpc.rpc_server import StateChangedProtocol, default_get_connections
from server.outbound_message import NodeType
from server.server import Server
from server.ws_connection import WSConnection

log = logging.getLogger(__name__)


        ## NEUER ABSCHNIT
        new_log = logging.getLogger("mein_neues_log")

        # Hier können Sie den gewünschten Log-Level setzen
        new_log.setLevel(logging.DEBUG)

        # Hier wird ein Handler für die Ausgabe auf eine Datei erstellt
        handler = logging.FileHandler("/home/user/Timer/log.log")

        # Hier können Sie den gewünschten Formatierungsstil für Ihre Log-Einträge setzen
        formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
        handler.setFormatter(formatter)

        # Hier wird der Handler dem neuen Logger hinzugefügt
        new_log.addHandler(handler)
        new_log.debug("Dies ist eine Debug-Nachricht für das neue Log.")
        ## ENDE NEUER ABSCHNIT

class Timer:
    file_manager: FileManager
    sync_sender: Sender
    root_path: Path
    shut_down: bool
    executor: ThreadExecutor
    state_changed_callback: Optional[Callable]
    cached_challenges: List
    constants: ConsensusConstants
    refresh_lock: asyncio.Lock
    event_loop: asyncio.events.AbstractEventLoop
    server: Optional[Server]


    @property
    def server(self) -> Server:
        #"Dies ist eine vorübergehende Lösung, bis die Verwendung der Klasse so umgestaltet wird, dass die Werte der integralen Attribute bei Erstellung der Instanz bekannt sind."
        if self._server is None:
            raise RuntimeError("server not assigned")

        return self._server

    def __init__(self, root_path: Path, config: Dict, constants: ConsensusConstants):
        self.log = log
        self.root_path = root_path
        
        ## NEUER ABSCHNIT
            self.new_log = log
            new_log.debug("Dies ist eine Debug-Nachricht für das neue Log.")
        ## ENDE NEUER ABSCHNIT

juwido
User
Beiträge: 24
Registriert: Donnerstag 15. Dezember 2022, 13:41

Hallo, ich sehe jetzt auch nicht, wo in dem Code die init-Methode bzw. Timer
aufgerufen wird...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Naja

Code: Alles auswählen

new_log.debug("Dies ist eine Debug-Nachricht für das neue Log.")
gibt es ja auch nicht. Wenn muss es wohl self.new_log heissen. Wobei das eh quatsch ist, self.new_log und self.log sind ja nunmal die exakt gleichen Logger. self.new_log kann man sich also sparen.

Und man kann sich das gesamte gebinde von log an self sparen, weil man die Logger (als Ausnahme zu nahezu allen anderen Faellen) eh immer global verwendet. self.log ist also immer dasselbe wie das global log, kann man also einfach auch nur log benutzen.
lord_icon
User
Beiträge: 8
Registriert: Mittwoch 8. März 2023, 17:54

hmm... @deets

So ganz verstehe ich dich nicht. Ich möchte ja ein eigenes Log was auch Zeitstempel mitbringt. Das originale Log ist da sehr kurz gefasst.


Ich denke mal, ihr habt beide nicht bis unten gelesen.
Es gibt 2 Abschnitte wo ich eingegriffen habe.
Einmal oben recht viel. Da definiere ich "new_log". Die Testnachricht in diesen Bereich erhalte ich auch !!!!

Und dann am ende des Scripts (muß man scrollen im Code).... da gibt es einen neuen Testeintrag (gleichlautend). Diesen erhalte ich aber nicht.
self.new_log = log
new_log.debug("Dies ist eine Debug-Nachricht für das neue Log.")

@juwido
Vermutlich auch nicht nach unten gescrollt?

Das originale Script führt ja schon den __int__ ein
def __init__(self, root_path: Path, config: Dict, constants: ConsensusConstants):

Sollte somit passen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die von mir zitierte Zeile ist die sprichwoertlich letzte in deinem Code. Und so weit habe ich also auch gelesen, oder?

Allerdings habe ich uebersehen, dass du da oben new_log definierst. Das du dann gleichzeitig aber nochmal self.new_log anlegst, ist halt verwirrend. Und so oder so ist das ganze eher komisch, weil deine ganze erste Sektion so nie funktionieren duerfte. Sie ist falsch eingerueckt.

Wenn das trotzdem irgendwie funktioniert, dann kommt es eben einfach nicht dazu, dass die zweite Stelle erreicht wird. Keine Ahnung warum, du zeigst nicht, wie Timer erzeugt wird.
lord_icon
User
Beiträge: 8
Registriert: Mittwoch 8. März 2023, 17:54

"dass du da oben new_log definierst. Das du dann gleichzeitig aber nochmal self.new_log anlegst, ist halt verwirrend"
hmm.. ich dachte das müsste so sein, da ich mich im nächsten Abschnitt in einer "class" befinde und später dann über "__int__" alles in "self" übergebe.
Zumindest habe ich den code bisher so verstanden.

"Sie ist falsch eingerueckt."
hmm... im Quellcode ist dem nicht so. Da klebt es ganz vorne.
Ich weiß, das pyhton das eingerückte berücksichtigt.... aber in diesen Absatz sollte das doch keine Rolle spielen (?)
ich hab es jetzt nur für euch eingerückt damit es besser lesbar ist.

Gegenfrage:

Wie hättest du es denn geschrieben?
Sektion 1 => der obere eingerückte Abschnitt.
Sektion 2 => das am Ende
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was du dir da gedacht hast, ist halt geraten, und ueberfluessig. new_log ist eine globale Variable, und kann daher auch benutzt werden.

Woher die Einrueckungen kommen, kann ich nicht beurteilen - aber hier sind sie da, und es kann auch keine space/tab Sache sein, denn an der Stelle darf keine Einrueckung sein.

Was du glaube ich immer noch nicht begriffen hast: nur weil da Code im __init__ steht, heisst das nicht, das der ausgefuehrt wird. Das passiert nur, wenn eine Instanz der Klasse Timer erzeugt wird. Das passiert in dem Code den du zeigst halt nicht. Und damit ist das auch erstmal die erste Frage: woher weisst du, dass das passiert?

Code: Alles auswählen

class Timer:
   def __init__(self):
        print("Timer")
Das auszufuehren hat auch keine Ausgabe. Dazu fehlt dann ein

Code: Alles auswählen

timer = Timer()
als letzte Zeile.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachtrag: ich habe erst jetzt gelesen, dass die Einrueckung vorgenommen hast. Das ist natuerlich falsch und verwirrend! Python braucht die nunmal, und wir genauso. Wenn du da also einfach zur Illustration irgendwas einrueckst, verfaelschst du, was fuer Code ausgefuehert wird, und schickst uns hier auf eine falsche Faehrte. Die Kommentare zur kenntlichmachung sind ausreichend.
Antworten