![]() |
Spring4D Logging
Hallo Zusammen,
ich möchte gerne das Logging aus dem Spring4D Framework nutzen. Ich finde aber nirgendwo ausreichende Hilfestellung für den Einstig. Der Google Gruppe kann ich nicht beitreten und Suchen, hier im Forum oder bei Google waren bisher auch nicht erfolgreich. Ich habe mal folgendes Ausprobiert
Delphi-Quellcode:
Die Debug-Nachricht wird nicht ausgegeben. Die Info-Nachricht schon. Das Logging läßt sich doch sicherlich auch über eine Konfig-Datei steuern. Hat mal jemand ein Beispiel für einen sinnvollen Einstieg.
var
Logger: TLogger; Controller: ILoggerController; FileAppender: TFileLogAppender; Appender: ILogAppender; begin FileAppender:= TFileLogAppender.Create; FileAppender.FileName:= 'C:\Temp\test.log'; FileAppender.Levels:= [TLogLevel.Info, TLogLevel.Debug]; Controller:= TLoggerController.Create([FileAppender as ILogAppender]); Logger:= TLogger.Create(Controller); //Logger.Levels:= [TLogLevel.Debug, TLogLevel.Info]; try try Logger.Info('Info Message'); Logger.Debug('Debug Message'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; finally Logger.Free; end; end. |
AW: Spring4D Logging
Ich kann grad nicht nachschauen, aber es gibt meistens Samples und va Testfälle, die zeigen, wie man die Klassen nutzen kann. Doku ist leider dünn. :- /
Normalerweise gibt es in der Google Group rasch Antworten, aber da gibt es gerade wohl ein Problem. |
AW: Spring4D Logging
Zitat:
Delphi-Quellcode:
lLogAppenderFile := TFileLogAppender.Create();
lLogAppenderFile.FileName := 'log.txt'; lLogAppenderFile.Format := 'yyyy-mm-dd hh:nn:ss.zzz'; lLogAppenderFile.Levels := lSettings.LogLevels; lLogAppenderCmd := TTextLogAppender.Create(); lLogAppenderCmd.Levels := LOG_BASIC_LEVELS; lLogController := TLoggerController.Create; lLogController.AddAppender(lLogAppenderCmd); lLogController.AddAppender(lLogAppenderFile); (lLogController as TLoggerController).Levels := LOG_ALL_LEVELS; lLogger := TLogger.Create(lLogController); (lLogger as TLogger).Levels := LOG_ALL_LEVELS; |
AW: Spring4D Logging
Ich bin dies auch am evaluieren. Bevor ich da tiefer gehe: Ist für den FileAppender eine automatisch Rotation mit MaxFileSize eingebaut?
Auf die Schnelle habe ich nichts gefunden. Ebenso eine dynamische Loglevel Änderung. Für ein Beispiel wäre ich auch dankbar. |
AW: Spring4D Logging
Zitat:
![]()
Delphi-Quellcode:
Ein kleiner Auszug aus der Logdatei:
program TestLogging;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Classes, mormot.core.base, mormot.core.rtti, mormot.core.log, mormot.core.zip; procedure Test1; var log: ISynLog; begin log := TSynLog.Enter; log.Log(sllInfo, 'Test1 arbeitet'); end; procedure Test2; var list: TStringList; begin list := TStringList.Create; try TSynLog.Add.Log(sllInfo, 'Test2 arbeitet', list); list[0]; finally list.Free; end; end; begin var logFamily: TSynLogFamily := TSynLog.Family; logFamily.Level := LOG_VERBOSE; logFamily.AutoFlushTimeOut := 2; logFamily.HighResolutionTimestamp := False; logFamily.PerThreadLog := ptNoThreadProcess; logFamily.ExceptionIgnore.Add(EConvertError); logFamily.OnArchive := EventArchiveZip; logFamily.ArchiveAfterDays := 1; try Test1; Test2; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
Code:
Die Funktion TSynLog.Enter protokolliert Unit-, Klassen- und Funktionsname mit Quelltext-Zeilennummer. Beim Verlassen der Funktion wird die Ausführungszeit ermittelt. Im Beispiel sind es 42us. Mit dem Aufruf Log kann ein Eintrag hinzugefügt werden. Bei Angabe einer Instanz wird der Unit- und Klassenname mit dem Instanz Pointer aufgeführt. Es stehen 32 vordefinierte Events zur Verfügung. Bei einer Exception wird die Fehlermeldung und der Aufrufpfad, mit allen Unit-, Klassen- und Funktionsname inklusive Zeilennummern aufgelistet. Ein Beispiel aus der Praxis findest du im Quelltext dieses
20230213 20391650 + TestLogging Test1 (19)
20230213 20391651 info Test1 arbeitet 20230213 20391651 - 00.000.042 20230213 20391651 info System.Classes.TStringList(032688f0) Test2 arbeitet 20230213 20391651 EXC EStringListError {Message:"Listenindex außerhalb des gültigen Bereichs (0)"} [Main] at 16a833 System.Classes.pas TStringList.Get (7644) ![]() Bis bald... Thomas |
AW: Spring4D Logging
Das sieht sehr gut aus danke.
|
AW: Spring4D Logging
Zitat:
|
AW: Spring4D Logging
Zitat:
|
AW: Spring4D Logging
Zitat:
![]() Nachtrag: Warum belastet Logging mit mORMot nicht? Dazu folgender Quelltext aus der Unit mormot.core.log, Zeile 4223:
Delphi-Quellcode:
Gibt es keine LogFamily, ist der Overhead nur minimale Pointerei. Wer genau aufgepasst hat, sieht den Fehler in Funktion Test1 im Beispiel. Tipp: Es fehlt eine Prüfung auf Nil.
class function TSynLog.Add: TSynLog;
var P: pointer; begin // inlined TSynLog.Family with direct fGlobalLog check result := pointer(Self); if result <> nil then begin P := PPointer(PAnsiChar(result) + vmtAutoTable)^; if P <> nil then begin // we know TRttiCustom is in the slot, and Private is TSynLogFamily P := TRttiCustom(P).PrivateSlot; result := TSynLogFamily(P).fGlobalLog; // <>nil for ptMergedInOneFile and ptIdentifiedInOneFile (most common case) if result = nil then result := TSynLogFamily(P).SynLog; // ptOneFilePerThread or at startup end else result := nil; // TSynLog.Family/FamilyCreate should have been called end; end; Bis bald... Thomas |
AW: Spring4D Logging
Zitat:
Delphi-Quellcode:
Ich möchte aber auch auch wenn ich die Anwendung im Debugger laufen lasse die Datei fortlaufend schreiben.
procedure TSynLogFamily.StartAutoFlush;
begin if (AutoFlushThread = nil) and not SynLogFileFreeing and (fAutoFlushTimeOut <> 0) {$ifdef ISDELPHI} and (DebugHook = 0) {$endif} then AutoFlushThread := TAutoFlushThread.Create; end; Gibt es ein property welches ich übersehen habe um dies zu tun? Oder muss ich in der mormot.defines.inc das define ISDELPHI rausnehmen? Wohl kaum. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz