尝试使Log4net与PowerShell配合使用(混合使用log4net配置文件) [英] Trying to get log4net working with PowerShell (with a log4net config file in the mix)
问题描述
我一直在努力使log4net与PowerShell一起使用.我有以下PowerShell代码,它使用配置文件插入log4net,然后尝试进行简单的日志文件输入,但会出错.
I have been struggling with getting log4net working with PowerShell. I have the following PowerShell code that pulls in log4net with a configuration file and then attempts to make a simple log file entry but which errors out.
Clear-History
Clear-Host
#
Write-Host "BEGIN: Importing module psm_logger.psm1"
Import-Module "C:\Users\Administrator\Desktop\ps\IIS\psm_logger.psm1" -Force
Write-Host "BEGIN: log4net configuration definition"
$log = New-Logger -Configuration "C:\Users\Administrator\Desktop\ps\IIS\logging\log4net.config" -Dll "C:\Users\Administrator\Desktop\ps\IIS\logging\log4net.dll"
Write-Host "END: log4net configuration definition"
Write-Host "BEGIN: log4net configuration DEBUG definition"
#$log.DebugFormat("Logger configuration file is : '{0}'", (Resolve-Path "C:\Users\Administrator\Desktop\ps\IIS\logging\log4net.config"))
Write-Host "END: log4net DEBUG configuration definition"
#======================
$ThisHostname = $env:COMPUTERNAME
#======================
Write-Host "BEGIN: Module/Snapin import/addition"
Write-Host ""
$log.Info("BEGIN: Module/Snapin import/addition")
#======================
上面引用的psm_logger.psm1文件包含:
The above referenced psm_logger.psm1 file contains:
function New-Logger
{
#Write-Host "BEGIN: New-Logger"
<#
.SYNOPSIS
This function creates a log4net logger instance already configured
.OUTPUTS
The log4net logger instance ready to be used
#>
[CmdletBinding()]
Param
(
[string]
# Path of the configuration file of log4net
$Configuration,
[Alias("Dll")]
[string]
# Log4net dll path
$log4netDllPath
)
Write-Verbose "[New-Logger] Logger initialization"
$log4netDllPath = Resolve-Path $log4netDllPath -ErrorAction SilentlyContinue -ErrorVariable Err
if ($Err)
{
throw "Log4net library cannot be found on the path $log4netDllPath"
}
else
{
Write-Verbose "[New-Logger] Log4net dll path is : '$log4netDllPath'"
[void][Reflection.Assembly]::LoadFrom($log4netDllPath) | Out-Null
# Log4net configuration loading
$log4netConfigFilePath = Resolve-Path $Configuration -ErrorAction SilentlyContinue -ErrorVariable Err
if ($Err)
{
throw "Log4Net configuration file $Configuration cannot be found"
}
else
{
Write-Verbose "[New-Logger] Log4net configuration file is '$log4netConfigFilePath' "
$FileInfo = New-Object System.IO.FileInfo($log4netConfigFilePath)
[log4net.Config.XmlConfigurator]::Configure($FileInfo)
$script:MyCommonLogger = [log4net.LogManager]::GetLogger("root")
Write-Verbose "[New-Logger] Logger is configured"
return $MyCommonLogger
}
}
}
log4net的配置文件如下:
The configuration file for log4net looks like:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" **requirePermission="false"**/>
</configSections>
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="C:\Users\Administrator\Desktop\ps\IIS\LOGS\LogTest2.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header]\r\n" />
<param name="Footer" value="[Footer]\r\n" />
<param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="LogFileAppender" />
</root>
</log4net>
</configuration>
运行时,输出AND产生的错误是:
When run the output AND error produced is:
BEGIN:导入模块psm_logger.psm1 开始:log4net配置定义 结束:log4net配置定义 开始:log4net配置调试定义 结束:log4net DEBUG配置定义 开始:模块/管理单元导入/添加
BEGIN: Importing module psm_logger.psm1 BEGIN: log4net configuration definition END: log4net configuration definition BEGIN: log4net configuration DEBUG definition END: log4net DEBUG configuration definition BEGIN: Module/Snapin import/addition
方法调用失败,因为[System.Object []]不包含名为"Info"的方法. 在C:\ Users \ Administrator \ Desktop \ ps \ IIS \ IIS_IIS_localLogs.ps1:18 char:10 + $ log.Info<<<< ("BEGIN:模块/管理单元导入/添加") + CategoryInfo:InvalidOperation:(Info:String)[],RuntimeException + FullyQualifiedErrorId:MethodNotFound
Method invocation failed because [System.Object[]] doesn't contain a method named 'Info'. At C:\Users\Administrator\Desktop\ps\IIS\IIS_localLogs.ps1:18 char:10 + $log.Info <<<< ("BEGIN: Module/Snapin import/addition") + CategoryInfo : InvalidOperation: (Info:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound
任何帮助将不胜感激!
(仅供参考:我最初是从此处的最佳做法博客条目中获得此代码的:
(FYI: I originally got this code from a best practices blog entry here: http://blog.octo.com/en/powershell-v2-my-best-practices/ which I found very helpful)
推荐答案
New-Logger是一个非常有用的cmdlet,值得为Powershell的较新版本进行更新. psm_logger.psm1当前在PS V3及更高版本下给出System.Void错误.将装配载荷更改为
New-Logger is such a useful cmdlet, it's worth updating for newer versions of Powershell. psm_logger.psm1 currently gives a System.Void error under PS V3 and later. Changing the assembly load to
[Reflection.Assembly]::LoadFrom($log4netDllPath) | Out-Null
没有[无效]可以解决问题.
without the [Void] sorts out the problem.
这篇关于尝试使Log4net与PowerShell配合使用(混合使用log4net配置文件)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!