Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 11990] ファイルの概要

このコミットは、Go言語の標準ライブラリlog/syslogパッケージにおいて、WindowsおよびPlan 9オペレーティングシステムでのビルドを無効化する変更を導入しています。これは、Go 1リリース後のWindowsサポートの改善を見据え、当時Windows上でUnixドメインソケットを使用しようとしていたsyslogパッケージの不適切な動作を一時的に回避するための措置です。

コミット

commit a4d124d75b1d0610a591ede8b24110b08764feac
Author: Russ Cox <rsc@golang.org>
Date:   Thu Feb 16 22:04:13 2012 -0500

    log/syslog: disable on Windows
    
    We want to be able to implement good Windows support
    after Go 1.  Right now Windows tries to use Unix domain
    sockets, and I'd rather just have it not be available.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5671076
---
 src/pkg/log/syslog/syslog.go      | 2 +++
 src/pkg/log/syslog/syslog_test.go | 3 +++
 src/pkg/log/syslog/syslog_unix.go | 2 +++
 3 files changed, 7 insertions(+)

diff --git a/src/pkg/log/syslog/syslog.go b/src/pkg/log/syslog/syslog.go
index 3eb5353e9a..f53310cb0a 100644
--- a/src/pkg/log/syslog/syslog.go
+++ b/src/pkg/log/syslog/syslog.go
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build !windows,!plan9
+
 // Package syslog provides a simple interface to the system log service. It
 // can send messages to the syslog daemon using UNIX domain sockets, UDP, or
 // TCP connections.
diff --git a/src/pkg/log/syslog/syslog_test.go b/src/pkg/log/syslog/syslog_test.go
index 7f509b3666..0fd6239059 100644
--- a/src/pkg/log/syslog/syslog_test.go
+++ b/src/pkg/log/syslog/syslog_test.go
@@ -1,6 +1,9 @@
 // Copyright 2009 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
+\n+// +build !windows,!plan9
+\n package syslog
 
 import (
diff --git a/src/pkg/log/syslog/syslog_unix.go b/src/pkg/log/syslog/syslog_unix.go
index b1c929ad2f..46a164dd57 100644
--- a/src/pkg/log/syslog/syslog_unix.go
+++ b/src/pkg/log/syslog/syslog_unix.go
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.\n
+// +build !windows,!plan9
+\n package syslog
 
 import (

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/a4d124d75b1d0610a591ede8b24110b08764feac

元コミット内容

log/syslog: Windowsで無効化

Go 1リリース後に、Windowsでの適切なサポートを実装したいと考えています。現在、WindowsはUnixドメインソケットを使用しようとしますが、それよりも利用できないようにする方が良いでしょう。

変更の背景

このコミットが行われた2012年2月時点では、Go言語のlog/syslogパッケージは、システムログサービスとの通信にUnixドメインソケットを利用する設計になっていました。しかし、当時のWindowsオペレーティングシステムは、Unixドメインソケットをネイティブにサポートしていませんでした。

コミットメッセージにあるように、Go開発チームはGo 1リリース後にWindowsに対するより良いサポートを提供することを目指していました。その過程で、log/syslogパッケージがWindows上で不適切にUnixドメインソケットを使用しようとすることが問題となっていました。この不適切な動作は、予期せぬエラーやクラッシュを引き起こす可能性がありました。

そのため、一時的な解決策として、WindowsおよびPlan 9(Unix系OSとは異なる設計思想を持つOS)環境ではlog/syslogパッケージ自体をビルド対象から除外することで、問題の発生を防ぐ判断がなされました。これにより、Go 1リリース後の本格的なWindowsサポート実装までの間、安定性を確保することが目的でした。

前提知識の解説

Go Build Tags (ビルドタグ)

Go言語のビルドタグ(またはビルド制約)は、特定の条件に基づいてコードのコンパイルを条件付きで行うための機能です。Goのソースファイルの先頭に特別なコメントとして記述されます。これにより、オペレーティングシステム、アーキテクチャ、Goのバージョン、またはカスタムタグに基づいて、コードの一部をコンパパイルに含めたり除外したりすることができます。

  • 構文: // +build tagname または Go 1.17以降では //go:build tagname
  • 論理演算子:
    • tag1,tag2 または tag1 && tag2: AND条件(両方のタグが存在する場合にコンパイル)
    • tag1 || tag2: OR条件(いずれかのタグが存在する場合にコンパイル)
    • !tag: 否定(指定されたタグが存在しない場合にコンパイル)
  • OS/アーキテクチャタグ: linux, windows, darwin, amd64, arm など、Goツールチェーンによって自動的に認識される組み込みタグがあります。

このコミットでは、// +build !windows,!plan9という形式が使用されています。これは、「windowsタグもplan9タグも存在しない場合にこのファイルをビルドする」という意味になります。つまり、WindowsまたはPlan 9環境では、これらのファイルはコンパイルされません。

Syslog

Syslogは、UNIX系オペレーティングシステムで広く使用されている標準的なログ記録プロトコルです。システムやアプリケーションからのログメッセージを一元的に収集、保存、管理するために設計されています。Syslogは、メッセージの重要度(緊急、警告、情報など)やファシリティ(カーネル、メール、デーモンなど)を定義し、それに基づいてログを分類します。

ログメッセージは、ローカルファイルに書き込まれるだけでなく、ネットワーク経由でリモートのSyslogサーバーに送信することも可能です。通信にはUDP、TCP、またはUnixドメインソケットが使用されます。

Unixドメインソケット (Unix Domain Sockets, UDS)

Unixドメインソケットは、同じホスト上のプロセス間通信(IPC: Inter-Process Communication)のためのメカニズムです。ネットワークソケット(TCP/IPソケット)と似ていますが、ネットワークスタックを介さずに直接カーネル内で通信が行われるため、通常はネットワークソケットよりも高速で効率的です。

Unixドメインソケットは、ファイルシステム上のパス名(例: /tmp/mysocket.sock)に関連付けられることが多く、ファイルシステムパーミッションによってアクセス制御が可能です。伝統的にUnix系OS(Linux, macOS, BSDなど)で利用されてきましたが、Windowsも2017年のWindows 10 Insider Preview Build 17063以降、ネイティブにUnixドメインソケットをサポートするようになりました。しかし、このコミットが行われた2012年時点では、WindowsにはネイティブなUnixドメインソケットのサポートは存在しませんでした。

技術的詳細

このコミットの技術的な核心は、Go言語のビルドタグを利用して、特定のオペレーティングシステム(WindowsとPlan 9)からlog/syslogパッケージのコードを除外することにあります。

当時のGoのlog/syslogパッケージは、内部的にUnixドメインソケットを使用してシステムログデーモンと通信するロジックを含んでいました。Unixドメインソケットは、Unix系OSでは一般的なIPCメカニズムですが、2012年時点のWindowsではネイティブにサポートされていませんでした。そのため、Windows環境でlog/syslogパッケージがビルドされると、Unixドメインソケット関連のAPI呼び出しが失敗したり、予期せぬ動作を引き起こしたりする可能性がありました。

開発チームは、Go 1リリース後のWindowsサポートの改善を計画していましたが、それまでの間、この互換性の問題を回避する必要がありました。そこで、各Goソースファイルの先頭にビルドタグ// +build !windows,!plan9を追加することで、GoコンパイラがWindowsまたはPlan 9環境でビルドを行う際に、これらのファイルを無視するように指示しました。

これにより、WindowsユーザーがGoプログラムをコンパイルする際に、log/syslogパッケージが原因で発生する可能性のあるビルドエラーやランタイムエラーを回避できるようになりました。これは、Go言語がクロスプラットフォーム対応を進める上で、プラットフォーム固有の機能の取り扱いに関する初期の課題と、それに対する実用的な解決策を示しています。

コアとなるコードの変更箇所

このコミットでは、以下の3つのファイルにビルドタグが追加されています。

  1. src/pkg/log/syslog/syslog.go
  2. src/pkg/log/syslog/syslog_test.go
  3. src/pkg/log/syslog/syslog_unix.go

それぞれのファイルの先頭に、以下の行が追加されています。

// +build !windows,!plan9

コアとなるコードの解説

追加された// +build !windows,!plan9という行は、Go言語のビルドタグ(Build Constraint)です。

  • // +build: これはGoコンパイラに対する特別な指示であることを示します。
  • !windows: これは「windowsというビルドタグがない場合」を意味します。Goコンパイラは、Windows環境でビルドを行う際に自動的にwindowsタグを有効にします。したがって、この条件はWindows環境では偽となり、ファイルはビルドされません。
  • !plan9: 同様に、「plan9というビルドタグがない場合」を意味します。Plan 9環境ではplan9タグが有効になるため、この条件も偽となり、ファイルはビルドされません。
  • , (カンマ): ビルドタグにおけるカンマは論理OR (||) を意味します。したがって、!windows,!plan9!windows || !plan9と解釈されます。

しかし、Goのビルドタグのルールでは、同じ行にスペースで区切られたタグは論理AND (&&) として扱われます。このコミットの形式は、// +build !windows,!plan9と書かれていますが、これは実際には!windows!plan9両方が真である場合にビルドされる、つまり(!windows) && (!plan9)という論理積として機能します。

したがって、このビルドタグは、以下の条件がすべて満たされる場合にのみ、そのファイルがコンパイルされることを意味します。

  1. ビルド対象のOSがWindowsではない。
  2. ビルド対象のOSがPlan 9ではない。

これにより、WindowsまたはPlan 9以外のOS(例: Linux, macOS)でGoプログラムをビルドする際にはlog/syslogパッケージが通常通りコンパイルされますが、WindowsまたはPlan 9でビルドする際には、これらのファイルがコンパイルプロセスから除外され、結果としてlog/syslogパッケージが利用できなくなります。

この変更は、Go 1リリース前の段階で、特定のプラットフォームにおける互換性の問題を回避するための、実用的かつ効果的な手段でした。

関連リンク

参考にした情報源リンク