Powershell:如何将log4net对象传递给后台作业?

时间:2010-03-25 14:49:48

标签: powershell-v2.0

我可能正在尝试一种无效的方法,所以我愿意接受任何建议。

我正在运行一系列3个脚本,每个脚本都对IIS服务器上的网站进行分析,而我正在对几百台服务器运行它们。我作为一个Start-Job流程进行了概念验证,因此我可以并行运行并且更快地完成。这些脚本主要是等待WMI和文件系统来收集和返回数据,所以并行等待很有意义。

但是我不能让我的工作记录下来。我正在将数据行传递给脚本并尝试将Log4net $ Logger作为参数发送,但新的Powershell进程无法对其执行任何操作。这是我尝试过的: (在调用脚本中)             $ jobs + = Start-Job -InputObject $ app -FilePath $ command -Name $ app.Name -ArgumentList $ Log

(在被调用的脚本中)

param ([parameter(Mandatory=$false,ValueFromPipeline=$true)]  
$object, 
[parameter(Position=0)] 
$Logger) 

(结果)

Unable to find type [log4net.ThreadContext]: make sure that the assembly containing this type is loaded.

我尝试过在被调用脚本中加载log4net.dll的各种方法。结果是:

Method invocation failed because [Deserialized.log4net.Core.LogImpl] doesn't contain a method named 'Info'

我还试过在被调用的脚本进程中实例化一个新的$ Logger,这确实会导致一些日志操作,但不准确。在20个进程中,我只收到其中9个进程的消息和来自none的所有消息。

不记录不是一种选择。工作很复杂。为脚本的每个实例运行不同的日志可能是可行的,尽管它是一个令人讨厌的讨厌的麻烦。大多数情况下,我只是觉得我在做一些不知情的事情。

1 个答案:

答案 0 :(得分:0)

每个衍生的PowerShell进程都有自己的内存空间。它们之间没有任何共享,因此要求log4net安全地操作多个生成的作业中的文件系统日志是失败的。数据库或事件日志记录适当地处理安全问题并解决了这个问题。