/***************************************************************************\ | Syslog.cls | | ~~~~~~~~~~ | | A class (to be invoked through ::Requires) to implement a connection | | to a Syslog daemon. Based (loosely) on a Java implementation by | | Jef Poskanzer . | | | | Last modified: 16-May-2001 | \***************************************************************************/ syslogVersion = 2.00 /***************************************************************************\ | Change history | |***************************************************************************| | Version Date Reason | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | 1.00 24-Nov-1999 Split out from embedding in my Nntpd.cmd | | 1.10 04-Feb-2001 Minor cosmetic corrections in format for public'tn | | 2.00 16-May-2001 Use more Rexx-like WordPos vice switch statement | | | \***************************************************************************/ /***************************************************************************\ | | | CLASS Syslog | | | | Parameters: | | Ident: String giving name of program doing logging | | Facility: Mnemonic or numerical code for facility doing logging | | | | Returns: | | | | Notes: | | | \***************************************************************************/ ::Class Syslog Public ::Method init expose TheIdent TheFacility TheSocket LocalHost. Priorities use arg TheIdent, facility if TheIdent = "" then TheIdent = "Unknown" /**TODO** Get PID & TID of thread ??? */ TheSocket = SockSocket( "AF_INET", "SOCK_DGRAM", "0" ) if TheSocket < 0 then do SAY "Cannot create UDP socket for syslog from" TheIdent TheFacility return end Facilities = "LOG_KERN LOG_USER LOG_MAIL LOG_DAEMON LOG_AUTH LOG_SYSLOG", "LOG_LPR LOG_NEWS LOG_UUCP XXX XXX XXX XXX XXX XXX LOG_CRON", "LOG_LOCAL0 LOG_LOCAL1 LOG_LOCAL2 LOG_LOCAL3 LOG_LOCAL4 LOG_LOCAL5", "LOG_LOCAL6 LOG_LOCAL7" Priorities = "LOG_EMERG LOG_ALERT LOG_CRIT LOG_ERR LOG_WARNING", "LOG_NOTICE LOG_INFO LOG_DEBUG" LocalHost.!addr = "127.0.0.1" /* Canonical localhost */ LocalHost.!family = "AF_INET" LocalHost.!port = 514 /* Well-Known Port for syslog */ if DataType( facility, "W" ) then if facility>= 0 & facility <= 23 then TheFacility = 8 * facility else TheFacility = -1 else do facility = Translate( facility ) /* Uppercase it */ if Left( facility, 4 ) ェ= "LOG_" then facility = "LOG_" || facility /* Prepend if not already present */ TheFacility = Facilities~WordPos( facility ) - 1 if TheFacility>= 0 then TheFacility = 8 * TheFacility end /* textual facility parameter */ if TheFacility < 0 then do SAY "Unrecognized facility:" facility self~Close end if TheSocket> 0 then do self~Send( "LOG_DEBUG", "Socket" TheSocket "assigned to", facility":"TheIdent ) end ::Method uninit /* Discard socket when no longer required */ self~Close ::Method Close Private expose TheSocket if TheSocket> 0 then if SockShutdown( TheSocket, 2 ) = 0 then if SockClose( TheSocket ) = 0 then NOP else SAY "Error closing socket" TheSocket errno else SAY "Error shutting socket" TheSocket errno TheSocket = -1 ::Method Send expose TheIdent TheFacility TheSocket LocalHost. Priorities use arg priority, message if TheSocket < 0 then return /* Cannot log */ if DataType( priority, 'W' ) then pricode = priority else do pricode = Translate( priority ) if Left( pricode, 4 ) ェ= "LOG_" then pricode = "LOG_" || pricode pricode = Priorities~WordPos( pricode ) - 1 end /* Textual priority */ if pricode < 0 | pricode> 7 then do if TheIdent = "Syslog" then SAY "ALARM! Syslog cannot create internal message" else .Syslog~new( 'Syslog', 'LOG_SYSLOG' )~~Send( 'LOG_WARNING',, "Unknown priority " || priority || " for " || TheIdent ||, " (" || message || ")" ) return end pricode = TheFacility + pricode message = "<" || pricode || ">" TheIdent || ":" message rc = SockSendTo( TheSocket, message, "LocalHost.!" ) if rc < 0 then do if TheIdent = "Syslog" then SAY "ALARM! Syslog cannot send internal message" else .Syslog~new( 'Syslog', 'LOG_SYSLOG' )~~Send( 'LOG_WARNING',, "Error sending '" || message || "' to " || TheIdent ) end return 

AltStyle によって変換されたページ (->オリジナル) /