シェルスクリプトから 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"); } }