I am trying to configure NLog .NET like in a PowerShell method without a configuration file with two log files. It also works perfectly. My problem is that ${callsite} and ${callsite-linenumber} are not output correctly in the log file. example:
05-06-2020 21:07:01.489 :: (WARN) :: <no type>.CallSite.Target :: 0 :: sdfsdfgsdfghsdfg
05-06-2020 21:07:01.489 :: (WARN) :: <no type>.CallSite.Target :: 0 :: sdfsdfgsdfghsdfg
05-06-2020 21:07:01.489 :: (WARN) :: <no type>.CallSite.Target :: 0 :: sdfsdfgsdfghsdfg
My NLog initialization is .NET-like in a method because I dont want to use a config outside my ps1.
my Method:
Function Initialize-Nlog()
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName = $true, Position=0, ParameterSetName = "INIT")][switch]$Initialize,
[Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName = $true, Position=1, ParameterSetName = "INIT")][ValidateNotNullOrEmpty()][string]$LoggingFileName,
[Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName = $true, Position=2,ParameterSetName = "GETLOGGER")][switch]$GetLoggerI,
[Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName = $true, Position=3,ParameterSetName = "GETLOGGER")][switch]$GetLoggerF
)
process {
if(!$LoggingFileName.ToLower().Contains(".log"))
{
$LoggingFileName += ".log"
}
if($Initialize.IsPresent)
{
[Void] [System.Reflection.Assembly]::LoadFile("$env:windir\NLog.dll")
$logLayout_NORMAL = [string]::Format("{0}", '${message}')
$logLayout_INTERN = [string]::Format("{0} :: {1} :: {2} :: {3} :: {4}", '${date:format=dd\-MM\-yyyy HH\:mm\:ss\.fff}', '(${uppercase:${level}})', '${callsite}', '${callsite-linenumber}', '${message} ${exception}')
#region NORMAL to Console
$tagetC_INFO = New-Object NLog.Targets.ConsoleRowHighlightingRule
$tagetC_INFO.Condition = [NLog.Conditions.ConditionParser]::ParseExpression("level == LogLevel.Info")
$tagetC_INFO.ForegroundColor = [NLog.Targets.ConsoleOutputColor]::White
$tagetC_DEBUG = New-Object NLog.Targets.ConsoleRowHighlightingRule
$tagetC_DEBUG.Condition = [NLog.Conditions.ConditionParser]::ParseExpression("level == LogLevel.Debug")
$tagetC_DEBUG.ForegroundColor = [NLog.Targets.ConsoleOutputColor]::Green
$tagetC_WARN = New-Object NLog.Targets.ConsoleRowHighlightingRule
$tagetC_WARN.Condition = [NLog.Conditions.ConditionParser]::ParseExpression("level == LogLevel.Warn")
$tagetC_WARN.ForegroundColor = [NLog.Targets.ConsoleOutputColor]::Yellow
$tagetC_TRACE = New-Object NLog.Targets.ConsoleRowHighlightingRule
$tagetC_TRACE.Condition = [NLog.Conditions.ConditionParser]::ParseExpression("level == LogLevel.Trace")
$tagetC_TRACE.ForegroundColor = [NLog.Targets.ConsoleOutputColor]::Gray
$tagetC_ERROR = New-Object NLog.Targets.ConsoleRowHighlightingRule
$tagetC_ERROR.Condition = [NLog.Conditions.ConditionParser]::ParseExpression("level == LogLevel.Error")
$tagetC_ERROR.ForegroundColor = [NLog.Targets.ConsoleOutputColor]::Red
$targetC = New-Object NLog.Targets.ColoredConsoleTarget
$targetC.Name = "console"
$targetC.Layout = $logLayout_NORMAL
$targetC.RowHighlightingRules.Add($tagetC_INFO)
$targetC.RowHighlightingRules.Add($tagetC_DEBUG)
$targetC.RowHighlightingRules.Add($tagetC_WARN)
$targetC.RowHighlightingRules.Add($tagetC_TRACE)
$targetC.RowHighlightingRules.Add($tagetC_ERROR)
#endregion
#region INTERN for Internal Error log
$targetI = New-Object NLog.Targets.FileTarget
$targetI.Name = "intern"
$targetI.Encoding = [System.Text.Encoding]::UTF8
$targetI.FileName = [System.IO.Path]::Combine($env:LoggingDirectory, "InstallTools_ERROR.log")
$targetI.ConcurrentWrites = $true
$targetI.ArchiveOldFileOnStartup = $false
$targetI.KeepFileOpen = $false
$targetI.CreateDirs = $true
$targetI.DeleteOldFileOnStartup = $false
$targetI.MaxArchiveFiles = 0
$targetI.Layout = $logLayout_INTERN
#endregion
#region NORMAL to File
$targetF = New-Object NLog.Targets.FileTarget
$targetF.Name = "file"
$targetF.Encoding = [System.Text.Encoding]::UTF8
$targetF.ArchiveOldFileOnStartup = $true
$targetF.ArchiveNumbering = [NLog.Targets.ArchiveNumberingMode]::Date
$targetF.FileName = [System.IO.Path]::Combine($env:LoggingDirectory, $LoggingFileName)
$targetF.ArchiveDateFormat = "yyyy.MM.dd HH.mm.ss"
$targetF.ArchiveFileName = [System.IO.Path]::Combine($env:LoggingDirectory, [System.IO.Path]::GetFileNameWithoutExtension($filePath) + '__{#}.log')
$targetF.ConcurrentWrites = $true
$targetF.ArchiveOldFileOnStartup = $true
$targetF.KeepFileOpen = $false
$targetF.MaxArchiveFiles = -1
$targetF.CreateDirs = $true
$targetF.Layout = $logLayout_NORMAL
#endregion
#region LoggingRules
$LoggingRuleF = New-Object NLog.Config.LoggingRule
$LoggingRuleF.LoggerNamePattern = "logNormal"
$LoggingRuleF.SetLoggingLevels([NLog.LogLevel]::Trace, [NLog.LogLevel]::Fatal)
$LoggingRuleF.Targets.Add($targetF)
$LoggingRuleF.Targets.Add($targetC)
$LoggingRuleI = New-Object NLog.Config.LoggingRule
$LoggingRuleI.LoggerNamePattern = "logIntern"
$LoggingRuleI.SetLoggingLevels([NLog.LogLevel]::Trace, [NLog.LogLevel]::Fatal)
$LoggingRuleI.Targets.Add($targetI)
$LoggingConfig = New-Object NLog.Config.LoggingConfiguration
$LoggingConfig.AddTarget("normal", $targetF)
$LoggingConfig.LoggingRules.Add($LoggingRuleF)
$LoggingConfig.AddTarget("intern", $targetI)
$LoggingConfig.LoggingRules.Add($LoggingRuleI)
#endregion
[NLog.LogManager]::Configuration = $LoggingConfig
}
if($GetLoggerI.IsPresent)
{
return [NLog.LogManager]::GetLogger("logIntern")
}
if($GetLoggerF.IsPresent)
{
return [NLog.LogManager]::GetLogger("logNormal")
}
}
}
Call:
function Test-Me() {
[string]$env:Publisher = 'Citrix'
[string]$env:DisplayName = 'WebSpinner'
[string]$env:DisplayVersion = '1.3.4.675'
$env:LoggingDirectory = "C:\Logs"
$env:LogFileName = $($env:Publisher + " " + $env:DisplayName + " " + $env:DisplayVersion)
Initialize-Nlog -Initialize -LoggingFileName $env:LogFileName
$log = Initialize-Nlog -GetLoggerF
$logError = Initialize-Nlog -GetLoggerI
$log.Info("sdfsdfsdf")
$log.Info("sdfsdfsdf")
$log.Info("sdfsdfsdf")
$log.Info("sdfsdfsdf")
$log.Info("sdfsdfsdf")
$logError.warn("sdfsdfgsdfghsdfg")
$logError.warn("sdfsdfgsdfghsdfg")
$logError.warn("sdfsdfgsdfghsdfg")
$logError.warn("sdfsdfgsdfghsdfg")
$logError.warn("sdfsdfgsdfghsdfg")
$logError.warn("sdfsdfgsdfghsdfg")
}
Test-Me
How can I use this in PowerShell?
Thank for help @ all!
I discarded callsite and callsite-linennumber in PowerShell, because I switched back to a C# binary cmdlet.