This is a PowerCLI script that will script setting up your ESXi host syslogging in two places: A Shared Datastore (that all ESXi hosts have visibility of) and to a remote Syslog host on the network. Alternatively, you could set it to change the Syslog directory to a different local path on each ESXi host (rather than the default). The two advanced configuration settings we’ll be working with are:
- Syslog.global.logDir
- Syslog.global.logHost
Why did I do this? Well, tonight I got a little sidetracked after looking into a small warning on a new scripted ESXi host I deployed – it had not automatically set up logging during installation, my guess, was because it’s local datastore had failed to initialise during installation – I couldn’t see a local datastore after deploying it via a script and had received a warning during installation. I went ahead just to see what happened. This was a new test host in my home lab. So afterwards, I decided I would set it up a remote Syslog location to clear the warning off. Naturally, I wanted to do this in PowerCLI.
The following script will take a few options you specify like Shared Datastore name, Syslogging Folder Name, and a remote Syslog host, and go ahead and configure all the ESXi hosts in your specified DataCenter object to use these options you specify. If you have only one datacenter object the script will see this and use that one by default. Otherwise it will ask you for the name of the specific DataCenter you want to work with. It will then create a “ESXi-Syslogging” folder on the shared datastore you specified (if it doesn’t already exist) and under this, create a sub-folder for each ESXi host. It will then configure each ESXi host to send it’s Syslog info to this datastore. As far as I can tell, certain Sysl0g files are linked from /scratch/log on each ESXi host to the datastore specified. For example:
usb.log becomes:
usb.log -> /vmfs/volumes/1bec1487-1189988a/ESXi-Syslogging/esxi-04.noobs.local/usb.log
Naturally, this wouldn’t be a good idea if the ESXi host could potentially lose access to this datastore, so the script will also specify a remote Syslog host to log to. If you don’t have one, check out the Free “Kiwi Syslog Server”. Here is the resulting script (download via URL below or just copy the script out the block):
[download id=”4″]
# Remote Syslogging setup for ESXi Hosts in a particular datacenter object # By Sean Duffy (http://www.shogan.co.uk) # Version 1.0 # Get-Date = 15/12/2011 #region Set variables up $SyslogDatastore = "SharedDatastore2" # The name of the Shared Datastore to use for logging folder location - must be accessible to all ESXi hosts $SyslogFolderName = "ESXi-Syslogging" # The name of the folder you want to use for logging - must NOT already exist $RemoteSyslogHost = "udp://192.168.0.85:514" #specify your own Remote Syslog host here in this format $DataCenters = Get-Datacenter $FoundMatch = $false $SyslogDatastoreLogDir = "[" + $SyslogDatastore + "]" #endregion #region Determine DataCenter to work with if (($DataCenters).Count -gt 1) { Write-Host "Found more than one DataCenter in your environment, please specify the exact name of the DC you want to work with..." $DataCenter = Read-Host foreach ($DC in $DataCenters) { if ($DC.Name -eq $DataCenter) { Write-Host "Found Match ($DataCenter). Proceeding..." $FoundMatch = $true break } else { $FoundMatch = $false } } if ($FoundMatch -eq $false) { Write-Host "That input did not match any valid DataCenters found in your environment. Please run script again, and try again." exit } } else { $DataCenter = ($DataCenters).Name Write-Host "Only one DC found, so using this one. ($DataCenter)" } #endregion #Enough of the error checking, lets get to the script! $VMHosts = Get-Datacenter $DataCenter | Get-VMHost | Where {$_.ConnectionState -eq "Connected"} cd vmstore: cd ./$DataCenter cd ./$SyslogDatastore if (Test-Path $SyslogFolderName) { Write-Host "Folder already exists. Configure script with another folder SyslogFolderName & try again." exit } else { mkdir $SyslogFolderName cd ./$SyslogFolderName } # Crux of the script in here: foreach ($VMHost in $VMHosts) { if (Test-Path $VMHost.Name) { Write-Host "Path for ESXi host log directory already exists. Aborting script." exit } else { mkdir $VMHost.Name Write-Host "Created folder: $VMHost.Name" $FullLogPath = $SyslogDatastoreLogDir + "/" + $SyslogFolderName + "/" + $VMHost.Name Set-VMHostAdvancedConfiguration -VMHost $VMHost -Name "Syslog.global.logHost" -Value $RemoteSyslogHost Set-VMHostAdvancedConfiguration -VMHost $VMHost -Name "Syslog.global.logDir" -Value $FullLogPath Write-Host "Paths set: HostLogs = $RemoteSyslogHost LogDir = $FullLogPath" } }
Some results of running the above in my lab:
Lastly, I have found that these values won’t update if they are already populated with anything other than the defaults (especially the LogDir advanced setting). You’ll get an error along the lines of:
Set-VMHostAdvancedConfiguration : 2011/12/15 11:37:01 PM Set-VMHostAdvancedConfigurati on A general system error occurred: Internal error
If this happens, you could either set the value to an empty string, i.e. “” or you could use Set-VMHostAdvancedConfiguration [[-NameValue] <Hashtable>] (using a hashtable of the advanced config setting as the NameValue) to set things back to the way they were originally. The default value for Syslog.global.logDir is = [] /scratch/log for example. It might be a good idea to grab this value and pipe it out into a file somewhere safe before you run the script in case you need to revert back to the default Syslog local location – you would then know what the value should be. You could use something like this to grab the value and put it into a text file:
Get-VMHostAdvancedConfiguration -VMHost $VMHost -Name "Syslog.global.logDir" | Out-File C:\default-sysloglocation.txt
Also, remember to think this out carefully before changing in your own environment – it may not suit you at all to set your Syslog location to anywhere else other than the local disk of each host. However, you may find it useful to automatically set the remote syslog host advanced setting for each of your ESXi hosts – in that case, simply modify the script above to only apply the one setting instead of both. I hope this helps, and as always, if you have any suggestions, improvements or notice any bugs, please feel free to add your comments.
For the (Get-VMHost) you should try and select the specific host you want to target – it might be trying to fetch a list of all ESXi hosts using just “get-vmhost”. So do something like this:
Get-AdvancedSetting -Entity (Get-VMHost 192.168.0.50) -Name Syslog……
Where the IP address is the IP or name of the Host system you are targeting.
Afternoon Sir
Stuck on the A general System Error occurred , I can set the “” value , but when I put in my actual syslog FQDN it dumps with that error . When I use the OLD cmdlets , it says it was depreciated and may no longer be used . Mnnnnn
Get-AdvancedSetting -Entity (Get-VMHost) -Name Syslog.global.logHost | Set-AdvancedSetting -Value Syslogng -Confirm:$false
Gives me >
Set-AdvancedSetting : 2016/01/14 12:00:42 PM Set-AdvancedSetting A general system error occurred: Internal error
At line:1 char:72
+ Get-AdvancedSetting -Entity (Get-VMHost) -Name Syslog.global.logHost | Set-Advan …
+ ~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Set-AdvancedSetting], SystemError
+ FullyQualifiedErrorId : Client20_SystemManagementServiceImpl_GetVmHostAdvancedConfiguration_ViError,VMware.VimAutomation.ViCore.Cmdlets.Commands.SetAd
vancedSetting
Any ideas .