\n in QSettings Datei

Verschiedenes zu Qt
Antworten
Bagstone
Beiträge: 31
Registriert: 20. September 2007 10:55

\n in QSettings Datei

Beitrag von Bagstone »

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?
Using Qt 4.3.1 (Linux and Windows)
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

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.
Bagstone
Beiträge: 31
Registriert: 20. September 2007 10:55

Beitrag von Bagstone »

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.
Using Qt 4.3.1 (Linux and Windows)
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Bagstone hat geschrieben:Ganz zu Beginn pack ich einen "date"-value rein, dadurch habe ich sehr wohl einen zeitlichen Bezug.
Aber Du hast doch immer nur den letzten Eintrag und kannst gar nicht nach vollziehen was sich geändert hat.
Bagstone hat geschrieben:1) Da jeder User meines Programms (eigene) Log-Dateien schreiben können soll, muss ich die im Settings-Ordner ablegen.
Was ist denn der Settings-Ordner? Jedenfalls kommt man ganz einfach da ran:

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();
Und da speicherst Du dann deine INI-Dateien drin ab. Eigentlich müssen sie sogar da hin.
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.
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.
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.
Bagstone
Beiträge: 31
Registriert: 20. September 2007 10:55

Beitrag von Bagstone »

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.
Using Qt 4.3.1 (Linux and Windows)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Einfach \n (und andere) quoten --> '\n' --> '\\\n' und beim Laden wieder rückwärts
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Bagstone
Beiträge: 31
Registriert: 20. September 2007 10:55

Beitrag von Bagstone »

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.
Using Qt 4.3.1 (Linux and Windows)
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Bagstone hat geschrieben:Aufgrund der Filesize oder der Anzahl der Zeilen? Was ist besser?
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: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.
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:Muss ich da wirklich eine Schleife machen und mit readLine() durchrennen? Das kann ja u.U. ziemlich aufwendig werden...
Was ist an einer while-Schleife mit Zähler aufwändig?
Bagstone hat geschrieben:Dazu frage ich mich was bei file.open der Mode "Unbuffered" bewirkt,
Ist das in deinem Fall nicht egal?
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.
Bagstone
Beiträge: 31
Registriert: 20. September 2007 10:55

Beitrag von Bagstone »

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
Bitter.
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)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

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
Antworten