Corbammims
Der klassische Syslogdamon von UNIX wird aufgeteilt in
Eine einfache Implentierungsmöglichkeit ist, eine Stuktur IDL:Syslog/LogRecordUnix:1.0 zu füllen und einem PushConsumer zu übergeben.
Zusätzlich könnte man eine ähnliche Struktur IDL:Syslog/LogRecordCorba:1.0 definieren.
Mit dem Dynamic Any haben wir noch mehr Flexibilität. Nun kann der Administrator im Interfacerepository eine Struktur umdefinieren.
Da aber
Da man in C++ mit den Klassen potentiell unendlich viele Typen hat, die man ausgeben bzw. loggen will, hat man als Ersatz der printf(3)-Familie die Ausgabe über den <<-Operator geschaffen. Aus diesem Grund wollen wir den Logger auch als ostream haben.
Dazu ist der CorbaLog eine Unterklasse von ostream.
Die Loggingfunktionalität bekommen wir durch das Setzen des logbuf-Streams im Konstruktor.
Diese Idee folgt gradlinig der GNU-Dokumentation. Beim experimentieren zeigte sich, daß bei jedem Buchstaben die Übernahmefunktion aufgerufen wird, was sicherlich nicht das gewünschte Verhalten ist. Es gelang nicht, dieses abzustellen.
Die streambuf-Klassen sind in der libc implementiert, in der libstdc++ sind
nur Wrapper. Man muß also aus der Literatur oder aus der libc die Tricks
herausfinden.
Bis jemand eine bessere Idee hat, freuen wir uns an der Funktionalität.
Unser logbuf sammelt die Eingabe bis zum Zeilentrenner, dann ruft
er eine Callbackfunktion auf. In unserm Falle wird das Logereignis fertiggebaut und abgesendet.
Da die Klasse logbuf unabhängig von CORBA ist, kann man hiermit
auch einen Loggingstream mit syslog(3) bauen und in herkömmliche Programme einbauen.
#pragma prefix ""
module Syslog
{
typedef string Facility;
typedef string Prog;
enum Priority { Alert, // action must be taken immediately
Crit, // critical conditions
Err, // error condition
Warning, // warning Condition
Notice, // normal, but significant, condition
Info, // informational message
Debug // debug message
};
typedef string Location; // Ip-Adresse, Rechnername
typedef long Timestamp;
typedef long Pid;
struct LogRecordUnix
{
Facility facility;
Prog prog;
Location location;
Pid pid;
Timestamp time;
Priority priority;
string message;
};
struct LogRecordCorba
{
Facility facility;
Prog prog;
Location location;
Pid pid;
Timestamp time;
Object obj;
Priority priority;
string message;
};
};
Für Daemons sollte lieber standartmäßig unser syslog-Stream geöffnet werden.
Für GUI-Programme sind zwar beim Entwickeln die Standardkanäle sinnvoll, für den Endnutzer nicht in allen Fällen.