Log-System

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Tach, ich erklär euch mal wie ihr ein ganz einfaches Log-System hinbekommt.


    Zuerst musst ihr eine Funktion "forwarden", da wir sie als public deklarieren:
    forward log(logtext[]);


    Als nächstes schreiben wir die eigentliche Funktion:

    public log(logtext[])
    {
    new File:logfile=fopen("/logs.txt", io_append); // Datei öffnen und in der Variable "logfile" speichern
    new hour, minute, second, string[800]; // Zeit Variablen und die string-Variable


    gettime(hour, minute, second); // Aktuelle Zeit auslesen
    format(string, sizeof(string), "[%d:%d]%s\n", hour, minute, inputtext); // String formatieren
    fwrite(logfile, string); // String in die Datei schreiben (io_append = Anhängen)
    fclose(logfile); // Schließt die Datei
    }


    So wenden wir die Funktion an: (Beispiel: OnPlayerText)

    new string[500], pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname)); // Spielername auslesen
    format(string, sizeof(string), "[Chat][%s]: %s", pname, text); // String formatieren
    log(string); // Log-Funktion aufrufen


    Hoffe das Tutorial hat euch gefallen!

  • new File:logfile=fopen("/logs.txt", io_append); // Datei öffnen und in der Variable "logfile" speichern
    new hour, minute, second, string[800]; // Zeit Variablen und die string-Variable

    Du nimmst an, dass die Datei schon existiert.Außerdem ist 800 Zellen ziemlich viel für ein String.
    Wäre besser du prüfst noch mit einer if() - Abfrage ob logfile wirklich etwas enthält.


    format(string, sizeof(string), "[%d:%d]%s\n", hour, minute, inputtext); // String formatieren

    Ich würde dir empfehlen \r\n zu benutzten.
    \r - Legt fest das auch wirklich der Writer am Anfang der Zeile ist.
    \n - Springt in eine neue Zeile.



    new string[500], pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname)); // Spielername auslesen
    format(string, sizeof(string), "[Chat][%s]: %s", pname, text); // String formatieren
    log(string); // Log-Funktion aufrufen
    Da sind 500Zellen auch viel zu viel.Der Text wird niemals länger als 7 + MAX_PLAYER_NAME + 3 + 128 + 1.


    Fazit erspar Ich mir ;).

  • ähm eine frage was erklärst du da genau ?!? ich sag es dir gleich null...
    also falls dies ein tut sein soll bitte erkäre wenn dann die sachen genau... was z.b. MAX_PLAYER_NAME macht usw...

    Zitat

    naja aufm homeserver mit kumpel getestet und nix laggt von daher sollte nen richtiger server mit sowas keine probs haben

    *an Kopf schlag
    sowas kommt Raus wenn man erst absendet ohne nachzudenken. Bitte Leute Hirn einschalten beim Posten...

  • 7 + MAX_PLAYER_NAME + 3 + 128 + 1


    Okay.
    format(string, sizeof(string), "[Chat][%s]: %s", pname, text); // String formatieren
    "[Chat][" - 7
    %s wird der SpielerName sein,das maximal die Länge von MAX_PLAYER_NAME hat. ist zzT 24
    "]: " - 3
    %s ist der Chattext, der kann maximal 128 Zeichen sein
    1 für '\0', Null - Terminator.
    Macht also Insgesamt eine String-Größe von 163 ausreichend ;).


    Dennoch ist fraglich ob es ein Tutorial im eigentlichem Sinne ist :/.

  • stock Log(logname[],text[])//by Pixel
    {
    new string[256],File:hFile;
    format(string,sizeof(string),"%s\r\n",text);
    hFile=fopen(logname,io_append);
    fwrite(hFile,string);
    fclose(hFile);
    }


    Verwendung Beispiel bei OnPlayerText
    new string[163], pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));
    format(string,163,"[CHAT]: [%s]: %s",pname,text);
    Log("ChatLog.log",string);


    Finde es so besser aber naja jeder muss selber wissen wie er es am besten macht ,
    aber der Chat wird eh gelogt seit 0.3b RC1 ;)

  • Jo funkts supi :thumbup:


    habe jetzt gescriptet (bin eher noch dabei D: ) das die schüsse und tode geloggt werden, sehr hilfreich bei rl servern wenns um dm geht :S


    bring ich vielleicht als filterscript raus ;)

    "Stay hungry! Stay foolish!" - Steve Jobs

  • Ich weiß , das Thema ist uralt , aber das ist das einzigste , das ich gefunden habe.
    Ich hab auch schön alles gemacht , aber das ganze System loggt nichts.


    Ich hab das hier unter einem Callback:



    public log(logtext[])
    {
    new File:logfile;
    new hour, minute, second, year, month, day, string[256];

    gettime(hour, minute, second);
    getdate(year, month, day);
    format(string, sizeof string, "[%d.%d.%d] [%d:%d] %s\r\n", day, month, year, hour, minute, logtext);
    logfile = fopen("AdminCmd-Logs.txt", io_append);
    fwrite(logfile, string);
    fclose(logfile);

    return 1;
    }


    und das hier hab ich bei den Commands , die geloggt werden sollen:



    new string[256], pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));
    format(string, sizeof string, "[PORT][%s]: Hat sich nach SF geportet.", pname);
    log(string);


    Aber wie gesagt , er speichert das ganze nicht in der Datei.

    PN Support? Kannste knicken!

  • Error :)

    Zeile (5312) : Unbekannte Variable : "inputtext"


    1 Errors, 0 Warnungen
    Du hast Errors im Skript. Kompilierung abgebrochen


    PWNMod Compiler Version 1.2
    (c) Trooper[Y]
    In Kooperation mit GTA-Servers.de


    public log(logtext[])
    {
    new File:logfile=fopen("/logs.txt", io_append); // Datei öffnen und in der Variable "logfile" speichern
    new hour, minute, second, string[800]; // Zeit Variablen und die string-Variable


    gettime(hour, minute, second); // Aktuelle Zeit auslesen
    format(string, sizeof(string), "[%d:%d]%s\n", hour, minute, inputtext); // FEHLER
    fwrite(logfile, string); // String in die Datei schreiben (io_append = Anhängen)
    fclose(logfile); // Schließt die Datei
    }

  • Wieso zum Geier nimmt man ein Callback ?
    Da muss doch kein Timer oder CallRemote Funktion zugreifen.
    Ich glaub einige kennen den Unterschied zwischen einer normalen Funktion, einer Stock Funktion und einem Callback immer noch nicht.
    Dieses Tutorial ist nicht empfehlenswert. Goldkiller sein Beitrag sagt alles.


    LG RFT

    RFT