[インデックス 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つのファイルにビルドタグが追加されています。
src/pkg/log/syslog/syslog.go
src/pkg/log/syslog/syslog_test.go
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)
という論理積として機能します。
したがって、このビルドタグは、以下の条件がすべて満たされる場合にのみ、そのファイルがコンパイルされることを意味します。
- ビルド対象のOSがWindowsではない。
- ビルド対象のOSがPlan 9ではない。
これにより、WindowsまたはPlan 9以外のOS(例: Linux, macOS)でGoプログラムをビルドする際にはlog/syslog
パッケージが通常通りコンパイルされますが、WindowsまたはPlan 9でビルドする際には、これらのファイルがコンパイルプロセスから除外され、結果としてlog/syslog
パッケージが利用できなくなります。
この変更は、Go 1リリース前の段階で、特定のプラットフォームにおける互換性の問題を回避するための、実用的かつ効果的な手段でした。
関連リンク
- Go CL 5671076: https://golang.org/cl/5671076
参考にした情報源リンク
- Go build tags: https://go.dev/blog/go1.17-build-constraints (Go 1.17以降の新しい構文に関する情報も含むが、基本的な概念は共通)
- Syslog: https://en.wikipedia.org/wiki/Syslog
- Unix domain sockets Windows: https://learn.microsoft.com/en-us/windows/win32/winsock/unix-domain-sockets (WindowsでのUnixドメインソケットのネイティブサポートに関する情報。このコミット時点では未サポート)