Amazon Linux 2014.09でrepackageしてconflictを避けたsyslog-ngでrsyslogを入れ替える


以下、レガシーな話で恐縮です。

Motivation
---

syslogの送信元毎にログを出し分けるなどの柔軟性が必要だったため。(fluentdとか使えよ！ってお客様に言ってください）

わざわざQiitaに投稿したのはなぜ？
---

単純にスッピンのAmazon Linux 2014.09のインスタンスで```sudo yum install --enablerepo=epel syslog-ng```とすると、

```
Transaction check error:
  file /etc/logrotate.d/syslog from install of syslog-ng-3.2.5-4.el6.x86_64 conflicts with file from package rsyslog-5.8.10-8.25.amzn1.x86_64
```

が出てくるので、それを解決する手法のメモを残したかった。そして忘れたかったw

なお、原因はRPMのバージョン4.8.0以降で、パッケージの構成チェックが厳しくなったからのようです。（参照：　http://dev.classmethod.jp/cloud/build-td-agent2-on-amazon-linux/ ) でも、　<a href="http://www.hde.co.jp/press/column/detail.php?n=201101260">RPMバージョン4.8の機能と変更点</a> 読んでもよくわかりませんでした（汗


お世話になりました
---------------

+ 手順など
	+ http://www.sssg.org/blogs/naoya/archives/1309
	+ http://blog.tnmt.info/2011/04/29/rpmbuild-for-beginner/
	+ http://www.atmarkit.co.jp/flinux/rensai/linuxtips/853downsrpm.html
	+ オフィシャル、かな https://access.redhat.com/documentation/en-US/Red_Hat_Network_Satellite/5.3/html/Deployment_Guide/satops-rpm-building.html
	+ http://www.cyberciti.biz/faq/centos-redhat-fedora-yum-lock-package-version-command/
+ syslog-ng設定
	+ http://www.atmarkit.co.jp/ait/articles/0809/22/news116.html
+ 問題の原因とか
	+ http://dev.classmethod.jp/cloud/build-td-agent2-on-amazon-linux/ (RPMのバージョン4.8.0以降で発生する現象という原因のヒントがありました）
	+ http://www.hde.co.jp/press/column/detail.php?n=201101260

方針
===

syslog-ngのパッケージを/etc/logrotate.d/syslogにタッチしないようにre-packageしてインストールしてみる

工程
---

### 1. とりあえず

```
sudo yum install syslog-ng
```
してみる。エラーなければめでたしめでたしで終了、なのだが。

```
Transaction check error:
  file /etc/logrotate.d/syslog from install of syslog-ng-3.2.5-4.el6.x86_64 conflicts with file from package rsyslog-5.8.10-8.25.amzn1.x86_64
```
こんなのが出ちゃうのです。

### 2. epelからsyslog-ngが依存しているlibnetとeventlogをインストールしておく

```
sudo yum install --enablerepo=epel libnet eventlog
```
### 3. rpmpkgツールをインストール

```
sudo yum groupinstall "Development Tools"
sudo yum install rpm-devel
```
### 4. 作業場所と環境を確保

```
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} 
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
```
### 5. ソースのダウンロードツールを入手

```
sudo yum install yum-utils
```
※ 必要なのはyumdownloaderコマンド(AMZN linuxならすでにinstall済みのはずだけど)
### 6. epelからsyslog-ngのsourceパッケージを取得<br>

```
cd ~/rpmbuild/SRPM
yumdownloader --source syslog-ng
```
### 7. sourceパッケージを展開して.specファイルを編集してbuild<br>
```
rpm -ivh syslog-ng-3.2.5-4.el6.src.rpm 
cd ../SPECS
vi syslog-ng.spec
```

log rotationの設定ファイルのパスの衝突を避けるために
```/etc/logrotate.d/syslog``` から ```/etc/logrotate.d/syslogng```にしてみた。

そしておもむろにbuild。

```
rpmbuild -ba ~/rpmbuild/SPECS/syslog-ng.spec
（中略）
error: Failed build dependencies:
	eventlog-devel >= 0.2.12 is needed by syslog-ng-3.2.5-4.amzn1.x86_64
	glib2-devel >= 2.10.1 is needed by syslog-ng-3.2.5-4.amzn1.x86_64
	libdbi-devel is needed by syslog-ng-3.2.5-4.amzn1.x86_64
	libnet-devel >= 1.1.4-3 is needed by syslog-ng-3.2.5-4.amzn1.x86_64
	pcre-devel >= 6.1 is needed by syslog-ng-3.2.5-4.amzn1.x86_64
	tcp_wrappers-devel is needed by syslog-ng-3.2.5-4.amzn1.x86_64
	libdbi-dbd-sqlite is needed by syslog-ng-3.2.5-4.amzn1.x86_64

```

buildに不足しているライブラリというかヘッダ情報のためにエラーになるので、ヘッダ情報をインストール

```
sudo yum install --enablerepo=epel eventlog-devel glib2-devel \
 libdbi-devel libnet-devel pcre-devel tcp_wrappers-devel libbdi-dbq-sqlite
```

で、ビルドに再トライ。

```
rpmbuild -ba ~/rpmbuild/SPECS/syslog-ng.spec
```

### 8. 出来たRPMパッケージをrpm -ivhでインストール

```
cd ../RPMS/x86_64
sudo rpm -ivh syslog-ng-3.2.5-4.amzn1.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:syslog-ng-3.2.5-4.amzn1          ################################# [100%]
```

### 9. rsyslogdを止めて、syslog-ngを起動（サーバーの起動時の設定も変える）

```
sudo chkconfig rsyslog off
sudo chkconfig syslog-ng on
sudo service rsyslog stop
sudo service syslog-ng start
```

### 10. yum updateの制限を掛けておく（どうせエラーになるけどね）

```
sudo yum install yum-plugin-versionlock
sudo yum versionlock syslog-ng
```

## で、おもむろにsyslog-ngの設定を始めましょうw

やりたかった事は、syslogの送信元によってログファイルを分けることでした。

```
source s_sys {
	udp(ip(xx.xx.xx.xx) port(514));
};

filter f1 {
        level(info..emerg);
};

destination d_ipfiles { file("/logdir/syslog-ng-by-ip/$SOURCEIP/messages_$YEAR$MONTH$DAY.log"); };

log { source(s_sys); filter(f1); destination(d_ipfiles); };

```