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:
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;
Aber nun möchte ich sd_journal_send benutzen, da es mehr Möglichkeiten bietet.
Delphi-Quellcode:
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.
Das war mein letzter Versuch der allerdings auch nicht geklappt hat. Ich bekommen immer ein Segmentation Fault (11)
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:
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.
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
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.