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のコンソールを管理者権限で起動して実行してください。

New-EventLog -logname Application -source "Zume" 

3.実際に使ってみる

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

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
}

ログの出力方法など設定情報を定義するNLog.configは下記の通りです。

<?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>

これで準備完了です。
では実際にログを出力する部分を書いてみます。

$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")

4.実行結果

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

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

5.最後に

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

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

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

広告

初めてのpsake ~PowerShelを使ったビルドツール~

0.前置き

初めてAdvent Calenderに挑戦しています。
私の担当は、「PowerShell Advent Calendar 2011」の14日目です。
Webアプリケーション開発の効率化のためによくPowerShellを利用しますが、ブログで取り扱うのは初めてです。

今回のテーマは「psake」(日本の酒と同じ読み方)です。
psakeはPowerShellを使ったビルドツールです。
.NETの開発では、ビルドツールにMsBuildやNAntを利用することがありますが、psakeも同じ用途です。
では、さっそく。

1. psakeとは

psakeとは、PowerShellで書かれたビルドツールです。
アングルブラケット地獄に陥ることなく、PowerShellの機能をふんだんに使えるビルドスクリプトが書けます。
ソースコードと実行モジュールはGitHub上にホストされています。こちら。
NuGet経由で手に入れることも可能です。こちら。

2. 実際にビルドスクリプトを書いてみる

psakeで作るスクリプトは、タスクと、その依存関係を示すコードからなります。
例えばビルドをするスクリプト(タスクのことです)は以下のよう。

task Build{
    Write-Host -ForegroundColor Green "Building"
    exec { msbuild  Sample.csproj } "Error Building" | out-null
}

コンポーネントテストをするスクリプトは以下のよう。

task Test{
    Write-Host -ForegroundColor Green "Testing"
    exec { mstest /testcontainer:Sample.dll } "Error Testing" | out-null
}

そして、これらの実行順序を考慮して、依存関係を示すスクリプトがこんな感じ。

task Full -depends Build, Test

タスクに相当するものとして、一時領域のクリーンアップや、ビルド、コンポーネントテスト、メトリクス取得、テストカバレッジ取得、配置パッケージ作成、などなどが考えられるでしょうか。

3. ビルドしてみる

では、実際にビルドしてみます。
上述したコードをbuild.ps1に格納していると仮定します。

.\psake.ps1 -buildFile "build.ps1" -taskList "Full" -framework "4.0"

psakeの本体は、psake.psm1ですが、いちいちモジュールを読み込むのは面倒だということで
あらかじめヘルパーとして、psake.ps1が用意されています。
普段利用するときは、psake.ps1経由が良いと思います。
引数として渡しているものは、

-buildFile タスクが記述されているPSファイル
-taskList 実行するタスク
-buildFile ビルドに利用する.NET Frameworkのバージョン(何も指定しないと3.5でビルドされる)

です。

GitHubに、ASP.NET Webフォームのサンプルアプリをビルドスクリプトをセットにした、お試しpsakeセットを置きました。
こちらをご参照ください。

4. おわりに

気になるpsakeの採用実績(?)ですが、ちょっと調べました。

プロジェクト名 概要 URL
AutoMapper 規約ベースのマッピングツール https://github.com/AutoMapper/AutoMapper
Soma ORマッパー http://soma.codeplex.com/
Json.NET .NETのJSONフレームワーク http://json.codeplex.com/
Glimpse クライアントからサーバーサイドをデバックできるツール https://github.com/Glimpse/Glimpse

今は自分が担当するプロジェクトにて、psakeで書いたビルドスクリプトをJenkinsに実行させています。
他のビルドツールと比較し、PowerShellで書けるpsakeのほうが管理しやすいです。
PowerShellの恩恵を受けられるのはやはり大きいです。
(PowerShell自体の機能が多いですし、Windowsに標準で入ってきますし。)

今日はこんなところです。
明日は、@RyosukeUemotoさんにバトンタッチです。