PowerShellとNLog

0.前置き

この記事はPowerShell Advent Calender 2013の16日目のエントリーです。
前日は@jsakamotoさんの「PowerShell の強力なインテリセンス(補完)機能」でした。

1.PowerShellでのログ出力

PowerShellのログ出力、みなさんどうしていますか?
Write-Hostするとか、Out-Fileでファイル出力するとかが多いと思います。
ただPowerShellをシステム運用にがっつり組み込む場合はもっと柔軟なロギングの機構が必要になります。
そこで今回は、NLogとPowerShellを連携させてログを出力する方法をまとめてみようと思います。

1-1.NLogの紹介

.NET用のロギングユーティリティです。
導入が比較的容易で、さまざまな場所(テキストファイル、イベント、コンソール等)、フォーマットでログを出力することができます。
プロジェクトのサイトはこちらです。

2.インストール

今回はインストールは特にありませんが、サンプルを動かすための準備が2つほど。

2-1.NLogのダウンロード

NLogのモジュールを利用するので、
最新のモジュールをこちらからダウンロードしてください。

2-2.イベントソースの登録

今回のサンプルではイベントログにログを出力します。
独自のイベントソースを定義してみようと思います。
ログ種別「Application」、イベントソース名を「Zume」で出力する場合、
下記のスクリプトでイベントソースを登録してあげます。
PowerShellのコンソールを管理者権限で起動して実行してください。
[sourcecode language=”powershell”]
New-EventLog -logname Application -source "Zume"
[/sourcecode]

3.実際に使ってみる

ではさっそくサンプルコードを書いてみます。
ロガーを作るコードはこんな感じ。
※ダウンロードしたNLogのdllはLibフォルダを掘っておいてください。

[sourcecode language=”powershell”]
Add-Type -Path "Lib\NLog.dll”

function New-Logger
{
param (
[parameter(Mandatory=$true)] [string] $LoggerName,
[parameter(Mandatory=$true)] [string] $ConfigPath
)
$config = new-object NLog.Config.XmlLoggingConfiguration($ConfigPath)
([NLog.LogManager]::Configuration) = $config
$logger = [NLog.LogManager]::GetLogger($loggerName)
return $logger
}
[/sourcecode]

ログの出力方法など設定情報を定義するNLog.configは下記の通りです。
[sourcecode language=”xml”]
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<targets>
<target name="logFile" xsi:type="File" fileName="E:\Log\file.txt" />
<target name ="logEvent" xsi:type="EventLog" source="Zume" log="Application" eventId="84" />
</targets>

<rules>
<logger name="*" minlevel="Info" writeTo="logFile" />
<logger name="*" minlevel="Fatal" writeTo="logEvent" />
</rules>
</nlog>
[/sourcecode]

これで準備完了です。
では実際にログを出力する部分を書いてみます。
[sourcecode language=”powershell”]
$logger = New-Logger -LoggerName "TestLogger" -ConfigPath $PWD/"NLog.config"
$logger.Debug("Logging test1")
$logger.Info("Logging test2")
$logger.Error("Logging test3")
$logger.Fatal("Logging test4")
[/sourcecode]

4.実行結果

ファイルには、Infoと、Errorと、Fatalのログが出力されていると思います。
こんな感じ。
テキスト

そして、イベントにも下記のようにログが出力されます。
イベント

5.最後に

いかがでしょうか。
これでPowerShellからもいろいろな場所にいろいろなフォーマットでログを出力できるようになりました!

ちなみに最初はPSLogというNLogインターフェイスのライブラリーを紹介しようと思ったのですが、開発が止まっているし
素でNLog使ったほうが分かりやすいので、今回は素でNLogをPowerShellから利用する方法をご紹介しました。

明日は@guitarrapc_techさん、2回目の登場です!

コメント

タイトルとURLをコピーしました