![]() |
Systemd Journal mit sd_journal_send
Hallo.
Ich versuche unter Linux einen Systemd basierten Daemon zu erstellen. Nun möchte ich ins Systemd journal Einträge schreiben. Das funktioniert mit sd_journal_print auch.
Delphi-Quellcode:
Aber nun möchte ich sd_journal_send benutzen, da es mehr Möglichkeiten bietet.
const
libsystemd = 'libsystemd.so.0'; function _sd_journal_print(priority: longint; _format: MarshaledAString; args: array of const): longint; cdecl; external libsystemd Name 'sd_journal_print'; procedure sd_journal_print(APriority: LongInt; const AFormat: string) var LMarshaller: TMarshaller; str: MarshaledAString; begin str := LMarshaller.AsAnsi(AFormat, CP_UTF8).ToPointer; _sd_journal_print(APriority, str, []); end;
Delphi-Quellcode:
Das war mein letzter Versuch der allerdings auch nicht geklappt hat. Ich bekommen immer ein Segmentation Fault (11)
function _sd_journal_send(_format: MarshaledAString; args: array of MarshaledAString;ANULL:UINT64): longint; cdecl; external libsystemd Name 'sd_journal_send';
procedure sd_journal_send(APriority: LongInt; const AFormat: string); var LMarshaller: TMarshaller; str: MarshaledAString; begin str := LMarshaller.AsAnsi(AFormat, CP_UTF8).ToPointer; _sd_journal_send(str, [],0); end; begin try sd_journal_send(4,'MESSAGE=Hello World!'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. ChatGPT sagt das es garnicht funktioniert. Dann habe ich ChatGPT gesagt das sd_journal_print auch funktioniert. Darauf hin hat ChatGPT mit folgenden Code geschrieben:
Delphi-Quellcode:
Und als ich ChatGPT dann gefragt habe wo ich die Unit sdjournal herbekomme hat es mir gesagt die müsste ich selber erstellen. Echt schlau :-D
uses
sdjournal; procedure SendToSystemdJournal(const messageText: string; priority: integer); var j: Tsdjournal; begin j := Tsdjournal.Create; try if j.sd_journal_open() = 0 then begin if j.sd_journal_send(['MESSAGE=' + messageText, 'PRIORITY=' + IntToStr(priority), nil]) = 0 then Writeln('Nachricht erfolgreich an das Systemd-Journal gesendet.') else Writeln('Fehler beim Senden der Nachricht an das Systemd-Journal.'); end else Writeln('Fehler beim Öffnen des Systemd-Journals.'); finally j.Free; end; end; begin try // Senden Sie eine Nachricht an das Systemd-Journal SendToSystemdJournal('Dies ist eine Testnachricht aus Delphi.', 5); except on E: Exception do Writeln('Fehler: ' + E.Message); end; end. Nun ja zuürck zum Thema. Der SegFault kommt wahrsheinlich weil die Parameter null terminiert sein müssen. Aber alle Varianten die ich durchgespielt habe funktionieren nicht. Vielleicht kann einer von euch mir dazu helfen. |
AW: Systemd Journal mit sd_journal_send
Ich habe auch mal ChatGPT gefragt, da ich kein Linux habe kann ich es nicht testen aber die definition ist zu Deiner Unterschiedlich
Delphi-Quellcode:
program JournalSendExample;
{$APPTYPE CONSOLE} uses SysUtils, libsystemd; function _sd_journal_send(format: PAnsiChar; args: array of const): Integer; cdecl; external 'systemd' name 'sd_journal_send'; procedure LogToJournal(const message: string); begin _sd_journal_send('MESSAGE=%s', [message]); end; var input: string; begin Write('Enter a log message: '); Readln(input); try LogToJournal(input); Writeln('Log message sent to journal.'); except on E: Exception do Writeln('Error sending log message: ', E.Message); end; Readln; end. |
AW: Systemd Journal mit sd_journal_send
Das funktioniert so erstmal nicht
|
AW: Systemd Journal mit sd_journal_send
Zitat:
![]() ![]()
Delphi-Quellcode:
. Vielleicht hilft es dir weiter.
sd.IsAvailable
Bis bald... Thomas |
AW: Systemd Journal mit sd_journal_send
Diese Unit kannte ich bereits. Und hat mich ein bisschen weitergeholfen.
Delphi-Quellcode:
Die konnte ich auch nicht zum laufen bekommen.
journal_sendv: function(var iov: TIoVec; n: integer): integer; cdecl;
Delphi-Quellcode:
Die Parameter stimmen mit einer Syslog Implementierung über ein.
journal_print: function(priority: integer; args: array of const): integer; cdecl;
![]() Daraus konnte ich dann sd_journal_print zum laufen bringen. |
AW: Systemd Journal mit sd_journal_send
Hey, das schon probiert? :
Delphi-Quellcode:
Oder den String nicht auf dem Procedure Stack abgelegen, sondern auf Heap?//_sd_journal_send(str, [],0); _sd_journal_send(str, [], nil); // <-- |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 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-2025 by Thomas Breitkreuz