SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Downloaden Sie, um offline zu lesen
Log4Jソースコードリーディング
                 2012.09.22 (sat) at PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    Log4J
          ログ出力 専用ライブラリ

         何ができるの?
                      ・パッケージでフィルタリング

                      ・ログレベルでフィルタリング

                      ・ログ出力先をカスタマイズ

                      ・ログ出力レイアウトをカスタマイズ
              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    つかいかた
                            package com.plugram.log4j.foo;

                            import org.apache.logging.log4j.LogManager;
                            import org.apache.logging.log4j.Logger;

                            import com.plugram.log4j.bar.MyNewApp;

                            public class Main {

                            	      static Logger logger = LogManager.getLogger(Main.class.getName());

                            	      public static void main(String[] args) {
                            	      	    new Main().run();
                            	      }

                            	      public void run() {
                            	      	    logger.trace("Entering application.");
                            	      	    MyNewApp app = new MyNewApp();
                            	      	    if (app.doIt()) {
                            	      	    	    logger.error("Just do it.");
                            	      	    }
                            	      	    logger.trace("Exiting application.");
                            	      }

                            }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    つかいかた
            <?xml version="1.0" encoding="UTF-8"?>
            <configuration status="off">
              <appenders>
                                                                                        出力レイアウト
                <Console name="Console" target="SYSTEM_OUT">
          出力先      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
                </Console>
              </appenders>
              <loggers>
                <!--
                <logger name="com.plugram.log4j.foo" level="error">
                   <appender-ref ref="Console"/>
                </logger>                                               パッケージ名でフィルタリング
                <logger name="com.plugram.log4j.bar" level="error">
                   <appender-ref ref="Console"/>
                </logger>
               -->
                <root level="trace">    ログレベルでフィルタリング
                   <appender-ref ref="Console"/>
                </root>
              </loggers>
            </configuration>




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    Log4J 2




                                             http://logging.apache.org/log4j/2.x/manual/architecture.html


              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    ログ出力までの流れ

                            package com.plugram.log4j.foo;

                            import org.apache.logging.log4j.LogManager;
                            import org.apache.logging.log4j.Logger;

                            import com.plugram.log4j.bar.MyNewApp;

                            public class Main {

                            	      static Logger logger = LogManager.getLogger(Main.class.getName());

                            	      public static void main(String[] args) {
                            	      	    new Main().run();
                            	      }

                            	      public void run() {
                            	      	    logger.trace("Entering application.");
                            	      	    MyNewApp bar = new MyNewApp();
                            	      	    if (bar.doIt()) {
                            	      	    	    logger.error("Just do it.");
                            	      	    }
                            	      	    logger.trace("Exiting application.");
                            	      }

                            }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    ログ出力までの流れ

                            package com.plugram.log4j.foo;

                            import org.apache.logging.log4j.LogManager;
                            import org.apache.logging.log4j.Logger;

                            import com.plugram.log4j.bar.MyNewApp;

                            public class Main {

                            	      static Logger logger = LogManager.getLogger(Main.class.getName());

                       	  public static void main(String[]          args) {
                   LogManager new Main().run();
                       	  	
                           	    }
                         public static Logger getLogger(String name) {
                             return factory.getContext(LogManager.class.getName(), null, false).getLogger(name);
                           	    public void run() {
                         }
                           	    	    logger.trace("Entering application.");
                           	    	    MyNewApp bar = new MyNewApp();
                           	    	    if (bar.doIt()) {
                                org.apache.logging.log4j.core.LoggerContext
                           	    	    	    logger.error("Just do it.");
                           	    	    }
                           	    	    logger.trace("Exiting application.");        org.apache.logging.log4j.core.Logger
                           	    }

                            }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    ログ出力までの流れ

                            package com.plugram.log4j.foo;

                            import org.apache.logging.log4j.LogManager;
                            import org.apache.logging.log4j.Logger;

                            import com.plugram.log4j.bar.MyNewApp;

                            public class Main {

                            	      static Logger logger = LogManager.getLogger(Main.class.getName());

                            	      public static void main(String[] args) {
                            	      	    new Main().run();
                            	      }

                            	      public void run() {
                            	      	    logger.trace("Entering application.");
                            	      	    MyNewApp bar = new MyNewApp();
                            	      	    if (bar.doIt()) {
                            	      	    	    logger.error("Just do it.");
                            	      	    }
                            	      	    logger.trace("Exiting application.");
                            	      }

                            }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    ログ出力までの流れ

                            package com.plugram.log4j.foo;

                            import org.apache.logging.log4j.LogManager;
                            import org.apache.logging.log4j.Logger;

                            import com.plugram.log4j.bar.MyNewApp;

                            public class Main {

                            	      static Logger logger = LogManager.getLogger(Main.class.getName());

                            	      public static void main(String[] args) {
                            	      	    new Main().run();
                            	      }

                         	    public void run() {
                         	    	    logger.trace("Entering application.");
                         	    	    MyNewApp bar = new MyNewApp();
                       AbstractLogger
                         	    	    if (bar.doIt()) {
                         	    	    	    logger.error("Just do it.");
                          public void trace(String message) {
                         	    	    }
                              if (isEnabled(Level.TRACE, null, message)) {
                         	    	    logger.trace("Exiting application.");
                                  log(null, FQCN, Level.TRACE, new SimpleMessage(message), null);
                         	    }
                              }
                          }
                         }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    ログ出力までの流れ


                          AbstractLogger
                                public void trace(String message) {
                                    if (isEnabled(Level.TRACE, null, message)) {
                                        log(null, FQCN, Level.TRACE, new SimpleMessage(message), null);
                                    }
                                }




                  core.Logger

                       @Override
                       public void log(Marker marker, String fqcn, Level level, Message data, Throwable t) {
                           if (data == null) {
                               data = new SimpleMessage("");
                           }
                           config.config.getConfigurationMonitor().checkConfiguration();
                           config.loggerConfig.log(name, marker, fqcn, level, data, t);
                       }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    ログ出力までの流れ

                   core.Logger

                        @Override
                        public void log(Marker marker, String fqcn, Level level, Message data, Throwable t) {
                            if (data == null) {
                                data = new SimpleMessage("");
                            }
                            config.config.getConfigurationMonitor().checkConfiguration();
                            config.loggerConfig.log(name, marker, fqcn, level, data, t);
                        }




                core.LoggerConfig

                    public void log(String loggerName, Marker marker, String fqcn, Level level,
                            Message data, Throwable t) {
                        LogEvent event = logEventFactory.createEvent(loggerName, marker, fqcn, level, data, t);
                        log(event);
                    }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    ログ出力までの流れ

                                             core.LoggerConfig

                                                 public void log(LogEvent event) {

                                                     counter.incrementAndGet();
                                                     try {
                                                         if (isFiltered(event)) {
                                                             return;
                                                         }

                                                         callAppenders(event);

                                                         if (additive && parent != null) {
                                                             parent.log(event);
                                                         }
                                                     } finally {
                                                         if (counter.decrementAndGet() == 0) {
                                                             synchronized (this) {
                                                                 if (shutdown) {
                                                                     notifyAll();
                                                                 }
                                                             }

                                                         }
                                                     }
                                                 }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    読んでみよう


                             ・出力レイアウトの設定方法


                             ・出力先の設定方法


                             ・パッケージ名でのフィルタリング


                             ・ログレベルでのフィルタリング


              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    出力レイアウトの設定方法

                             core.LoggerContext

                                     private volatile Configuration config = new DefaultConfiguration();




               core.DefaultConfiguration

                    public DefaultConfiguration() {

                         setName(DEFAULT_NAME);
                         Layout layout = PatternLayout.createLayout("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n",
                             null, null, null);
                         Appender appender = ConsoleAppender.createAppender(layout, null, "SYSTEM_OUT", "Console", "true");
                         addAppender(appender);
                         LoggerConfig root = getRootLogger();
                         root.addAppender(appender, null, null);

                         String l = System.getProperty(DEFAULT_LEVEL);
                         Level level = (l != null && Level.valueOf(l) != null) ? Level.valueOf(l) : Level.ERROR;
                         root.setLevel(level);
                    }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    出力レイアウトの設定方法
               core.layout.PatternLayout
                      @PluginFactory
                      public static PatternLayout createLayout(@PluginAttr("pattern") String pattern,
                                                               @PluginConfiguration Configuration config,
                                                               @PluginElement("replace") RegexReplacement replace,
                                                               @PluginAttr("charset") String charset) {
                          Charset c = Charset.isSupported("UTF-8") ? Charset.forName("UTF-8") : Charset.defaultCharset();
                          if (charset != null) {
                              if (Charset.isSupported(charset)) {
                                  c = Charset.forName(charset);
                              } else {
                                  LOGGER.error("Charset " + charset + " is not supported for layout, using " + c.displayName());
                              }
                          }
                          return new PatternLayout(config, replace, pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, c);
                      }




                        private PatternLayout(Configuration config, final RegexReplacement replace, final String pattern,
                                             final Charset charset) {
                            super(charset);
                            this.replace = replace;
                            this.conversionPattern = pattern;
                            this.config = config;
                            PatternParser parser = createPatternParser(config);
                            formatters = parser.parse((pattern == null) ? DEFAULT_CONVERSION_PATTERN : pattern);
                            handlesExceptions = parser.handlesExceptions();
                        }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    出力レイアウトの設定方法(利用してるところ)

              core.appender.OutputStreamAppender

                        public void append(LogEvent event) {
                            readLock.lock();
                            try {
                                manager.write(getLayout().format(event));
                                if (this.immediateFlush) {
                                    manager.flush();
                                }
                            } catch (AppenderRuntimeException ex) {
                                error("Unable to write to stream " + manager.getName() + " for appender " + getName());
                                throw ex;
                            } finally {
                                                                       core.layout.PatternLayout
                                readLock.unlock();
                            }
                        }                                                public String formatAs(final LogEvent event) {
                                                                             StringBuilder buf = new StringBuilder();
                                                                             for (PatternFormatter formatter : formatters) {
                                                                                 formatter.format(event, buf);
                                                                             }
              core.layout.AbstractStringLayout                               String str = buf.toString();
                                                                             if (replace != null) {
                                                                                 str = replace.format(str);
                   public byte[] format(LogEvent event) {                    }
                       return encoder.getBytes(formatAs(event));             return config == null ? str : config.getSubst().replace(event, str);
                   }                                                     }




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




    読んでみよう


                             ・出力レイアウトの設定方法
                                             同じように読んでみよう


                             ・出力先の設定方法


                             ・パッケージ名でのフィルタリング


                             ・ログレベルでのフィルタリング


              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日
社内勉強会 Log4J




                                             ありがとうございました




              COPYRIGHT 2012 PLUGRAM, Inc.




12年9月23日日曜日

Weitere ähnliche Inhalte

Mehr von Go Tanaka

DevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJSDevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJSGo Tanaka
 
Jvm internal
Jvm internalJvm internal
Jvm internalGo Tanaka
 
Knockout handson
Knockout handsonKnockout handson
Knockout handsonGo Tanaka
 
Knockout bindings
Knockout bindingsKnockout bindings
Knockout bindingsGo Tanaka
 
Implement curry
Implement curryImplement curry
Implement curryGo Tanaka
 
InvokeDynamic at #shikadriven 2012
InvokeDynamic at #shikadriven 2012InvokeDynamic at #shikadriven 2012
InvokeDynamic at #shikadriven 2012Go Tanaka
 
Studying Network #1
Studying Network #1Studying Network #1
Studying Network #1Go Tanaka
 
Inside The Java Virtual Machine
Inside The Java Virtual MachineInside The Java Virtual Machine
Inside The Java Virtual MachineGo Tanaka
 
Nettyらへん
NettyらへんNettyらへん
NettyらへんGo Tanaka
 
T2 reading 20101126
T2 reading 20101126T2 reading 20101126
T2 reading 20101126Go Tanaka
 
Kanjava20110302
Kanjava20110302Kanjava20110302
Kanjava20110302Go Tanaka
 
Slim3 Gwt In Action
Slim3 Gwt In ActionSlim3 Gwt In Action
Slim3 Gwt In ActionGo Tanaka
 
はじめてのPHP
はじめてのPHPはじめてのPHP
はじめてのPHPGo Tanaka
 
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日Go Tanaka
 

Mehr von Go Tanaka (16)

DevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJSDevLOVE Kansai KnockoutJS
DevLOVE Kansai KnockoutJS
 
Jvm internal
Jvm internalJvm internal
Jvm internal
 
Knockout handson
Knockout handsonKnockout handson
Knockout handson
 
Knockout bindings
Knockout bindingsKnockout bindings
Knockout bindings
 
Implement curry
Implement curryImplement curry
Implement curry
 
InvokeDynamic at #shikadriven 2012
InvokeDynamic at #shikadriven 2012InvokeDynamic at #shikadriven 2012
InvokeDynamic at #shikadriven 2012
 
Studying Network #1
Studying Network #1Studying Network #1
Studying Network #1
 
Inside The Java Virtual Machine
Inside The Java Virtual MachineInside The Java Virtual Machine
Inside The Java Virtual Machine
 
FxUG HTML5
FxUG HTML5FxUG HTML5
FxUG HTML5
 
Nettyらへん
NettyらへんNettyらへん
Nettyらへん
 
T2 reading 20101126
T2 reading 20101126T2 reading 20101126
T2 reading 20101126
 
Kanjava20110302
Kanjava20110302Kanjava20110302
Kanjava20110302
 
GWT♥HTML5
GWT♥HTML5GWT♥HTML5
GWT♥HTML5
 
Slim3 Gwt In Action
Slim3 Gwt In ActionSlim3 Gwt In Action
Slim3 Gwt In Action
 
はじめてのPHP
はじめてのPHPはじめてのPHP
はじめてのPHP
 
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
 

Kürzlich hochgeladen

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Kürzlich hochgeladen (10)

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

Log4j 2 source code reading

  • 1. Log4Jソースコードリーディング 2012.09.22 (sat) at PLUGRAM, Inc. 12年9月23日日曜日
  • 2. 社内勉強会 Log4J Log4J ログ出力 専用ライブラリ 何ができるの? ・パッケージでフィルタリング ・ログレベルでフィルタリング ・ログ出力先をカスタマイズ ・ログ出力レイアウトをカスタマイズ COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 3. 社内勉強会 Log4J つかいかた package com.plugram.log4j.foo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.plugram.log4j.bar.MyNewApp; public class Main { static Logger logger = LogManager.getLogger(Main.class.getName()); public static void main(String[] args) { new Main().run(); } public void run() { logger.trace("Entering application."); MyNewApp app = new MyNewApp(); if (app.doIt()) { logger.error("Just do it."); } logger.trace("Exiting application."); } } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 4. 社内勉強会 Log4J つかいかた <?xml version="1.0" encoding="UTF-8"?> <configuration status="off"> <appenders> 出力レイアウト <Console name="Console" target="SYSTEM_OUT"> 出力先 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </appenders> <loggers> <!-- <logger name="com.plugram.log4j.foo" level="error"> <appender-ref ref="Console"/> </logger> パッケージ名でフィルタリング <logger name="com.plugram.log4j.bar" level="error"> <appender-ref ref="Console"/> </logger> --> <root level="trace"> ログレベルでフィルタリング <appender-ref ref="Console"/> </root> </loggers> </configuration> COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 5. 社内勉強会 Log4J Log4J 2 http://logging.apache.org/log4j/2.x/manual/architecture.html COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 6. 社内勉強会 Log4J ログ出力までの流れ package com.plugram.log4j.foo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.plugram.log4j.bar.MyNewApp; public class Main { static Logger logger = LogManager.getLogger(Main.class.getName()); public static void main(String[] args) { new Main().run(); } public void run() { logger.trace("Entering application."); MyNewApp bar = new MyNewApp(); if (bar.doIt()) { logger.error("Just do it."); } logger.trace("Exiting application."); } } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 7. 社内勉強会 Log4J ログ出力までの流れ package com.plugram.log4j.foo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.plugram.log4j.bar.MyNewApp; public class Main { static Logger logger = LogManager.getLogger(Main.class.getName()); public static void main(String[] args) { LogManager new Main().run(); } public static Logger getLogger(String name) { return factory.getContext(LogManager.class.getName(), null, false).getLogger(name); public void run() { } logger.trace("Entering application."); MyNewApp bar = new MyNewApp(); if (bar.doIt()) { org.apache.logging.log4j.core.LoggerContext logger.error("Just do it."); } logger.trace("Exiting application."); org.apache.logging.log4j.core.Logger } } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 8. 社内勉強会 Log4J ログ出力までの流れ package com.plugram.log4j.foo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.plugram.log4j.bar.MyNewApp; public class Main { static Logger logger = LogManager.getLogger(Main.class.getName()); public static void main(String[] args) { new Main().run(); } public void run() { logger.trace("Entering application."); MyNewApp bar = new MyNewApp(); if (bar.doIt()) { logger.error("Just do it."); } logger.trace("Exiting application."); } } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 9. 社内勉強会 Log4J ログ出力までの流れ package com.plugram.log4j.foo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.plugram.log4j.bar.MyNewApp; public class Main { static Logger logger = LogManager.getLogger(Main.class.getName()); public static void main(String[] args) { new Main().run(); } public void run() { logger.trace("Entering application."); MyNewApp bar = new MyNewApp(); AbstractLogger if (bar.doIt()) { logger.error("Just do it."); public void trace(String message) { } if (isEnabled(Level.TRACE, null, message)) { logger.trace("Exiting application."); log(null, FQCN, Level.TRACE, new SimpleMessage(message), null); } } } } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 10. 社内勉強会 Log4J ログ出力までの流れ AbstractLogger public void trace(String message) { if (isEnabled(Level.TRACE, null, message)) { log(null, FQCN, Level.TRACE, new SimpleMessage(message), null); } } core.Logger @Override public void log(Marker marker, String fqcn, Level level, Message data, Throwable t) { if (data == null) { data = new SimpleMessage(""); } config.config.getConfigurationMonitor().checkConfiguration(); config.loggerConfig.log(name, marker, fqcn, level, data, t); } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 11. 社内勉強会 Log4J ログ出力までの流れ core.Logger @Override public void log(Marker marker, String fqcn, Level level, Message data, Throwable t) { if (data == null) { data = new SimpleMessage(""); } config.config.getConfigurationMonitor().checkConfiguration(); config.loggerConfig.log(name, marker, fqcn, level, data, t); } core.LoggerConfig public void log(String loggerName, Marker marker, String fqcn, Level level, Message data, Throwable t) { LogEvent event = logEventFactory.createEvent(loggerName, marker, fqcn, level, data, t); log(event); } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 12. 社内勉強会 Log4J ログ出力までの流れ core.LoggerConfig public void log(LogEvent event) { counter.incrementAndGet(); try { if (isFiltered(event)) { return; } callAppenders(event); if (additive && parent != null) { parent.log(event); } } finally { if (counter.decrementAndGet() == 0) { synchronized (this) { if (shutdown) { notifyAll(); } } } } } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 13. 社内勉強会 Log4J 読んでみよう ・出力レイアウトの設定方法 ・出力先の設定方法 ・パッケージ名でのフィルタリング ・ログレベルでのフィルタリング COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 14. 社内勉強会 Log4J 出力レイアウトの設定方法 core.LoggerContext private volatile Configuration config = new DefaultConfiguration(); core.DefaultConfiguration public DefaultConfiguration() { setName(DEFAULT_NAME); Layout layout = PatternLayout.createLayout("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n", null, null, null); Appender appender = ConsoleAppender.createAppender(layout, null, "SYSTEM_OUT", "Console", "true"); addAppender(appender); LoggerConfig root = getRootLogger(); root.addAppender(appender, null, null); String l = System.getProperty(DEFAULT_LEVEL); Level level = (l != null && Level.valueOf(l) != null) ? Level.valueOf(l) : Level.ERROR; root.setLevel(level); } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 15. 社内勉強会 Log4J 出力レイアウトの設定方法 core.layout.PatternLayout @PluginFactory public static PatternLayout createLayout(@PluginAttr("pattern") String pattern, @PluginConfiguration Configuration config, @PluginElement("replace") RegexReplacement replace, @PluginAttr("charset") String charset) { Charset c = Charset.isSupported("UTF-8") ? Charset.forName("UTF-8") : Charset.defaultCharset(); if (charset != null) { if (Charset.isSupported(charset)) { c = Charset.forName(charset); } else { LOGGER.error("Charset " + charset + " is not supported for layout, using " + c.displayName()); } } return new PatternLayout(config, replace, pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, c); } private PatternLayout(Configuration config, final RegexReplacement replace, final String pattern, final Charset charset) { super(charset); this.replace = replace; this.conversionPattern = pattern; this.config = config; PatternParser parser = createPatternParser(config); formatters = parser.parse((pattern == null) ? DEFAULT_CONVERSION_PATTERN : pattern); handlesExceptions = parser.handlesExceptions(); } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 16. 社内勉強会 Log4J 出力レイアウトの設定方法(利用してるところ) core.appender.OutputStreamAppender public void append(LogEvent event) { readLock.lock(); try { manager.write(getLayout().format(event)); if (this.immediateFlush) { manager.flush(); } } catch (AppenderRuntimeException ex) { error("Unable to write to stream " + manager.getName() + " for appender " + getName()); throw ex; } finally { core.layout.PatternLayout readLock.unlock(); } } public String formatAs(final LogEvent event) { StringBuilder buf = new StringBuilder(); for (PatternFormatter formatter : formatters) { formatter.format(event, buf); } core.layout.AbstractStringLayout String str = buf.toString(); if (replace != null) { str = replace.format(str); public byte[] format(LogEvent event) { } return encoder.getBytes(formatAs(event)); return config == null ? str : config.getSubst().replace(event, str); } } COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 17. 社内勉強会 Log4J 読んでみよう ・出力レイアウトの設定方法 同じように読んでみよう ・出力先の設定方法 ・パッケージ名でのフィルタリング ・ログレベルでのフィルタリング COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日
  • 18. 社内勉強会 Log4J ありがとうございました COPYRIGHT 2012 PLUGRAM, Inc. 12年9月23日日曜日