Windows環境でApacheの古いログを圧縮する
Linuxとは違いlogrotateのような便利なツールがないWindows環境でApacheの古くなったログを圧縮するには一工夫が必要です。
ActivePerlをインストールした環境では次のようなスクリプトを書いて、適当なフォルダに保存してタスクスケジューラで一日に一回実行させれば古いログは圧縮されて別のフォルダに残ります。
下記のコードではC:\Program Files\Apache Group\Apache2\logsにたまったaccess.log.2008-03-22のような形式でローテーションされたログファイルを圧縮してC:\Program Files\Apache Group\Apache2\ziplogsに保存しています
#! C:/perl/bin/perl use Archive::Zip; use DirHandle; use File::Copy; use Cwd; my $access_pattern = 'access\.log\.[0-9]{4}-[0-9]{2}-[0-9]{2}'; my $error_pattern = 'error\.log\.[0-9]{4}-[0-9]{2}-[0-9]{2}'; my $lastmodified_time; my $current_time = time(); my $difference_time; my $base_dir = getcwd; my $from, $to; &zip_logs('C:\Program Files\Apache Group\Apache2\logs', 'C:\Program Files\Apache Group\Apache2\ziplogs', $access_pattern); &zip_logs('C:\Program Files\Apache Group\Apache2\logs', 'C:\Program Files\Apache Group\Apache2\ziplogs', $error_pattern); #zip sub zip_logs { my ($original_dir, $zip_dir, $pattern) = @_; $original_dir = trim($original_dir); if (-d $original_dir) { my $original_dir_handle = new DirHandle $original_dir; if (-d trim($zip_dir)) { $zip_dir = trim($zip_dir); } else { $zip_dir = $original_dir; } @file_list = $original_dir_handle->read; $original_dir_handle->close; foreach my $file_name (sort @file_list) { if ($file_name =~ $pattern) { $lastmodified_time = (stat $file_name)[9]; $difference_time = $current_time - $lastmodified_time; if ($difference_time > 86400) { my $zip = Archive::Zip->new(); $zip->addFile("$original_dir" . "\\" . "$file_name"); !$zip->writeToFileNamed("$zip_dir" . "\\" . "$file_name" . ".zip") or die "Cannot zip $file_name:$!"; my $zip_file_name = "$file_name" . ".zip"; unlink "$original_dir" . "\\" . "$file_name" or die "Cannot delete $file_name"; } } } } } sub trim { my $val = shift; $val =~ s/^ *(.*?) *$/$1/; return $val; }
現在接続しているユーザー名を表示する
現在接続しているユーザー名を確認するには以下のコマンドを実行します。
SHOW USER
log4jでsyslogにログを送る設定の方法
log4j.xmlに以下のようなappenderを加えればOKです
SyslogHostにsyslogサーバがあるIPアドレス
Facilityにファシリティを設定します。
<appender name="syslogAppender" class="org.apache.log4j.net.SyslogAppender"> <param name="SyslogHost" value="192.168.0.60"/> <param name="Facility" value="local0"/> <param name="FacilityPrinting" value="true"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%t] %d %-5p : %m - - %c (%F:%L)%n"/> </layout> </appender>
WindowsにインストールしたApacheのログをsyslogに送る
WindowsにインストールしたApacheのログをsyslogに送るには一仕事必要です。
今回紹介する手順ではperlを利用してsyslogに送ります。
1. ActivePerlをインストールします。
2. ActivePerlに付属しているppmでNet::Syslogをインストールします。
3. 以下のようなコードを書いて適当な名前で適当なフォルダに保存します。
(例:C:\Program Files\Apache Group\binにsyslog.plという名前で保存)
#!C:/Perl/bin/perl use Net::Syslog; my $s=new Net::Syslog(Facility=>'local4',Priority=>'debug'); while ($log = <STDIN>) { $s->send($log); }
4. httpd.confには以下のように記述します。
CustomLog "| 'C:/Perl/bin/perl.exe' 'C:/Program Files/Apache Group/Apache2/bin/syslog.pl'" common ErrorLog | 'C:/Perl/bin/perl.exe' 'C:/Program Files/Apache Group/Apache2/bin/syslog.pl'"
5. Apacheを再起動します。
Maroon5 in 日本武道館
二部構成で
第1部 SOFT
第2部 Maroon5
という構成でした。
SOFTのボーカルが日本語の挨拶が結構上手かったので驚きました。
結構練習したんだなと思います。
そんな彼の日本語トークでマルーン5のVocalのアダムの誕生日であることを知りました。
肝心の音楽の方は、
・アダムのボーカル一本でコーラスが無いのが残念
・間奏が長めにとられていてGuitarのジェームスの見せ場が多かった
・間奏が長い分アルバムにないアレンジが聴けて満足
といった感じでした。
Maroon5の曲の中での緩急のつけ方がゾクゾクするぐらい良いと思ってて、ライブだと照明との効果も合わさってより聴く者をゾクゾクさせてくれる効果があったと思います。
LIVEのラストがOasisの「Don't Look Back In Anger」だったのは謎でしたが、Oasisも好きな自分としては大満足でした。
セットリスト
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
01. If I Never See Your Face Again
02. Makes Me Wonder
03. Harder To Breathe
04. The Sun
05. Can't Stop
06. Secret
07. Shiver
08. Wake Up Call
09. Sunday Morning
10. Won't Go Home Without You
11. This Love
Encore
12. Little Of Your Time
13. She Will Be Loved
14. Don't Look Back In Anger
Listに入っている内容を一意にする
ListはMapと違いキーという概念が無いので、同じ内容でもaddすることができます。
一意にしたいときはListの内容をHashSetに突っ込むという方法があります。
サンプルコードは以下の通りです。
import java.util.*; public class UniqueListTest { public static void main(String[] args) { List<String> nonUniqueList = new ArrayList<String>(); nonUniqueList.add("a"); nonUniqueList.add("b"); nonUniqueList.add("c"); nonUniqueList.add("a"); for (String s : nonUniqueList) { System.out.println("nonUniqueList element = " + s); } Set<String> set = new HashSet<String>(); set.addAll(nonUniqueList); List<String> uniqueList = new ArrayList<String>(); uniqueList.addAll(set); for (String s : uniqueList) { System.out.println("uniqueList element = " + s); } } }
実行結果は以下の通りです。
C:\tmp>javac UniqueListTest.java C:\tmp>java UniqueListTest nonUniqueList element = a nonUniqueList element = b nonUniqueList element = c nonUniqueList element = a uniqueList element = b uniqueList element = c uniqueList element = a