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;
}

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 日本武道館

日本武道館で行われたMaroon5のLIVEに行ってきた。

二部構成で
第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

ORA-04031の対処方法

ORA-04031 共有メモリーのstringバイトを割り当てできません

上記のエラーの対処方法としては初期化パラメータSHARED_POOL_SIZEの値を増やすことが必要となります。

またデータベースを長期間(数ヶ月)稼動させた状態の場合にはSHARED_POOLが徐々に断片化するため、まとまった領域の確保に失敗し上記のエラーが出ることがあります。

そのような場合は、DBの再起動、およびOSの再起動で回避できる可能性があります。
(運用としては定期的なOS、Oracleの再起動を行うことが必要となります)

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