はてなブックマークプラス機能:タグスポンサーは「そのタグに」興味がある人が分かる

はてなブックマークプラスの一ヶ月無料キャンペーンを利用して、タグのスポンサー機能を使ってみました。


タグのスポンサー機能は名前だけ聞くと、タグのスポンサー(広告主)ということで、最初は何に使うのかな?と思っていましたが、以下の情報がわかるなぁと思いました。



「そのタグに興味のある人がわかる(例えば ruby タグのスポンサーならおそらく ruby に興味がある)」



スポンサーになっている方の、ブックマークのコメントは参考にしやすいかもしれませんし、興味のある人同士でつながって情報交換が生まれるかもしれませんし。いろいろ効果がありそうですね。


例えば、はてなブックマーク - coLinuxでCentOS5.1を複数環境にしてみる - TrinityT's BLOGでは、colinuxの部分が赤くなっています。私は colinux のタグのスポンサーになっています。それは colinx に興味があるからです。ちなみにあと2つは rubyrails です。



皆さんは、はてなブックマークプラスの機能はどのように使っていますか?
便利そうなら、無料期間が過ぎても使おうと思っていますので、ぜひ教えてください><

syslog-ngのログ集約時にホスト名でフィルターする方法

以下のような、サーバ構成でWebサーバのログを収集したいと考えたとします。


デプロイなどの関係上、設定ファイル(configファイル)はサーバごとに変更したくないという場合があります。
同じ、local6.info でログサーバに投げるため、通常ログサーバ側では同じログファイルに保存されますが、ホスト名などでフィルターをかければログファイルを分けることができます。それをやってみます。

転送元サーバの /opt/syslog-ng/etc/syslog-ng.conf (ホスト名:web-a、web-bともに同じです)

/opt/syslog-ng/etc/syslog-ng.conf

source s_local { file ("/proc/kmsg" program_override("kernel: ")); unix-stream("/dev/log"); internal(); };

destination d_loghost  { tcp("loghost");};
filter f_lighttpd_log  { facility(local6) and level(info); };
log { source(s_local); filter(f_lighttpd_log);  destination(d_loghost); };

/etc/hosts

192.168.0.3 loghost

フィルター実装前のログサーバの /opt/syslog-ng/etc/syslog-ng.conf

/opt/syslog-ng/etc/syslog-ng.conf

source s_local { file ("/proc/kmsg" program_override("kernel: ")); unix-stream("/dev/log"); internal(); tcp(); };

destination d_lighttpd_log { file("/var/log/access.log"); };
filter f_lighttpd_log  { facility(local6) and level(info); };
log { source(s_local); filter(f_lighttpd_log);  destination(d_lighttpd_log); };

フィルター実装後のログサーバの /opt/syslog-ng/etc/syslog-ng.conf

/opt/syslog-ng/etc/syslog-ng.conf

source s_local { file ("/proc/kmsg" program_override("kernel: ")); unix-stream("/dev/log"); internal(); tcp(); };

destination d_lighttpd_log_web-a { file("/var/log/web-a/access.log"); };
destination d_lighttpd_log_web-b { file("/var/log/web-b/access.log"); };
filter f_lighttpd_log_web-a  { facility(local6) and level(info) and host(web-a); };
filter f_lighttpd_log_web-b  { facility(local6) and level(info) and host(web-b); };
log { source(s_local); filter(f_lighttpd_log_web-a);  destination(d_lighttpd_log_web-a); };
log { source(s_local); filter(f_lighttpd_log_web-b);  destination(d_lighttpd_log_web-b); };

名前解決とIP直の指定

フィルターのホスト名の部分ですが、このホスト名は 名前解決できないと認識できないようなので、ログサーバの /etc/hostsに以下を加えます。

/etc/hosts

192.168.0.1    web-a
192.168.0.2    web-b

もし、名前解決が面倒であれば、IPで指定しても大丈夫です。

filter f_lighttpd_log_web-a  { facility(local6) and level(info) and host(192.168.0.1); };
filter f_lighttpd_log_web-b  { facility(local6) and level(info) and host(192.168.0.2); };

これで、ホスト名でフィルターが実現できました。

参考

3.6 Filters

環境

$ rpm -qa | grep syslog-ng
syslog-ng-3.0.2-1.rhel5
$ cat /etc/redhat-release 
CentOS release 5 (Final)

rubyインストールしてあるのにsudoすると「/usr/bin/env: ruby: そのようなファイルやディレクトリはありません」と言われる


とある、gemをインストールしようとしたところ以下のようになります。

$ sudo gem install my_gem-0.0.1.gem
/usr/bin/env: ruby: そのようなファイルやディレクトリはありません

my_gem-0.0.1.gem は自作した gem でありファイルは存在します。


一般ユーザで「/usr/bin/env ruby -v」 はいける

$ /usr/bin/env ruby -v
ruby 1.8.6 (2009-03-31 patchlevel 368) [i686-linux]

rootユーザでも「/usr/bin/env ruby -v」 はいける

# /usr/bin/env ruby -v
ruby 1.8.6 (2009-03-31 patchlevel 368) [i686-linux]

なんと、一般ユーザの sudo だと駄目なのことが判明

$ sudo /usr/bin/env ruby -v
/usr/bin/env: ruby: そのようなファイルやディレクトリはありません

ちなみに、rubyのインストール場所は以下

$ which ruby
/usr/local/bin/ruby

/etc/sudoers には以下のように書いてある。

%wheel  ALL=(ALL)       ALL

つまり、wheelグループに所属しているユーザのコマンドはすべて使えるはずである。今回 sudo を実行したいユーザ hoge はちゃんとwheelグループにいる。

$ cat /etc/group | grep hoge
wheel:x:10:root,hoge
hoge:x:500:

sudoはセキュリティ上PATHを引き継がないらしい・・・

ということがわかったので、一般ユーザ hoge の ~/.bashrc に以下の行を追加します。

export PATH=/usr/local/bin:$PATH
alias sudo="sudo env PATH=$PATH"

再読み込み

$ source .bashrc

実行してみる

$ sudo /usr/bin/env ruby -v
ruby 1.8.6 (2009-03-31 patchlevel 368) [i686-linux]


できました・・・。でも、CentOS 5.1や5.2を利用しているときは、そんなことなかったのになぁ・・・。CentOS5.3になってから急にできなくなった・・・。なぜだ・・・。

pacoのインストールでpaco自身をインストール( sudo make logme )するときにエラーになったのも同じ原因でした。

環境

$ cat /etc/redhat-release
CentOS release 5.3 (Final)
$ ruby -v
ruby 1.8.6 (2009-03-31 patchlevel 368) [i686-linux

追記

上記のままだと以下の問題が起こります。

$ sudo -u mysql ls
env: -u: そのようなファイルやディレクトリはありません

-u を認識しなくて、userを変更してコマンドが実行できません。

そのような時は、 ~/.bashrc の記述を以下のようにしてください。

export PATH=/usr/local/bin:$PATH
alias sudo="sudo PATH=$PATH"

env をなくしています。これで、userを変更して実行できます。

$ sudo -u mysql ls
ls: .: 許可がありません