【发布时间】:2011-04-27 23:52:48
【问题描述】:
我用 C# 编写了一个程序,它创建一个日志文件并使用 log4net 填充它。该程序启动 powershell 脚本。脚本也应该使用 log4net。我想监控脚本在运行时记录到 log4net 的内容,并将这些信息写入我的日志文件中。
您知道我是如何做到这一点的,或者我从哪里获得信息/帮助解决我的问题?
谢谢
【问题讨论】:
标签: c# .net powershell log4net
我用 C# 编写了一个程序,它创建一个日志文件并使用 log4net 填充它。该程序启动 powershell 脚本。脚本也应该使用 log4net。我想监控脚本在运行时记录到 log4net 的内容,并将这些信息写入我的日志文件中。
您知道我是如何做到这一点的,或者我从哪里获得信息/帮助解决我的问题?
谢谢
【问题讨论】:
标签: c# .net powershell log4net
作为替代方案,您可以重新路由流并在脚本中使用标准的 Write-Error、Write-Verbose 等 CMDlet。
在您的 C# 应用程序中,将方法附加到流事件,如下所示:
PowerShell ps = PowerShell.Create();
// ... code to add your script, etc.
ps.Streams.Warning.DataAdded += new EventHandler<DataAddedEventArgs>(Warning_DataAdded);
// ... attach more streams for other log levels
ps.Invoke();
像这样创建你的方法:
static void Warning_DataAdded(object sender, DataAddedEventArgs e)
{
PSDataCollection<WarningRecord> warningStream = (PSDataCollection<WarningRecord>)sender;
log.Warn(warningStream[e.Index].Message);
}
这应该将您输出的所有内容写入您的 PowerShell 脚本中
Write-Warning "This is a warning message"
到 log4net 中的警告级别。
【讨论】:
您可以定义一些函数并将它们作为变量传递给您的脚本:
static void Log(string message) {
// log4net code here...
}
void ExecuteScript() {
// create the runspace configuration
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
// create the runspace, open it and add variables for the script
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
// pass the Log function as a variable
runspace.SessionStateProxy.SetVariable("Log", (Action<string>)Log);
// etc...
然后你可以像这样从脚本中调用函数:
$Log.Invoke("test")
编辑:要添加日志级别,您应该执行类似的操作
static void Log(LogLevel level,string message) {
// log4net code here...
}
void ExecuteScript() {
// ...
runspace.SessionStateProxy.SetVariable("Log", (Action<LogLevel,string>)Log);
【讨论】:
我没有特定于 log4net 的详细信息,但应该可以像任何其他 .Net 组件一样加载 log4net:
Accessing .NET components from Powershell Powershell Calling .NET Assembly that uses App.config
【讨论】: