Log4jは、stdoutとstderrをログファイルにリダイレクトします



Log4j Redirects Stdout



apache log4jを使用して、プロジェクトにロギング機能を実装します。プロジェクトでは、通常、そのような要件があります。通常、System.out.println()はコンソールに出力されますが、System.outの出力もログに記録されることを期待しています。また、System.errもログに記録されます。いくつかのランタイム例外は、System.errを介してコンソールで再生されます。また、これらをログに出力したいと考えています。インターネットで参考文献を確認した後、以下の方法を整理して実装しました。

SystemクラスにはsetOutメソッドがあり、出力リダイレクトの出力ストリームを設定できるため、新しいPrintStreamオブジェクトを渡し、PrintStream printメソッドをオーバーライドし、log4jを介してログに出力する値を書き込むことができるため、Oneを実装します。そのようなクラス:



import java.io.PrintStream import org.apache.commons.logging.Log import org.apache.commons.logging.LogFactory public class StdOutErrRedirect { private final static Log logger = LogFactory.getLog(StdOutErrRedirect.class) public static void redirectSystemOutAndErrToLog() { PrintStream printStreamForOut = createLoggingWrapper(System.out, false) PrintStream printStreamForErr = createLoggingWrapper(System.out, true) System.setOut(printStreamForOut) System.setErr(printStreamForErr) } public static PrintStream createLoggingWrapper(final PrintStream printStream, final boolean isErr) { return new PrintStream(printStream) { @Override public void print(final String string) { if (!isErr){ logger.debug(string) }else{ logger.error(string) } } @Override public void print(boolean b) { if (!isErr){ logger.debug(Boolean.valueOf(b)) }else{ logger.error(Boolean.valueOf(b)) } } @Override public void print(char c) { if (!isErr){ logger.debug(Character.valueOf(c)) }else{ logger.error(Character.valueOf(c)) } } @Override public void print(int i) { if (!isErr){ logger.debug(String.valueOf(i)) }else{ logger.error(String.valueOf(i)) } } @Override public void print(long l) { if (!isErr){ logger.debug(String.valueOf(l)) }else{ logger.error(String.valueOf(l)) } } @Override public void print(float f) { if (!isErr){ logger.debug(String.valueOf(f)) }else{ logger.error(String.valueOf(f)) } } @Override public void print(double d) { if (!isErr){ logger.debug(String.valueOf(d)) }else{ logger.error(String.valueOf(d)) } } @Override public void print(char[] x) { if (!isErr){ logger.debug(x == null ? null : new String(x)) }else{ logger.error(x == null ? null : new String(x)) } } @Override public void print(Object obj) { if (!isErr){ logger.debug(obj) }else{ logger.error(obj) } } } } }

このクラスでは、System.outとSyste.errをリダイレクトしました

スタンドアロンアプリケーションの場合は、mainメソッドに入る直前にこのクラスを呼び出すことができます。redirectSystemOutAndErrToLog()静的メソッド。



Webアプリケーションの場合は、初期化時に呼び出されるサーブレットリスナーを実装できます。このクラスredirectSystemOutAndErrToLog()静的メソッド。

例えば:

import javax.servlet.ServletContextEvent import javax.servlet.ServletContextListener public class StdOutErrInitializer implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent arg0) { } @Override public void contextInitialized(ServletContextEvent arg0) { StdOutErrRedirect.redirectSystemOutAndErrToLog() } }

次に、このリスナーをweb.xmlファイルに登録します



|_+_|

たとえば、log4j.xml構成ファイルは、次のように簡単に構成できます。

|_+_|

このようにして、System.outとSystem.errの入力はログファイルにリダイレクトされ、コンソールにも出力されます。これは、IDEで開発するときに簡単に表示できます。