Write to Windows event log: Difference between revisions

From Rosetta Code
Content added Content deleted
(Added BBC BASIC)
(→‎{{header|REXX}}: added the REXX language. -- ~~~~)
Line 130: Line 130:
win32evtlogutil.ReportEvent(applicationName, eventID, eventCategory=category,
win32evtlogutil.ReportEvent(applicationName, eventID, eventCategory=category,
eventType=myType, strings=descr, data=data, sid=my_sid)</lang>
eventType=myType, strings=descr, data=data, sid=my_sid)</lang>

=={{header|REXX}}==
This was executed on a (Microsoft) Windows/XP PRO system.
<lang rexx>/*REXX program writes a "record" (event) to the (MS) Windows event log.*/

eCMD = 'EVENTCREATE'
type = 'INFORMATION' /*one of: ERROR WARNING INFORMATION */
id = 234 /*in range: 1 ───► 1000 (inclusive).*/
logName = 'APPLICATION'
source = 'REXX'
desc = 'attempting to add an entry for Rosetta Code demonstration.'
desc = '"' || desc '"' /*enclose DESCription in double quotes.*/

eCMD '/T' type "/ID" id '/L' logName "/SO" source '/D' desc

/*stick a fork in it honey, we're done.*/</lang>
'''output'''
<pre style="overflow:scroll">
SUCCESS: A 'INFORMATION' type event is created in the 'REXX' log/source.
</pre>


=={{header|Ruby}}==
=={{header|Ruby}}==
Line 138: Line 158:


Instructions on setting up an Event Source is [http://rubyforge.org/docman/view.php/85/1734/mc_tutorial.html here]
Instructions on setting up an Event Source is [http://rubyforge.org/docman/view.php/85/1734/mc_tutorial.html here]

=={{header|Tcl}}==
=={{header|Tcl}}==
{{libheader|TWAPI}}
{{libheader|TWAPI}}

Revision as of 19:49, 7 January 2013

Task
Write to Windows event log
You are encouraged to solve this task according to the task description, using any language you may know.

Write script status to the Windows Event Log

BBC BASIC

Writes to the Application Log: <lang bbcbasic> INSTALL @lib$+"COMLIB"

     PROC_cominitlcid(1033)
     
     WshShell% = FN_createobject("WScript.Shell")
     PROC_callmethod(WshShell%, "LogEvent(0, ""Test from BBC BASIC"")")
     
     PROC_releaseobject(WshShell%)
     PROC_comexit</lang>

C#

In Windows Vista and later or Windows Server 2003, you must have administrative privileges to execute this code. <lang csharp>using System.Diagnostics;

namespace RC {

 internal class Program
 {
   public static void Main()
   {
     string sSource  = "Sample App";
     string sLog     = "Application";
     string sEvent   = "Hello from RC!";
     if (!EventLog.SourceExists(sSource))
       EventLog.CreateEventSource(sSource, sLog);
     EventLog.WriteEntry(sSource, sEvent);
     EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Information);
   }
 }

}</lang>

Delphi

<lang Delphi>program WriteToEventLog;

{$APPTYPE CONSOLE}

uses Windows;

procedure WriteLog(aMsg: string); var

 lHandle: THandle;
 lMessagePtr: Pointer;

begin

 lMessagePtr := PChar(aMsg);
 lHandle := RegisterEventSource(nil, 'Logger');
 if lHandle > 0 then
 begin
   try
     ReportEvent(lHandle, 4 {Information}, 0, 0, nil, 1, 0, @lMessagePtr, nil);
   finally
     DeregisterEventSource(lHandle);
   end;
 end;

end;

begin

 WriteLog('Message to log.');

end.</lang>

PicoLisp

PicoLisp doesn't run on Windows. In case of Linux, the equivalent of the event log is the syslog. It can be written with 'native' C functions, or simply with the 'logger' utility: <lang PicoLisp>: (call 'logger "This is a test") -> T

(call 'logger "This" 'is "another" 'test)

-> T</lang>

PureBasic

<lang PureBasic>Procedure WriteToLog(Event_App$,EventMessage$,EvenetType,Computer$)

 Protected wNumStrings.w, lpString=@EventMessage$, lReturnX, CMessageTyp, lparray
 Protected lprawdata=@EventMessage$, rawdata=Len(EventMessage$), Result
 Protected lLogAPIRetVal.l = RegisterEventSource_(Computer$, Event_App$)
 If lLogAPIRetVal
   lReturnX = ReportEvent_(lLogAPIRetVal,EvenetType,0,CMessageTyp,0,wNumStrings,rawdata,lparray,lprawdata
   DeregisterEventSource_(lLogAPIRetVal)
   Result=#True
 EndIf
 ProcedureReturn Result

EndProcedure</lang>

PowerShell

<lang powershell># Create Event Log object $EventLog=new-object System.Diagnostics.EventLog("Application")

  1. Declare Event Source; must be 'registered' with Windows

$EventLog.Source="Application" # It is possible to register a new source (see Note2)

  1. Setup the Event Types; you don't have to use them all, but I'm including all the possibilities for reference

$infoEvent=[System.Diagnostics.EventLogEntryType]::Information $errorEvent=[System.Diagnostics.EventLogEntryType]::Error $warningEvent=[System.Diagnostics.EventLogEntryType]::Warning $successAuditEvent=[System.Diagnostics.EventLogEntryType]::SuccessAudit $failureAuditEvent=[System.Diagnostics.EventLogEntryType]::FailureAudit

  1. Write the event in the format "Event test",EventType,EventID

$EventLog.WriteEntry("My Test Event",$infoevent,70)</lang> Note1: Thanks to PoSH Fan for posting information that got me started on this at Windows PowerShell Blog
Note2: See details on registering a new Event Source with Windows at MSDN

Python

Library: PyWin32

<lang Python>import win32api import win32con import win32evtlog import win32security import win32evtlogutil

ph = win32api.GetCurrentProcess() th = win32security.OpenProcessToken(ph, win32con.TOKEN_READ) my_sid = win32security.GetTokenInformation(th, win32security.TokenUser)[0]

applicationName = "My Application" eventID = 1 category = 5 # Shell myType = win32evtlog.EVENTLOG_WARNING_TYPE descr = ["A warning", "An even more dire warning"] data = "Application\0Data".encode("ascii")

win32evtlogutil.ReportEvent(applicationName, eventID, eventCategory=category, eventType=myType, strings=descr, data=data, sid=my_sid)</lang>

REXX

This was executed on a (Microsoft) Windows/XP PRO system. <lang rexx>/*REXX program writes a "record" (event) to the (MS) Windows event log.*/

   eCMD = 'EVENTCREATE'
   type = 'INFORMATION'         /*one of:  ERROR  WARNING  INFORMATION */
     id =  234                  /*in range:  1 ───►  1000  (inclusive).*/
logName = 'APPLICATION'
 source = 'REXX'
   desc = 'attempting to add an entry for Rosetta Code demonstration.'
   desc = '"' || desc '"'       /*enclose DESCription in double quotes.*/

eCMD '/T' type "/ID" id '/L' logName "/SO" source '/D' desc

                                /*stick a fork in it honey, we're done.*/</lang>

output

SUCCESS: A 'INFORMATION' type event is created in the 'REXX' log/source.

Ruby

Library: win32-utils

<lang ruby>require 'win32/eventlog' logger = Win32::EventLog.new logger.report_event(:event_type => Win32::EventLog::INFO, :data => "a test event log entry")</lang>

Instructions on setting up an Event Source is here

Tcl

Library: TWAPI

<lang tcl>package require twapi

  1. This command handles everything; use “-type error” to write an error message

twapi::eventlog_log "My Test Event" -type info</lang>