Mais conteúdo relacionado Semelhante a Javaのログ出力: 道具と考え方 (20) Mais de Taku Miyakawa (6) Javaのログ出力: 道具と考え方3. #jjugログとは!
例:
$ kink -Vdebug -e ''
2015-10-04 15:58:29 [main] DEBUG BoxingValues - use box proto listener
org.kink_lang.kink.internal.eval.VarAssignEvaluator$VarAssignListener@3af49f1c
2015-10-04 15:58:29 [main] DEBUG BoxingValues - use box proto listener
org.kink_lang.kink.internal.eval.ArgsPassingEvaluator$ListAssignListener@1c20c684
2015-10-04 15:58:29 [main] DEBUG BoxingValues - use box proto listener
org.kink_lang.kink.internal.eval.ThenUtils$BoolThenListener@1218025c
2015-10-04 15:58:29 [main] DEBUG BoxingValues - Setup prototype for java.lang.String
2015-10-04 15:58:29 [main] DEBUG Modules - Load module _enhance/java/lang/Object
from org.kink_lang.kink.internal.box.ObjectEnhancer@5e8c92f4
2015-10-04 15:58:29 [main] INFO Definer -
org.kink_lang.kink.internal.define.frequency_threshold=128
...
システムの状態を
後から見られるように出力したテキスト
3/67
7. なんで「ログ」って言うの? #jjug
logbook = 航海日誌
Photo by vxla, Licensed as CC BY 2.0, https://www.flickr.com/photos/vxla/5779530912/
logで測った速度や方向などを
帳面 (logbook) につける
7/67
32. 前史時代 #jjug
Apache Tomcat 3.0(最初期リリース)
// org.apache.tomcat.core.ServletContextFacade
public void log(String msg) {
System.err.println(msg);
}
32/67
34. Log4jの登場 #jjug
import org.apache.log4j.Logger;
public class EchoServlet extends HttpServlet {
private Logger logger = Logger.getLogger(getClass());
protected void doGet(
HttpServletRequest req, HttpServletResponse resp) {
String text = req.getParameter("text");
this.logger.info("テキスト: " + text);
...
}
}
Log4jを使うサーブレットの例:
34/67
37. 階層化されたロガー #jjug
ロ ガ ー org.kink_lang
レ ベ ル = WARN
ア ペ ン ダ =ConsoleAppender
org.kink_lang.kink
レ ベ ル = DEBUG
ア ペ ン ダ =ConsoleAppender( 継 承 )
org.kink_lang.kink.Value
レ ベ ル = DEBUG( 継 承 )
ア ペ ン ダ =ConsoleAppender( 継 承 )
+ RollingFileAppender
WARN, ERROR, FATAL の
ロ グ を コ ン ソ ー ル に 出 す
加 え て DEBUG, INFO の
ロ グ も コ ン ソ ー ル に 出 す
コ ン ソ ー ル に 加 え て
フ ァ イ ル に も ロ グ を 出 す
37/67
39. #jjugMDC
例: リクエストIDを設定するフィルタ
import org.apache.log4j.MDC;
public class PutRequestIdFilter implements Filter {
public void doFilter (
ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
String reqId = UUID.randomUUID().toString();
MDC.put("request", reqId);
try {
chain.doFilter(req, resp);
} finally {
MDC.remove("request");
}
}
...
}
39/67
46. Commons Logging #jjug
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class EchoServlet extends HttpServlet {
private Log logger = LogFactory.getLog(getClass());
protected void doGet(
HttpServletRequest req, HttpServletResponse resp) {
String text = req.getParameter("text");
this.logger.info("テキスト: " + text);
...
}
}
Log4jとだいたいおなじ!
Log4j と の 差 分
46/67
48. #jjugCommons Logging
実現したかったこと(のひとつ)
A P サ ー バ
共 有 ラ イ ブ ラ リ
ア プ リ A
ア プ リ B
Commons Logging
ロ グ via Log4j
ロ グ via java.util.logging
ログ実装の決定方法
Context Classloaderから始まって、
親・祖先のクラスローダ内でアダプタクラスを探索
最初にみつかったアダプタを使う
48/67
52. SLF4J / Logback #jjug
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EchoServlet extends HttpServlet {
private Logger logger = LoggerFactory.getLogger(getClass());
protected void doGet(
HttpServletRequest req, HttpServletResponse resp) {
String text = req.getParameter("text");
this.logger.info("テキスト: {}", text);
...
}
}
やっぱりLog4jとだいたいおなじ
Log4j と の 差 分
52/67
61. Log4j2 #jjug
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class EchoServlet extends HttpServlet {
private Logger logger = LogManager.getLogger(getClass());
protected void doGet(
HttpServletRequest req, HttpServletResponse resp) {
String text = req.getParameter("text");
this.logger.info("テキスト: {}", text);
...
}
}
早い話がLog4jです
Log4j と の 差 分
61/67