\n in QSettings Datei
\n in QSettings Datei
Hi,
ich möchte eine .ini Datei für Logs missbrauchen, wenn sich ein QLabel-Text ändert soll der vorherige in die Logdatei geschrieben werden.
Dabei scheint es ein Problem zu geben wenn ich das immer an den gleiche nQSetting-Value anhängen will, da er "\n" nicht erkennt als NewLine Command und der Wert dann natürlich "unlesbar" wird.
Muss ich da nun für jeden neuen Eintrag einen neuen Value initialisieren oder hat jemand eine Idee wie ich ein LineBreak hinkriege?
ich möchte eine .ini Datei für Logs missbrauchen, wenn sich ein QLabel-Text ändert soll der vorherige in die Logdatei geschrieben werden.
Dabei scheint es ein Problem zu geben wenn ich das immer an den gleiche nQSetting-Value anhängen will, da er "\n" nicht erkennt als NewLine Command und der Wert dann natürlich "unlesbar" wird.
Muss ich da nun für jeden neuen Eintrag einen neuen Value initialisieren oder hat jemand eine Idee wie ich ein LineBreak hinkriege?
Using Qt 4.3.1 (Linux and Windows)
Unterstützen INI-Dateien überhaupt Einträge über mehrere Zeilen? Ich meine nicht. INI-Dateien halte ich für ein Log auch denkbar ungünstig, da Du überhaupt keinen zeitlichen Bezug dazu hast, was zuletzt geändert wurde.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Ganz zu Beginn pack ich einen "date"-value rein, dadurch habe ich sehr wohl einen zeitlichen Bezug.
Das mit den "Einträgen über mehrere Zeilen" würd ich halt gern wissen. Scheint mir allerdings auch so dass es so ist wie du sagst, wenn mein \n wird einfach mal ignoriert.
Neben vielen kleinen anderen Zweifeln gibt es zwei Hauptprobleme die mich dazu gebracht haben, Log-Files in einer INI abzuspeichern:
1) Da jeder User meines Programms (eigene) Log-Dateien schreiben können soll, muss ich die im Settings-Ordner ablegen. Und an den kommt man nicht wirklich einfach, es gibt da z.B. für Windows so eine Riesenmethode wie auch Qt das macht, hab das hier im Forum gefunden, aber da find ich INI-Files doch besser.
2) Ich will dass die Logfiles nicht platzen, darum kann ich wunderbar immer gucken dass ich maximal 50 Sections habe, d.h. 50 Programmstarts.
Mit der beginGroup() Methode und den anderen INI-Befehlen geht das eigentlich ziemlich gut, wie gesagt nur dass ich kein Linebreak habe lässt die etwas schäbig aussehen.
Das mit den "Einträgen über mehrere Zeilen" würd ich halt gern wissen. Scheint mir allerdings auch so dass es so ist wie du sagst, wenn mein \n wird einfach mal ignoriert.
Neben vielen kleinen anderen Zweifeln gibt es zwei Hauptprobleme die mich dazu gebracht haben, Log-Files in einer INI abzuspeichern:
1) Da jeder User meines Programms (eigene) Log-Dateien schreiben können soll, muss ich die im Settings-Ordner ablegen. Und an den kommt man nicht wirklich einfach, es gibt da z.B. für Windows so eine Riesenmethode wie auch Qt das macht, hab das hier im Forum gefunden, aber da find ich INI-Files doch besser.
2) Ich will dass die Logfiles nicht platzen, darum kann ich wunderbar immer gucken dass ich maximal 50 Sections habe, d.h. 50 Programmstarts.
Mit der beginGroup() Methode und den anderen INI-Befehlen geht das eigentlich ziemlich gut, wie gesagt nur dass ich kein Linebreak habe lässt die etwas schäbig aussehen.
Using Qt 4.3.1 (Linux and Windows)
Aber Du hast doch immer nur den letzten Eintrag und kannst gar nicht nach vollziehen was sich geändert hat.Bagstone hat geschrieben:Ganz zu Beginn pack ich einen "date"-value rein, dadurch habe ich sehr wohl einen zeitlichen Bezug.
Was ist denn der Settings-Ordner? Jedenfalls kommt man ganz einfach da ran:Bagstone hat geschrieben:1) Da jeder User meines Programms (eigene) Log-Dateien schreiben können soll, muss ich die im Settings-Ordner ablegen.
Code: Alles auswählen
QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", QSettings::NativeFormat);
QString allUsers = settings.value("COMMON APPDATA").toString();
QString home = settings.value("APPDATA").toString();Du nummerierst also deine Sektionen durch und die aktuellste steht dann irgendwo mittendrin? Da die Datei sowieso komplett neu geschrieben wird, kannst Du das auch komplett selbst handeln. Wird im Endeffekt sicherlich übersichtlicher.Bagstone hat geschrieben:2) Ich will dass die Logfiles nicht platzen, darum kann ich wunderbar immer gucken dass ich maximal 50 Sections habe, d.h. 50 Programmstarts.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Hm, deine Argumente sind schon in etwa das, was ich mir auch überlegt hatte. Ich werde in meine TODO mal schreiben, irgendwann von INI auf ein eigenes Log-Format umzuschreiben. Aufgrund von Deadline-Druck rutscht das aber erstmal nach hinten, andere "echte" Probleme haben Vorrang 
Da auch keiner bisher etwas gegenteiliges behauptet hat, gehe ich davon aus, dass es eh keinen LineBreak in INI Files gibt und damit muss ich sowieso umsteigen auf .log.... ist für mich das schlagkräftigste Argument
Danke auf jeden Fall schonmal für deine Antworten.
Da auch keiner bisher etwas gegenteiliges behauptet hat, gehe ich davon aus, dass es eh keinen LineBreak in INI Files gibt und damit muss ich sowieso umsteigen auf .log.... ist für mich das schlagkräftigste Argument
Danke auf jeden Fall schonmal für deine Antworten.
Using Qt 4.3.1 (Linux and Windows)
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Danke für die Antwort Christian, gut zu wissen falls ich es nochmal brauche!
Bin jetzt allerdings doch wie macman es angeraten hat auf eine Logfile mit eigenem Format umgestiegen.
Nun überlege ich, wie ich diese in der Größe begrenzen soll.
Aufgrund der Filesize oder der Anzahl der Zeilen? Was ist besser?
Gegen Anzahl der Zeilen sprechen zwei Sachen:
1) Falls mal jemand Linebreaks vergisst, kann auch eine Zeile die Datei schon sehr groß machen. Bin nicht der Einzige der an dem Projekt arbeitet.
2) Ich habe keine Ahnung, wie ich effizient die Anzahl der Zeilen zähle.
Muss ich da wirklich eine Schleife machen und mit readLine() durchrennen? Das kann ja u.U. ziemlich aufwendig werden...
Dazu frage ich mich was bei file.open der Mode "Unbuffered" bewirkt, die Doku ist mir da unverständlich, heißt dass, dass die Dateien direkt von der Platte gelesen werden und nicht im Speicher liegen? So habe ich das mal interpretiert und darum auch den Flag beim Öffnen gesetzt. Allerdings steht in der Doku auch, dass bei Unbuffered Devices der Befehl readLine() sehr ineffizient ist.
Bin jetzt allerdings doch wie macman es angeraten hat auf eine Logfile mit eigenem Format umgestiegen.
Nun überlege ich, wie ich diese in der Größe begrenzen soll.
Aufgrund der Filesize oder der Anzahl der Zeilen? Was ist besser?
Gegen Anzahl der Zeilen sprechen zwei Sachen:
1) Falls mal jemand Linebreaks vergisst, kann auch eine Zeile die Datei schon sehr groß machen. Bin nicht der Einzige der an dem Projekt arbeitet.
2) Ich habe keine Ahnung, wie ich effizient die Anzahl der Zeilen zähle.
Muss ich da wirklich eine Schleife machen und mit readLine() durchrennen? Das kann ja u.U. ziemlich aufwendig werden...
Dazu frage ich mich was bei file.open der Mode "Unbuffered" bewirkt, die Doku ist mir da unverständlich, heißt dass, dass die Dateien direkt von der Platte gelesen werden und nicht im Speicher liegen? So habe ich das mal interpretiert und darum auch den Flag beim Öffnen gesetzt. Allerdings steht in der Doku auch, dass bei Unbuffered Devices der Befehl readLine() sehr ineffizient ist.
Using Qt 4.3.1 (Linux and Windows)
Zeilen, Du kannst aber auch beides machen. Allerdings würde mich langsam mal interessieren von welchen Größenordnungen wir hier reden. Ab einer bestimmten Größe ist es bestimmt sinniger, es von der Größe abhängig zu machen.Bagstone hat geschrieben:Aufgrund der Filesize oder der Anzahl der Zeilen? Was ist besser?
Dann ist das Log-Format doch fest definiert und dann darf das niemand vergessen. Und wenn doch, dann findet man es bei den Tests heraus.Bagstone hat geschrieben:1) Falls mal jemand Linebreaks vergisst, kann auch eine Zeile die Datei schon sehr groß machen. Bin nicht der Einzige der an dem Projekt arbeitet.
Was ist an einer while-Schleife mit Zähler aufwändig?Bagstone hat geschrieben:Muss ich da wirklich eine Schleife machen und mit readLine() durchrennen? Das kann ja u.U. ziemlich aufwendig werden...
Ist das in deinem Fall nicht egal?Bagstone hat geschrieben:Dazu frage ich mich was bei file.open der Mode "Unbuffered" bewirkt,
and limitations in the native API prevent QFile from supporting Unbuffered on Windows
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Bitter.macman hat geschrieben:Allerdings würde mich langsam mal interessieren von welchen Größenordnungen wir hier reden.Kein Ahnung. Aber ich kann nicht ausschließen, dass das Programm seeeeehr lange läuft, also auch mal tagelang nonstop, und dann wird's halt viel.
Ich schreibe einmal Update-Meldungen rein, das ist nicht so viel, aber zum zweiten den kompletten Output eines QProcess, denn das Programm dient als eine Art Wrapper für ein anderes, sehr umfangreiches Tool. Und wir wissen noch nicht, wieviel Output dieses Tool generiert.
and limitations in the native API prevent QFile from supporting Unbuffered on Windows
Aber die meisten Anwender werden unter Linux arbeiten, darum lass ich's mal drin.
Naja, letzte Überlegung war folgendes: Ich behalte immer die Logs der letzten 10 Programmstarts, jeweils in einer separaten Logfile.
Using Qt 4.3.1 (Linux and Windows)
Verschiedene Sachen die du noch machen kannst:
1) Eine eigene Klasse "Logger" schreiben, die auf einem QFile operiert. Am besten cachest du eine bestimmte Zeit/Anzahl logs lang die Meldungen, bevor du sie ins File schreibst.
2) Wenn du "auch" den Output eines QProcess loggen willst mach folgendes: Jeder QProcess erhält sein eigenes File (im selben Verzeichnis oder einem Unterverzeichnis). Überleg dir ein Benennungsschema (z.B. process-<time_in_seconds>.log). Den Namen der Datei streamst du dann als normale Message in dein Logfile. So bleibt das eigentliche Logfile übersichtlich und kann entsprechend gewartet werden.
Vielleicht fällt dir noch mehr ein
Grüße
Franz
1) Eine eigene Klasse "Logger" schreiben, die auf einem QFile operiert. Am besten cachest du eine bestimmte Zeit/Anzahl logs lang die Meldungen, bevor du sie ins File schreibst.
2) Wenn du "auch" den Output eines QProcess loggen willst mach folgendes: Jeder QProcess erhält sein eigenes File (im selben Verzeichnis oder einem Unterverzeichnis). Überleg dir ein Benennungsschema (z.B. process-<time_in_seconds>.log). Den Namen der Datei streamst du dann als normale Message in dein Logfile. So bleibt das eigentliche Logfile übersichtlich und kann entsprechend gewartet werden.
Vielleicht fällt dir noch mehr ein
Grüße
Franz