Вход из PowerShell-скрипта в csharp-программу (log4net - logfile) - PullRequest
4 голосов
/ 20 октября 2010

Я написал программу на C #, которая создает файл журнала и заполняет его с помощью log4net. Эта программа запускает powershell-скрипты. Скрипты также должны использовать log4net. Я хочу следить за тем, что сценарии записывают в log4net во время их работы, и записать эту информацию в мой файл журнала.

Вы представляете, как я это делаю или где я получаю информацию / помощь по моей проблеме?

спасибо

Ответы [ 3 ]

4 голосов
/ 21 октября 2010

В качестве альтернативы вы можете перенаправить потоки и использовать стандартные записи-ошибки, записи-подробности и т. Д. CMDlets в своем скрипте.

В приложении 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.

4 голосов
/ 20 октября 2010

Вы можете определить некоторые функции и передать их в ваш скрипт как переменные:

    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);
0 голосов
/ 20 октября 2010

У меня нет сведений, специфичных для log4net, но должна быть возможность загрузки log4net, как и любого другого компонента .Net:

Доступ к компонентам .NET из Powershell Вызов Powershell.NET Сборка, которая использует App.config

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...