LoginSignup
8
5

More than 3 years have passed since last update.

Serilogを使ってUWPアプリでログを出力できるようにする

Last updated at Posted at 2020-08-24

背景

UWPアプリでログを出力できるようにしようとNLogを使おうとしたのですが、出力できませんでした。
いろいろ調べてみたところ、以下が候補として上がりました。

MetroLogは更新履歴が数年前で止まっていて、使えなさそうだと判断し、Serilogを使うことにしました。
また、日本語での情報がほとんどなかったので、記事として残そうと思います。
(UWPアプリ開発されている人が少ないんですね。。)

Serilogとは

公式サイトによると、

.NET用の他の多くのライブラリと同様に、Serilogはファイル、コンソール、その他の場所への診断ロギングを提供します。セットアップが簡単で、APIがクリーンで、最近の.NETプラットフォーム間での移植性があります。

他のロギングライブラリとは異なり、Serilogは強力な構造化イベントデータを念頭に置いて構築されています。

とのことです。
プラットフォームとしては、NET 4.5+, Windows (8/WinRT/Universal+) and Windows Phone 8+をサポートしています。

インストール方法

必要なのは、

  • Serilog
  • Serilog.Sinks.File

になります。

[ツール] > [NuGet パッケージ マネージャー] > [パッケージ マネージャー コンソール]で下記のコマンドを実行するか、

PM> Install-Package Serilog
PM> Install-Package Serilog.Sinks.File

ソリューション エクスプローラーで [参照] を右クリックし、 [NuGet パッケージの管理] を選択し、「Serilog」で検索して最新版をインストールしてください。

設定方法

以下のようにLoggerConfigurationクラスを使って設定を行います。

string logFilePath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "logs/log.txt");
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.File(logFilePath, rollingInterval: RollingInterval.Day)
    .CreateLogger();

MinimumLevelはログ出力の最小レベル、WriteTo.Fileは出力先ファイルを示しています。
ApplicationData.Current.LocalFolder.Pathはローカルストアを示していて、その中にlogsフォルダを作成して、さらにその下にlogが保存される仕組みです。
また、rollingIntervalはファイルの分割単位を示していて、RollingInterval.Dayは日毎にログファイルを分割する設定です。
ちなみに、ファイル容量はデフォルトで1GB、ファイル数は直近の31ファイルまで(1ヶ月分)保存されます。
(ファイル容量とファイル数の設定を変更することも可能ですが、今回は割愛します)

上記のように設定すると、c:\users\<user name>\AppData\Local\Packages\<app package identifier>\LocalState\logsに、以下のようにログファイルが保存されていきます。

log20180631.txt
log20180701.txt
log20180702.txt

他にも様々な設定ができるようなので、必要あればまた調べてみたいと思います。

使用方法

ログレベルごとに関数が用意されており、単純に出力したいログレベルの関数に文字列を渡すだけです。
ここは他のロガーライブラリと同様かと思います。

Log.Information("Informationレベルで出力されます");
Log.Debug("Debugレベルで出力されます");
Log.Warning("Warningレベルで出力されます");
Log.Error("Errorレベルで出力されます");

便利な使い方

一例として、以下のようなLogUtilクラス(ラッパークラス)を作っておくとかなり楽になります。
参考にしてみてください。

LogUtil.cs
public static class LogUtil
{
    private static bool isInitialized = false;
    public static void Information(string message)
    {
        if (!isInitialized)
        {
            Initialize();
        }
        Log.Information(message);
    }
    public static void Debug(string message)
    {
        if (!isInitialized)
        {
            Initialize();
        }
        Log.Debug(message);
    }
    public static void Warning(string message)
    {
        if (!isInitialized)
        {
            Initialize();
        }
        Log.Warning(message);
    }
    public static void Error(string message)
    {
        if (!isInitialized)
        {
            Initialize();
        }
        Log.Error(message);
    }
    private static void Initialize()
    {
        string logFilePath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "logs/log.txt");
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .WriteTo.File(logFilePath, rollingInterval: RollingInterval.Day)
            .CreateLogger();
        isInitialized = true;
        Log.Debug("Initialized Serilog");
    }
}

参考URL

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5