none
EventLog - Übergabe Referenz an Klasse - Fehler Quelle nicht gefunden RRS feed

  • Frage

  • Hallo zusammen,

    brauche mal eure Hilfe, da ich aktuell nicht weiterkomme :-(

    Ich entwickle gerade unter VS 2013 express eine Desktopanwendung unter C# und möchte für auftretende Fehler in der Anwendung diese in einem Eventlog protokolliert haben.

    Nun habe ich zu Testzwecken (ich weis, das Anlegen eines Eventlog gehört in die Installationsroutine später :-) ) ein Eventlog angelgt und will es nun innerhalb meiner Anwendung als Referenz an die jeweilige Form übergeben. Wenn ich dann die Prüfung mache in der aufgerufenen Klasse, ob die Quelle vorhanden ist, bekomme ich die Info, dass diese nicht existiert.

    Daher nun die Frage, wie übergibt man bereits vorher angelegte Eventlogs an andere Forms / Klassen ? Anbei nun mal einen Auszug aus meinem Quellcode und danke für eure Tipps vorab :-)

    Gruss

    Tilman

    Schritt 1:

    Deklaration Eventlog und Klasse OneReviseSystem:

    private OneReviceSystem ors = null;
    private EventLog oneReviseLog = null;


    in der Methode Load der Start-From

    oneReviseLog = new EventLog ( "OneReviseProtokol", "." );
                oneReviseLog.Source = "OneRevise";
                if ( EventLog.Exists ( "OneRevise" ) )
                {
                    oneReviseLog.WriteEntry ( "Eventlog OneRevice wurde bereits angelegt und kann verwendet werden !" );
                

    Schritt 2:

    Instanzieren Klase OneReviseSystem und Übergabe Referenz über Konstruktor

    ors = new OneReviceSystem (oneReviseLog );

    Schritt 3:

    Konstruktor in Klasse OneReviseSystem und Prüfung mit Fehlermeldung

    public OneReviceSystem ( EventLog oneReviseLog )
            {
                // TODO: Complete member initialization
                this.oneReviseLog = oneReviseLog;
    
                //hier können ggfs benötigte Instanzen gebildet werden
                if ( EventLog.Exists ( "OneRevise" ) )
                {
                    oneReviseLog.WriteEntry ( "Eventlog OneRevice wurde bereits angelegt und kann verwendet werden !" );
                }
                else
                {
                    System.Console.WriteLine ( "Evenltog existiert nicht" );
                }
            }
    Fehlermeldung:


    Montag, 29. Dezember 2014 04:49

Antworten

  • Hallo Tilman,

    protokollieren ist wichtig, aber es sollte nicht die Regeln für das Programm bestimmen. Und so wäre das Übergeben einer Instanz im Konstruktor der falsche Weg, weil sich die Protokollierei durch sämtliche Klassen ziehen würde.

    Typischerweise würde man eine Singleton Klasse definieren, die die Protokoll-Methoden bereitstellt und dabei (hier) das EventLog protokolliert. Beachte das diese Klasse thread-sicher sein sollte und sorgfältig programmiert sein sollte, das sie nicht selbst zur Ausnahmequelle wird.

    Allerdings würde ich Dir dazu raten, eines der existierenden Logging Frameworks zu verwenden, von denen es einige gibt  und die neben dem EventLog andere Möglichkeiten wie das Protokollieren in Dateien, Datenbanken uam. unterstützen. Die verbreiteteren wären die Microsoft Enterprise Library (ein Bestandteil), NLog  und log4Net.

    Will oder kann man sich - wegen Abhängigkeiten - nicht entscheiden, sollte man eine Fassade verwenden, die für die Nutzer die gemeinsame Schnittstelle darstellt, siehe z. B.: http://stackoverflow.com/questions/3825276/whats-the-point-of-a-logging-facade

    Aber auch ohne das zeigt es wie man die Anwendung frei von Abhängigkeiten einer spezifischen Implementierung beim Protokollieren macht. Und solltest Du Dir eines davon anschauen (z. B. Common Logging), da es den generellen Aufbau und die gemeinsamen Nenner zeigt.

    Gruß Elmar

    Montag, 29. Dezember 2014 08:20
    Beantworter