First, you want to determine what Log Name and custom Source you want to use/create. Since my scripts typically affect applications, I use the Application log, but System might be good in some instances. For this example I will use "SteimleEvents" as my new custom source.
New-EventLog -LogName Application -Source SteimleEvents
We could then verify the Source is working with the log by running:
Get-EventLog -Logname Application -Source SteimleEvents -ErrorAction SilentlyContinue
This is fine the first time, but what if I have a new script which will utilize this Source? I would build logic into the script to check for the Source, and if it does not exist, create it. This can be tricky, because an empty source and a non-existent source give the same error. In our logic below.
EDIT: Note that my writing logic does not match my scriping logic, and the function New-EventLogEntry is required, which is provided below (highlighting red). The entire script flow is included at the end of this post.
$Source = 'SteimleEvents'
if(Get-EventLog -Logname Application -Source $Source -ErrorAction SilentlyContinue){
# this indicates that the log, and a
# log entry were found for the if
# condition
New-EventLogEntry -Information -Message "There is an existing event log for $Source"
} else {
# the if was false, so we try to
# create the log/source, and pass the
# error to a variable
New-EventLog -LogName Application -Source $Source -ErrorAction SilentlyContinue -ErrorVariable TestSource
if($TestSource -match 'already registered'){
# if a match is found, then the log
# exists, so we log that
New-EventLogEntry -Information -Message "There is an existing event log for $Source"
} else {
New-EventLogEntry -Information -Message "Initializing event log for $Source"
}
}
Now that we have our log, we can start utilizing it. I have created two functions and a preliminary hashtable for parameter:
# Define basic event parameters
$EventParameters = @{
'LogName' = 'Application'
'Source' = $Source
}
# Function to clear added parameters
function Initialize-EventParameters{
$script:EventParameters = @{
'LogName' = 'Application'
'Source' = $script:Source
}
}
# Function to create an eventlog entry
function New-EventLogEntry{
param(
[switch]$Error,
[switch]$Warning,
[switch]$Information,
[string]$Message
)
if($Error){
$EventID = 1113
$EntryType = 'Error'
} elseif($Warning){
$EventID = 1112
$EntryType = 'Warning'
} else {
$EventID = 1111
$EntryType = 'Information'
}
Initialize-EventParameters
$script:EventParameters += @{
'EventId' = $EventID
'EntryType' = $EntryType
'Message' = $Message
}
Write-EventLog @EventParameters
}
The hashtable $EventParameters is created as an initialization in the script-level scope.
The function Initialize-EventParameters is called to reset $EventParameters to its initialized values.
Finally, New-EventLogEntry adds an event log entry. The function accepts three parameters:
- Error
- Warning
- Information
- Message
Including switches for 'EntryType' will make decisions based on priority. I am not great with parameters, so if you call -Error and -Information the decision tree will make your entry an Error. The -Message switch includes what you want the log entry to say. So use of the function would look like:
New-EventLogEntry -Error -Message "Oh no! Something went wrong!"
Or, you could call -ErrorVariable on every commandlet, and if it has a length, log it. Note that not all commandlets return errors, Test-Path does not, but Test-Connection does.
Get-Content C:\Temp\NotARealFile.txt -ErrorVariable result
if($result.Length -gt 0){
New-EventLogEntry -Error -Message "C:\Temp\NotARealFile.txt not found"
}
Entire Script Section
# Define Source
$Source = "SteimleEvents"
# Define basic event parameters
$EventParameters = @{
'LogName' = 'Application'
'Source' = $Source
}
# Function to clear added parameters
function Initialize-EventParameters{
$script:EventParameters = @{
'LogName' = 'Application'
'Source' = $script:Source
}
}
# Function to create an eventlog entry
function New-EventLogEntry{
param(
[switch]$Error,
[switch]$Warning,
[switch]$Information,
[string]$Message
)
if($Error){
$EventID = 1113
$EntryType = 'Error'
} elseif($Warning){
$EventID = 1112
$EntryType = 'Warning'
} else {
$EventID = 1111
$EntryType = 'Information'
}
Initialize-EventParameters
$script:EventParameters += @{
'EventId' = $EventID
'EntryType' = $EntryType
'Message' = $Message
}
Write-EventLog @EventParameters
}
# test for existing event log for this application; if it does not exist, create it
if(Get-EventLog -Logname Application -Source $Source -ErrorAction SilentlyContinue){
New-EventLogEntry -Information -Message "There is an existing event log for $Source"
} else {
New-EventLog -LogName Application -Source $Source -ErrorAction SilentlyContinue -ErrorVariable TestSource
if($TestSource -match 'already registered'){
New-EventLogEntry -Information -Message "There is an existing event log for $Source"
} else {
New-EventLogEntry -Information -Message "Initializing event log for $Source"
}
}