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 version="1.0" encoding="utf-8" ?>
<configuration>
	<log4net>
		<appender name="FileAppender" type="log4net.Appender.FileAppender">
			<appendToFile value="true"/>
            <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
            <param name="Encoding" value="utf-8" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%date &#91;%-5level&#93; &#91;%logger&#93; &#91;%username&#93; - %message%newline"/>
			</layout>
		</appender>
		<root>
			<level value="ALL"/>
			<appender-ref ref="FileAppender"/>
		</root>
	</log4net>
</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