在Powershell中使用 NLog ${callsite} 和 ${callsite-linenumber}。

问题描述 投票:2回答:1

我试图用powershell方法配置NLog Dot.Net,没有配置文件,但有两个日志文件。它也能完美地工作。我的问题是${callsite}和${callsite-linenumber}在日志文件中没有正确输出。

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 

我的NLog初始化是Dot.Net,就像在一个方法中一样,因为我不想在我的PS1之外使用一个配置文件。

我的方法。

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

有人知道如何在Powershell中使用这个方法吗?

非常感谢

我的方法是:调用:有谁知道如何在Powershell中使用这个方法?

powershell nlog
1个回答
0
投票

谢谢大家的帮助

我在Powershell中放弃了callsite和callsite-linennumber,因为我换回了C#二进制的CmdLet。

衷心祝愿

克里斯

© www.soinside.com 2019 - 2024. All rights reserved.