PowerShellでlog4netを使用してログを出力する方法

2017 年 3 月 16 日 by sora

PowerShellの処理内でログ出力を行うことがあります。
PowerShellといったら『.NET framework』!ということでlog4netを使用してログ出力を行います。

まずは、Apacheのサイトからlog4netのバイナリをダウンロードします。
必要なファイルは、log4net.dllとlog4net.xmlのみです。

適用している.NET frameworkのバージョンフォルダ内から、log4net.dllとlog4net.xmlをコピーします。

log4net_001

いつも通り、log4net.xmlを編集して、ログの出力方法の設定を行います。

XML:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.     <log4net>
  4.         <appender name="FileAppender" type="log4net.Appender.FileAppender">
  5.             <appendToFile value="true"/>
  6.             <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  7.             <param name="Encoding" value="utf-8" />
  8.             <layout type="log4net.Layout.PatternLayout">
  9.                 <conversionPattern value="%date [%-5level] [%logger] [%username] - %message%newline"/>
  10.             </layout>
  11.         </appender>
  12.         <root>
  13.             <level value="ALL"/>
  14.             <appender-ref ref="FileAppender"/>
  15.         </root>
  16.     </log4net>
  17. </configuration>

今回は、ログの出力ファイル名をPowerShell内で動的に変更したかったので、xmlファイル内では定義しませんでした。

では、PowerShellでログの出力を行います。

$APP_DIR =  `
    [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition) + "\";
$LOG_DIR = $APP_DIR + "log\"
$LOG_FILE = "_ps.log"

#log4netのDLL読み込み
$dllFile = $APP_DIR + "log4net\log4net.dll";
Add-Type -Path $dllFile;

#log4net設定ファイル読み込み
$xmlFile = $APP_DIR + "log4net\log4net.xml";
$configFile = Get-Item $xmlFile;
[log4net.Config.XmlConfigurator]::Configure($configFile);

#ロガーの定義
$logger = [log4net.LogManager]::GetLogger($script:myInvocation.MyCommand.Name);

#ログファイル名
$yyyymmdd = Get-Date -DisplayHint DateTime -Format "yyyyMMdd_HHmmss";
$log_file = $LOG_DIR + $yyyymmdd + $LOG_FILE;

#ロガー設定
$rootLogger = ($logger.Logger.Repository).Root;
[log4net.Appender.FileAppender]$appender =  `
    [log4net.Appender.FileAppender]$rootLogger.GetAppender("FileAppender");
$appender.File = $log_file;
$appender.ActivateOptions();

#ログを出力してみる
$logger.Info("Infoログ");
$logger.Debug("Debugログ");
$logger.Warn("Warnログ");
$logger.Error("Errorログ");
$logger.Fatal("Fatalログ");

try {
    # わざとzero演算
    $a = 1 / 0;
} catch [Exception] {
    $logger.Error($_.ScriptStackTrace);
    $logger.Error($_.exception);
    throw $_;
}

実行すると…

log4net_002

ちゃんとログが出力されました!

タグ:

TrackBack