Journalisation de powershell-script au programme csharp (log4net – logfile)

J’ai écrit un programme avec C #, qui crée un fichier journal et le remplit en utilisant log4net. Ce programme lance les scripts powershell. Les scripts doivent également utiliser log4net. Je veux surveiller ce que les scripts consignent à log4net pendant leur exécution et écrire cette information dans mon fichier journal.

Avez-vous une idée de la façon dont je fais cela ou de l’endroit où je trouve des informations / de l’aide sur mon problème?

Merci

Vous pouvez définir certaines fonctions et les transmettre à votre script sous forme de variables:

static void Log(ssortingng 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)Log); // etc... 

Ensuite, vous pouvez appeler la fonction à partir du script comme ceci:

 $Log.Invoke("test") 

EDIT : pour append un niveau de journalisation, vous devriez faire quelque chose comme

  static void Log(LogLevel level,ssortingng message) { // log4net code here... } void ExecuteScript() { // ... runspace.SessionStateProxy.SetVariable("Log", (Action)Log); 

Vous pouvez également redirect les stream et utiliser les CMDlets standard Erreur d’erreur, Écriture verbale, etc., dans votre script.

Dans votre application C #, associez des méthodes aux événements de stream, comme suit:

 PowerShell ps = PowerShell.Create(); // ... code to add your script, etc. ps.Streams.Warning.DataAdded += new EventHandler(Warning_DataAdded); // ... attach more streams for other log levels ps.Invoke(); 

Créez vos méthodes comme suit:

 static void Warning_DataAdded(object sender, DataAddedEventArgs e) { PSDataCollection warningStream = (PSDataCollection)sender; log.Warn(warningStream[e.Index].Message); } 

Ceci devrait écrire tout ce que vous écrivez dans votre script PowerShell via

 Write-Warning "This is a warning message" 

au niveau Avertir dans log4net.

Je n’ai pas de détails spécifiques à log4net mais il devrait être possible de charger log4net comme n’importe quel autre composant .Net:

Accès aux composants .NET à partir de Powershell Powershell Appel de .NET Assembly qui utilise App.config