首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在NLog中使用PowerShell中的$ ${callsite}和${}

在NLog中使用PowerShell中的$ ${callsite}和${}
EN

Stack Overflow用户
提问于 2020-06-05 19:40:07
回答 1查看 421关注 0票数 2

我正在尝试配置NLog .NET,就像在没有两个日志文件的配置文件的PowerShell方法中。它也工作得很完美。我的问题是,在日志文件中没有正确地输出${callsite}和${callsite-linenumber}。示例:

代码语言:javascript
代码运行次数:0
运行
复制
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初始化与.NET类似,因为我不想在ps1之外使用配置。

我的方法:

代码语言:javascript
代码运行次数:0
运行
复制
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")
        }
    }
}

呼叫:

代码语言:javascript
代码运行次数:0
运行
复制
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中使用这个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-10 12:31:25

谢谢大家的帮助!

我放弃了PowerShell中的callsite和,因为我切换回了一个C#二进制cmdlet。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62223012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档