C# Tips | ログ・例外・診断:OS情報取得

C# C#
スポンサーリンク

はじめに:OS情報取得は「どんな土台の上で動いているか」を知るためのもの

業務システムで地味に効いてくるのが、「OS の違い」です。 同じ C# コードでも、

  • Windows Server のバージョンが違う
  • Linux コンテナか、オンプレ Windows か
  • 32bit/64bit の違い

などによって、挙動や制限が変わることがあります。

そこで役に立つのが OS情報取得 です。 「このアプリは、どの OS・どのバージョン・どのアーキテクチャの上で動いているのか」をコードから取得し、ログに残せるようにしておくと、

  • 本番だけで起きるバグの切り分け
  • サーバーごとの環境差の把握
  • サポート対象外 OS で動いていないかの確認

がしやすくなります。

ここでは、初心者向けに

  • Environment.OSVersion などで取れる基本的な OS 情報
  • .NET 6 以降で使える OperatingSystem クラスの便利な判定
  • 実務で使える「OS情報ダンプユーティリティ」
  • どんな場面で OS 情報が効いてくるか

を、例題付きでかみ砕いて説明します。

基本の OS 情報:Environment から取れるもの

OSVersion と 64bit 判定

まずは、System.Environment から取れる OS 関連情報を押さえましょう。

public static void ShowBasicOsInfo()
{
    Console.WriteLine($"OSVersion: {Environment.OSVersion}");
    Console.WriteLine($"Is64BitOperatingSystem: {Environment.Is64BitOperatingSystem}");
    Console.WriteLine($"Is64BitProcess: {Environment.Is64BitProcess}");
}
C#

ここで重要なのは三つです。

一つ目が Environment.OSVersion。 これは「OS の種類とバージョン」を表す情報で、Windows なら NT バージョンなどが含まれます。 文字列としてそのままログに出しておくだけでも、「どの OS で動いていたか」を後から確認できます。

二つ目が Environment.Is64BitOperatingSystem。 これは「OS 自体が 64bit かどうか」を示します。 32bit OS は今では少ないですが、古い環境や特殊な組み込みではまだあり得ます。

三つ目が Environment.Is64BitProcess。 これは「このアプリが 64bit プロセスかどうか」です。 AnyCPU でビルドしていても、32bit OS 上では 32bit プロセスになりますし、 x86 固定ビルドなら 64bit OS 上でも 32bit プロセスになります。

ここでの重要ポイントは、「OS が 64bit かどうか」と「プロセスが 64bit かどうか」は別物だということです。 メモリ上限やネイティブライブラリのロード可否などに関わるので、両方をセットでログに残しておくと安心です。

.NET 6 以降の OperatingSystem クラスで OS 種別を判定する

Windows / Linux / macOS をコードで分岐する

クロスプラットフォームな .NET では、「このコードは Windows だけ」「これは Linux だけ」といった分岐が必要になることがあります。 そのときに便利なのが System.OperatingSystem クラスです。

public static void ShowOsPlatform()
{
    if (OperatingSystem.IsWindows())
    {
        Console.WriteLine("このアプリは Windows 上で動いています。");
    }
    else if (OperatingSystem.IsLinux())
    {
        Console.WriteLine("このアプリは Linux 上で動いています。");
    }
    else if (OperatingSystem.IsMacOS())
    {
        Console.WriteLine("このアプリは macOS 上で動いています。");
    }
    else
    {
        Console.WriteLine("未知の OS 上で動いています。");
    }
}
C#

さらに、バージョンを指定した判定もできます。

public static void CheckWindowsVersion()
{
    if (OperatingSystem.IsWindowsVersionAtLeast(10))
    {
        Console.WriteLine("Windows 10 以降で動いています。");
    }
    else
    {
        Console.WriteLine("Windows 10 未満の Windows です。");
    }
}
C#

ここでの重要ポイントは、「OS 種別やバージョンを“if 文で安全に分岐できる”」ということです。 例えば、

  • Windows ではレジストリを読むが、Linux では設定ファイルを読む
  • Windows 10 以降では新しい API を使い、それ以前ではフォールバックする

といった分岐を、OperatingSystem のメソッドで書けます。

実務で使える「OS情報ダンプユーティリティ」

一度にまとめてログに吐き出せるようにする

毎回バラバラに OS 情報を取るのは面倒なので、 「OS情報をまとめてログに残すユーティリティ」を作っておくと便利です。

ILogger と組み合わせた例を見てみましょう。

using System;
using System.Diagnostics;
using Microsoft.Extensions.Logging;

public static class OsLogger
{
    public static void LogOsInfo(ILogger logger, string context)
    {
        using var process = Process.GetCurrentProcess();

        var osVersion = Environment.OSVersion;
        var is64BitOs = Environment.Is64BitOperatingSystem;
        var is64BitProcess = Environment.Is64BitProcess;

        string platform =
            OperatingSystem.IsWindows() ? "Windows" :
            OperatingSystem.IsLinux()   ? "Linux"   :
            OperatingSystem.IsMacOS()   ? "macOS"   :
            "Unknown";

        logger.LogInformation(
            "OsInfo Context={Context} Platform={Platform} OSVersion={OSVersion} " +
            "Is64BitOS={Is64BitOS} Is64BitProcess={Is64BitProcess} " +
            "ProcessId={ProcessId} ProcessName={ProcessName}",
            context,
            platform,
            osVersion,
            is64BitOs,
            is64BitProcess,
            process.Id,
            process.ProcessName);
    }
}
C#

使い方の例です。

// アプリ起動時に一度だけ
OsLogger.LogOsInfo(_logger, "AppStart");

// 重大なエラー発生時にも
OsLogger.LogOsInfo(_logger, "FatalError");
C#

ログには、例えばこんな行が残ります。

「OsInfo Context=AppStart Platform=Windows OSVersion=Microsoft Windows NT 10.0.20348.0 Is64BitOS=True Is64BitProcess=True ProcessId=1234 ProcessName=MyService」

ここでの重要ポイントは、「OS情報を“文脈付きで一行にまとめる”」ことです。 これにより、

  • どのサーバー・どの OS でそのエラーが起きたか
  • 同じアプリでも、環境によって OS が違っていないか

を後から簡単に確認できます。

OS情報が効いてくる具体的な場面

「開発では動くのに本番で落ちる」を疑うとき

OS情報取得が特に役立つのは、次のような状況です。

開発環境は Windows 11、 本番は古い Windows Server で、 特定の API 呼び出しだけ本番で失敗する。

このとき、ログに OSVersion が残っていれば、 「本番は Windows Server 2012 R2 で、そもそもその API がサポート外だった」 といったことに気づけます。

また、Linux コンテナと Windows サーバーを混在させている環境では、

  • パス区切り文字(/\
  • ファイルシステムの挙動
  • 権限周り

などが OS によって変わります。

OS情報をログに残しておけば、 「このバグは Linux コンテナでだけ起きている」 「Windows では再現しない」 といった切り分けがしやすくなります。

ここでの重要ポイントは、「OS情報は“バグの再現条件の一部”」だということです。 コードだけでなく、「どの OS で動いていたか」をセットで記録しておくことで、 原因にたどり着くまでの時間を大きく短縮できます。

まとめ:OS情報取得は“土台の違いを見える化する”ためのユーティリティ

OS情報取得の本質を一言で言うと、

「このアプリが、 どの OS・どのバージョン・どのアーキテクチャの上で動いていたかを、 コードから機械的に取得し、ログとして残すことで、 環境差による不具合や制限を正しく理解できるようにする」

ことです。

押さえておきたいポイントは次の通りです。

  • Environment.OSVersionIs64BitOperatingSystemIs64BitProcess で基本的な OS 情報を取れる。
  • OperatingSystem.IsWindows/Linux/MacOSIsWindowsVersionAtLeast で、OS 種別・バージョンを安全に判定できる。
  • OsLogger のようなユーティリティを作り、「OS情報を文脈付きで一行にまとめてログに残す」と、実務で非常に使いやすい。
  • OS情報は、開発環境と本番環境の差、Windows と Linux の差、古い OS と新しい OS の差を切り分けるための重要な手がかりになる。

ここまでイメージできていれば、 「本番だけで起きる謎の挙動」に対して、 OSという土台をちゃんと意識した診断ができるようになります。

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