[Mono-list] Syslog Access
Craig Dayton
cadayton@starband.net
Mon, 16 Aug 2004 21:35:10 -0700
Perhaps exploring the possibility of using PerlNet a product marketed by
ActiveState might be a cost effective solution.
With PerlNet, one can define an Interface to any module on CPAN and compile
it as a library or executable. So from a developer's prospective, a
programmer can leverage modules in CPAN and the .NET community all within a
single executable. Thanks to Mono this capability is now extended to the
Unix world. No sense in reinventing the wheel is there?
-Craig
>-----Original Message-----
>From: mono-list-admin@lists.ximian.com
>[mailto:mono-list-admin@lists.ximian.com] On Behalf Of Jonathan Pryor
>Sent: Monday, August 16, 2004 18:56
>To: Clint Fairchild
>Cc: mono-list@lists.ximian.com
>Subject: Re: [Mono-list] Syslog Access
>
>
>On Mon, 2004-08-16 at 17:34, Clint Fairchild wrote:
>> Is there a simple solution to access syslog with C#? I'm attempting
>> to write a daemon.
>
>The answer should be System.Diagnostics.EventLog. Alas, it
>isn't, because no one has implemented a shim to make syslog
>look like a Windows Event Log yet. Sorry, it hasn't been a priority.
>
>You'll have to P/Invoke syslog(3) directly. Lucky you, I
>wrote a short demo of "Hello, world" for syslog(3). Unlucky
>you, I was lazy and used the constant values in
>/usr/include/sys/syslog.h on Fedora Core 2. This should be
>good for Linux systems, but the constants will have different
>values on other Unix platforms, so a "real" solution would
>mimic Mono.Posix.
>
> // syslog example:
> using System;
> using System.Runtime.InteropServices;
>
> class Syslog_h {
> [Flags]
> public enum Option {
> Pid = 0x01,
> Console = 0x02,
> Delay = 0x04,
> NoDelay = 0x08,
> NoWait = 0x10,
> PrintError = 0x20
> }
>
> [Flags]
> public enum Facility {
> Kernel = 0 << 3,
> User = 1 << 3,
> Mail = 2 << 3,
> Daemon = 3 << 3,
> Auth = 4 << 3,
> Syslog = 5 << 3,
> Lpr = 6 << 3,
> News = 7 << 3,
> Uucp = 8 << 3,
> Cron = 8 << 3,
> AuthPriv = 10 << 3,
> Ftp = 11 << 3,
> Local0 = 16 << 3,
> Local1 = 17 << 3,
> Local2 = 18 << 3,
> Local3 = 19 << 3,
> Local4 = 20 << 3,
> Local5 = 21 << 3,
> Local6 = 22 << 3,
> Local7 = 23 << 3,
> }
>
> [Flags]
> public enum Level {
> Emerg = 0,
> Alert = 1,
> Crit = 2,
> Err = 3,
> Warning = 4,
> Notice = 5,
> Info = 6,
> Debug = 7
> }
>
> // Note that `ident' is an IntPtr, not a string;
> // see Demo.Main() for why
> [DllImport ("libc")]
> public static extern void openlog (IntPtr ident,
> Option option, Facility facility);
>
> [DllImport ("libc")]
> public static extern void syslog (int priority,
> string message);
>
> [DllImport ("libc")]
> public static extern void closelog ();
> }
>
> class Demo {
> public static void Main (string[] args)
> {
> // Ident needs to be an IntPtr, not a string,
> // as syslog doesn't copy the string; it
> // assumes that the string won't change.
> // Since strings are garbage collected, the
> // string will eventually be collected, causing
> // syslog(3) to print garbage for the ident
> // unless we make sure `ident' is allocated in
> // unmanaged memory:
> IntPtr ident = Marshal.StringToHGlobalAnsi (
> "this is my ident");
> Syslog_h.openlog (ident,
> Syslog_h.Option.Console |
>Syslog_h.Option.Pid |
> Syslog_h.Option.PrintError,
> Syslog_h.Facility.User);
> Syslog_h.syslog ((int) Syslog_h.Facility.User |
> (int) Syslog_h.Level.Debug,
> "Hello, syslog!");
> Syslog_h.closelog ();
> Marshal.FreeHGlobal (ident);
> }
> }
>
> - Jon
>
>
>_______________________________________________
>Mono-list maillist - Mono-list@lists.ximian.com
>http://lists.ximian.com/mailman/listinfo/mono->list
>