Seite 1 von 1

\n in QSettings Datei

Verfasst: 1. Februar 2008 12:06
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?

Verfasst: 1. Februar 2008 12:25
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.

Verfasst: 1. Februar 2008 12:39
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.

Verfasst: 1. Februar 2008 13:24
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.

Verfasst: 1. Februar 2008 14:52
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.

Verfasst: 1. Februar 2008 17:53
von Christian81
Einfach \n (und andere) quoten --> '\n' --> '\\\n' und beim Laden wieder rückwärts

Verfasst: 6. Februar 2008 17:06
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.

Verfasst: 7. Februar 2008 07:33
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

Verfasst: 7. Februar 2008 13:44
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.

Verfasst: 7. Februar 2008 14:28
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