Laden...

Wie erstellt mir mein Custom Logger pro Tag eine neue Datei?

Erstellt von blizzard vor 3 Jahren Letzter Beitrag vor 3 Jahren 2.206 Views
B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren
Wie erstellt mir mein Custom Logger pro Tag eine neue Datei?

Hallo ich habe ein kleines problem mit meiner log klasse.

vorab erst mal das script


using System;
using System.IO;
using System.Net;
using System.Windows.Forms;

namespace Zensiert ( sorry ) 
{
    public abstract class LogBase
    {
        public abstract void Log(string Message);
    }

    



    public class Logger : LogBase
    {

        private String CurrentDirectory
        {
            get;
            set;
        }

        private String FileName
        {
            get;
            set;
        }

        private String FilePath
        {
            get;
            set;
        }
        string displayTime()
        {
            string time = null;
            string date = null;
            string timedate = null;

            time += DateTime.Now.Hour + ".";
            time += DateTime.Now.Minute + ".";
            time += DateTime.Now.Second;

            date += DateTime.Now.Day + ".";
            date += DateTime.Now.Month + ".";
            date += DateTime.Now.Year;

            timedate = time + "  " + date;

            return timedate;
        }

        public void create()
        {
            this.FilePath = this.CurrentDirectory + "/Logs/";

            if (!Directory.Exists(FilePath))
            {
                Directory.CreateDirectory(FilePath);
            }
        }


        public Logger()
        {

            Random zufall = new Random();
            int number = zufall.Next(1, 100);

            string Username = Properties.Settings.Default.ClientRegisterUsername;
            string date = DateTime.Now.ToLongDateString();
            string time = DateTime.Now.ToLongTimeString();

            this.CurrentDirectory = Directory.GetCurrentDirectory();
            this.FileName = Properties.Settings.Default.ClientRegisterUsername + number + ".log";
            
            this.FilePath = this.CurrentDirectory + "/Logs/" + displayTime().ToString() + " - " + this.FileName;

        }



        public override void Log(string Message)
        {

            string Username = Properties.Settings.Default.ClientRegisterUsername;
            string Password = Properties.Settings.Default.ClientRegisterPassword;
            string RegisterCode = Properties.Settings.Default.ClientRegisterCode;
            string IPv4Address = Properties.Settings.Default.ClientIPv4Address;


            //Console.WriteLine("Logged : {0}", logusername, Message);

            using (StreamWriter w = File.AppendText(this.FilePath))
            {
                w.Write("\r\nLog Eintrag : ");
                w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString());
                w.WriteLine("  :{0}", Message + " " + "|| - IPv4Adresse:  " + IPv4Address);
                w.WriteLine("-----------------------------------------------");
            }

            WebClient cl = new WebClient();
            try
            {

                cl.UploadFile("https://Sub.Domain.de/adau1p3lo4a2dd.php", FilePath);


            }

#pragma warning disable CS0168
            catch (Exception e)
#pragma warning restore CS0168
            {
                MessageBox.Show("Fehler");
            }

            string Pfad = this.CurrentDirectory + "/Logs/"; 
            DirectoryInfo di = new DirectoryInfo(Pfad);
            FileInfo[] files_log = di.GetFiles(".log");

            for (int i = 0; i < files_log.Length; i++)
                files_log[i].Delete();



        }
    }
}


Ich würde mir gerne ein script kleines script schreiben was mir alle vorgegebenen ausführungen der nutzer loggt. dieses funktioniert soweit auch ganz gut. die datei wird erstell und die logs werden eingetragen.

Jetzt habe ich aber das problem das die datei egal was ich mache im namen selbst die uhrzeit nicht ändert sonder immer ( z.b 1.44.8 21.6.2020 - Benutzer ) stehn bleibt und dort die daten rein schreibt. anstatt immer eine neue datei zu erstellen.

irgendwas übersehe ich da aber ich weiß einfach nicht was.

T
2.219 Beiträge seit 2008
vor 3 Jahren

Je nachdem wie du deinen Logger instanzierst und verwendest, wird es sich auch nicht ändern.
Den der Dateiname wird bei dir einmalig im Konstruktor ermittelt.
Wenn du die Instanz dann wieder verwendest, wird auch immer der selbe Name verwendet.

Für das Thema Logging gibt es mit log4net schon eine fertige Lösung.
Bitte nutzt diese und versuch nicht das Rad neu zu erfinden.
Auch kannst du dir bei deiner displayTime Methode das String gewurste sparen.
DateTime bietet mit ToString auch die Möglichkeit an, das Format für die Ausgabe vorzugeben.
Dadurch sparst du dir das rumgewussel mit den time/date Strings.
Da du hier jedes mal neue Strings erzeugst, kann auch die Zeit bei einem Wechsel fehlerhafte Strings erzeugen.

Deshalb solltest du aus deinem DateTime.Now auch immer einen String erzeugen.
Oder die aktuelle Zeit einmalig in einer lokalen Variable speichern, sonst liefert dir jeder Aufruf immer die aktuelle Zeit.

Ansonsten solltest du dich an die generellen Code Guidelines halten.
Methoden werden in C# immer mit einem Großbuchstaben begonnen.
Auch bin ich nicht sicher, ob du als aktuellen Pfad auf Directory.GetCurrentDirector() zugreifen willst.
Je nach Ausführungspfad, legst du dann in irgendwelchen Verzeichnissen deine Logs ab.
I.d.R. legt man Logs in Ordner für die Anwendungsdaten (AppData) ab.
Dazu musst du mal einen Blick auf die SpecialFolders in C# werfen.

Ebenfalls solltest du die Finger vom WebClient lassen, der ist obsolete.
Nimm den Httpclient, der ist der aktuelle Weg.
Ich weiß aber nicht, welchen Sinn es hat bei jedem Log Vorgang einen Upload durchzuführen.
Dadurch hast du auch gleich Konflikte, wenn viel geloggt wird.

Hier sollte der Upload erst erfolgen, wenn sichergestellt ist, dass keiner mehr in die Datei schreibt.
Am besten sollte der Upload beim beenden der Anwendung erfolgen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 3 Jahren

Sowas nennt sich Tracing.
Dafür gibts fertige Frameworks wie zB Serilog. Keine Notwendigkeit das Rad neu zu erfinden.

PS: Aktionen von Benutzern loggen ist rechtlich in Deutschland (bzw. der EU) problematisch.
In Unternehmen müssen die Benutzer darüber informiert werden, was, wie und warum geloggt wird - und zwar detailliert.
In Firmen mit Betriebsräten muss dieser solche Mechanismen zustimmen.

Besondere Sorgfalt unterliegst Du bei der Verarbeitung personenbezogener Informationen wie Benutzername, Uhrzeiten, IP Adressen etc...
IP Adressen darfst Du zB nicht ohne Zugriffschutz (zB verschlüsselt) loggen und bist rechtlich verpflichtet diese nach einer gewissen Zeit (ja nachdem, was Du unterliegst - zB 7 Tagen bei dynamischen IP Adressen) zu löschen.

Rechtliche Verletzungen bei sowas sind extrem teuer - und das ist gut so.
Einer dieser Verletzungen ist, dass Du das gesamte Logging unverschlüsselt überträgst.

Basics:

PS: da es sich hier nur im ein Logikfehler handelt, kannst Du das eigentlich relativ schnell mit [Artikel] Debugger: Wie verwende ich den von Visual Studio? selbst ermitteln.

B
blizzard Themenstarter:in
33 Beiträge seit 2020
vor 3 Jahren

Danke hab es gelöst bekommen 😉

2.207 Beiträge seit 2011
vor 3 Jahren

Hallo blizzard,

Danke hab es gelöst bekommen 😉

Das ist prima, kannst du uns und den Problemsuchenden nach dir noch sagen, wie du das gelöst hast?

Gruss

Fabian