シェルスクリプトから log4j のロギングを使いたかった

結局途中で挫折して変なものができた ...

ファイル経由が楽なのかなーと思ったけど、stream.read が eof になるので駄目。
名前付きパイプならーとか思ったけど、これも同じく駄目。
unixドメインソケットならー、駄目だと思ってたけどやっぱり駄目。
(そもそも java では読めない)

で結局 echo しない echo サーバをでっちあげることになりました。
クライアントは perl IO::Socket しか方法がない。

#!/bin/bash

function log_() {
echo "$*" | perl -MIO::Socket -lne '
BEGIN{
$sock = IO::Socket::INET->new("localhost:10001");
}
{
die $! unless $sock;
print $sock "$_\n";
$sock->flush;
}
END{
if ($sock) {
$sock->close;
}
}
'
}

function log_info() {
    log_ "INFO" $@
}

function log_warn() {
    log_ "WARN" $@;
}

function log_error() {
    log_ "ERROR" $@;
}

function log_close() {
    log_ "EOF";
}

/usr/bin/java -classpath log4j-1.2.13.jar:. LogTest 10001 &
loggerpid=`ps -ef | grep LogTest | grep -v grep | awk '{ print $2 }'`
sleep 3

log_info "$0 start"

log_warn "warning "

log_error "error"

log_close

sleep 3
kill $loggerpid
import org.apache.log4j.*;
import java.util.*;
import java.io.*;
import java.net.*;

public class LogTest {
    
    static Logger logger = Logger.getLogger(LogTest.class.getName());
    
    static class LogParameter {
        private String level;
        private String content;
        public LogParameter(String line) {
            super();
            String[] param = line.split("\\s");
            this.level = param[0];
            StringBuffer sb = new StringBuffer();
            for (int i = 1; i < param.length; ++i) {
                sb.append(param[i]).append(" ");
            }
            this.content = sb.toString();
        }
        
        public boolean isInfo() {
            return level.equals("INFO");
        }
        public boolean isDebug() {
            return level.equals("DEBUG");
        }
        public boolean isTrace() {
            return level.equals("TRACE");
        }
        public String getContent() {
            return this.content;
        }
    }
    
    public static void main(String args[]) {
        
        logger.debug("start logging app");
        logger.debug("=== parameter dump ===");
        for (int i = 0; i < args.length; ++i) {
            logger.debug(i + ": " + args[i]);
        }
        
        try {
            ServerSocket sock = new ServerSocket(Integer.parseInt(args[0]));
            logger.debug("=== server start===");
            logger.debug("hostname: " + sock.getInetAddress().getHostName());
            logger.debug("port: " + sock.getLocalPort());
            boolean serverStop = false;
            while (! serverStop ) {
                Socket client = sock.accept();
                logger.debug("=== socket accept ===");
                BufferedReader br = null;
                try {
                    br = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    String buf;
                    while (! serverStop && ((buf = br.readLine()) != null)) {
                        if (buf.startsWith("EOF")) {
                            serverStop = true;
                            break;
                        }
                        logger.debug("buf: " + buf);
                        LogParameter logParameter = new LogParameter(buf);
                        if (logParameter.isInfo()) {
                            logger.info(logParameter.getContent());
                        } else if (logParameter.isDebug()) {
                            logger.debug(logParameter.getContent());
                        } else if (logParameter.isTrace()) {
                            logger.trace(logParameter.getContent());
                        } else {
                            logger.debug(logParameter.getContent());
                        }
                    }
            
                } catch (IOException e) {
                    // ignored
                } finally {
                    try {
                        if (br != null) {
                            br.close();
                        }
                        if (client != null) {
                            client.close();
                        }
                    } catch (IOException e) {
                        // ignored
                    }
                }
            }
        } catch (IOException e) {
            // ignored
        }
        logger.debug("end logging app");
    }
}