posts - 22, comments - 32, trackbacks - 0, articles - 73
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          java Web應用配置log4j日志記錄

          Posted on 2011-06-26 22:26 為自己代言 閱讀(26488) 評論(1)  編輯  收藏
          公司啟動全國支票影像系統,有這樣一個功能是和消息中間件打交道,需要記錄每一個報文出錯情況,因為方便后期開發人員的調試,我選用了log4j作為日志記錄,好了廢話不多說了!

          第一步:首先建立一個WEB工程,去log4j官網下log4j的JAR包導入到工程的lib目錄下

          第二步:在src目錄下建一個log4j.properties 文件,文件命名可以由自己,只是記加載時候和這里名字一致就行;

          log4j.properties  里邊的內容如下:

           ### set log levels ###
          log4j.rootLogger = debug,stdout,E

          log4j.appender.stdout = org.apache.log4j.ConsoleAppender
          log4j.appender.stdout.Target = System.out
          log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
          log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L - %m%n

          log4j.appender.E= org.apache.log4j.DailyRollingFileAppender
          log4j.appender.E.File =${catalina.home}/logs/log_
          log4j.appender.E.DatePattern=yyyy-MM-dd'.log'
          log4j.appender.E.Threshold =DEBUG
          log4j.appender.E.layout = org.apache.log4j.PatternLayout
          log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss}[%c] [%t\:%r] - [%p]  %m%n

          可以單指定日志輸出到某個文件:

          log4j.logger.pay-log=Info,pay-log
          log4j.appender.pay-log=org.apache.log4j.DailyRollingFileAppender  
          log4j.appender.pay-log.File=D:/logs/pay-log.log
          log4j.appender.pay-log.DatePattern='.'yyyy-MM-dd
          log4j.appender.pay-log.Threshold =DEBUG
          log4j.appender.pay-log.layout=org.apache.log4j.PatternLayout  
          log4j.appender.pay-log.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss}[%c] [%t\:%r] - [%p]  %m%n



          解釋下幾個常用的,其它的在詳細的,請自己去網上查找資料:
          log4j.rootLogger = debug,stdout,E  意思是父類logger 會以比debug 級別高的日志輸出到 stdout,E 兩個地方,子類也一樣
          stdout是一個日志記錄配置,它的意思是把日志輸出到控制臺上,也就是這個配置屬性--->log4j.appender.stdout.Target = System.out ,到時候到了生產上可以注解掉就可以了。
          E是一個日志記錄配置,它是把日志文件記錄到文件中去,log4j.appender.E.File =${catalina.home}/logs/log_  是放日志文件的路徑,其中${catalina.home}是容器的路徑
          log4j.appender.E= org.apache.log4j.DailyRollingFileAppender  這個屬性配置是一天產生一個新的日志文件(還有其它配置方式,這個是用的最多的)
          log4j.appender.E.DatePattern=yyyy-MM-dd'.log'  這個屬性是以時間為名字的文件日志,形式如下:
          log_2011-06-26.log,log_2011-06-28.log,不過第一個生成的日志文件的名字是:log_
          log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss}[%c] [%t\:%r] - [%p]  %m%n  這個是輸出日志內容格式,詳細情況請自己查閱資料;
          log4j.appender.E.Threshold =DEBUG  這個是輸出日志級別(意思是只輸出比DEBUG級別高的日志信息);

          #appender名字定義
          log4j.rootLogger=INFO,FILE,consoleAppender,RollingFile,MAIL,DailyRollingFile,DATABASE
          log4j.addivity.org.apache=true

          #配置日志信息輸出目的地
          #log4j.appender.appenderName = fully.qualified.name.of.appender.class
          #(如:log4j.appender.RollingFile = org.apache.log4j.RollingFileAppender)
          # 1.org.apache.log4j.ConsoleAppender(控制臺)
          # 2.org.apache.log4j.FileAppender(文件)
          # 3.org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)
          # 4.org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
          # 5.org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

          #配置日志信息的格式
          #log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
          #(如:log4j.appender.RollingFile.layout = org.apache.log4j.HTMLLayout)
          # 1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
          # 2.org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
          # 3.org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
          # 4.org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)

          #日記記錄的優先級:priority,優先級由高到低分為 
          # OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。
          # Log4j建議只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG這五個級別。
          # ERROR 為嚴重錯誤 主要是程序的錯誤
          # WARN 為一般警告,比如session丟失
          # INFO 為一般要顯示的信息,比如登錄登出
          # DEBUG 為程序的調試信息


          #輸出格式:layout中的參數都以%開始,后面不同的參數代表不同的格式化信息(參數按字母表順序列出):
          # %c 輸出所屬類的全名,可在修改為 %d{Num} ,Num類名輸出的維(如:"org.apache.elathen.ClassName",%C{2}將輸出elathen.ClassName)
          # %d 輸出日志時間其格式為 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
          # %l 輸出日志事件發生位置,包括類目名、發生線程,在代碼中的行數
          # %n 換行符
          # %m 輸出代碼指定信息,如info(“message”),輸出message
          # %p 輸出優先級,即 FATAL ,ERROR 等
          # %r 輸出從啟動到顯示該log信息所耗費的毫秒數
          # %t 輸出產生該日志事件的線程名


          #ConsoleAppender,控制臺輸出
          #FileAppender,文件日志輸出
          #SMTPAppender,發郵件輸出日志
          #SocketAppender,Socket日志
          #NTEventLogAppender,Window NT日志
          #SyslogAppender,
          #JMSAppender,
          #AsyncAppender,
          #NullAppender



          第三步:配置容器起動時候加載log4j配置文件:
          建立一個servlet內容如下:

          package com.tchzt.logTest;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;

          import org.apache.log4j.PropertyConfigurator;

          public class Log4jInit extends HttpServlet {
           private static final long serialVersionUID = 1L;
           public void destroy() {
            super.destroy();
           }

           public Log4jInit() {
            super();
           }

           /**
            * Initialization of the servlet. <br>
            *
            * @throws ServletException if an error occurs
            */
           public void init() throws ServletException {
            String file =this.getInitParameter("log4j");//從web.xml配置讀取,名字一定要和web.xml配置一致
            if(file != null){
               PropertyConfigurator.configure(file);
            }
           }

          }

          web.xml配置:
          <servlet>
            <servlet-name>Log4jInit</servlet-name>
            <servlet-class>com.tchzt.logTest.Log4jInit</servlet-class>
            <init-param>
             <param-name>log4j</param-name>//這個是名字是下邊路徑配置的標識(好像KEY一樣)
             <param-value>/WEB-INF/classes/log4j.properties</param-value>//這是容器初始化時候加載log4j配置文件的路徑(這好像一個value);
            </init-param>
           </servlet>

          好了基本上配置完了開始下測試了:
          測試類:建立一個servlet內容如下:

          package com.tchzt.logTest;

          import java.io.IOException;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import org.apache.log4j.Logger;

          public class Test extends HttpServlet {

           private static final long serialVersionUID = 1L;

           /**
            * The doGet method of the servlet. <br>
            *
            * This method is called when a form has its tag value method equals to get.
            *
            * @param request the request send by the client to the server
            * @param response the response send by the server to the client
            * @throws ServletException if an error occurred
            * @throws IOException if an error occurred
            */
           public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //如果直接 className.class 日志輸出到全局的 即rootLogger 指定的文件中
              Logger logger = Logger.getLogger(Test.class.getName());
             //如果指定logger名字,則是把日志,輸出到pay-log 指定的日志文件中去
             Logger logger = Logger.getLogger(“pay-log”);
            MyLog4j.getSomething();
            System.out.println("================97987==============");
            logger.info("日志信息開始!");
            logger.info("日志信息結束!");
            try {
             Integer.parseInt("a");
            } catch (NumberFormatException e) {
             logger.error("解析數字出現異常",e);
             e.printStackTrace();
            }
           }

           /**
            * The doPost method of the servlet. <br>
            *
            * This method is called when a form has its tag value method equals to post.
            *
            * @param request the request send by the client to the server
            * @param response the response send by the server to the client
            * @throws ServletException if an error occurred
            * @throws IOException if an error occurred
            */
           public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
            this.doGet(request, response);
           }

          }


          這個servlet 的web.xml配置如下:
          <servlet>
              <servlet-name>Test</servlet-name>
              <servlet-class>com.tchzt.logTest.Test</servlet-class>
            </servlet>

            <servlet-mapping>
              <servlet-name>Test</servlet-name>
              <url-pattern>/servlet/Test</url-pattern>
            </servlet-mapping>


          啟動容器:輸出URL:http://localhost:8080/Log4jWebTest/servlet/Test
          第二次關閉容器,修改系統時間;在啟動容器,最后生成日志文件如下:

          log_;log_2011-06-26.log;log_2011-06-28.log;log_2011-06-30.log

          內容這里選一個文件里的內容:
          2011-06-30 21:59:28[test.jsp] [http-8080-2:0] - [ERROR]  asdfasdf
          2011-06-30 21:59:28[test.jsp] [http-8080-2:16] - [INFO]  Test Logging in JSP
          2011-06-30 21:59:28[test.jsp] [http-8080-2:16] - [FATAL]  Test fatal logging in jsp page.
          2011-06-30 21:59:28[test.jsp] [http-8080-2:16] - [ERROR]  解析數字出現異常
          java.lang.NumberFormatException: For input string: "a"
           at java.lang.NumberFormatException.forInputString(Unknown Source)
           at java.lang.Integer.parseInt(Unknown Source)
           at java.lang.Integer.parseInt(Unknown Source)
           at org.apache.jsp.index_jsp._jspService(index_jsp.java:90)
           at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
           at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
           at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
           at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
           at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
           at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
           at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
           at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
           at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
           at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
           at java.lang.Thread.run(Unknown Source)
          2011-06-30 21:59:37[com.tchzt.logTest.MyLog4j] [http-8080-2:8641] - [ERROR]  java.io.FileNotFoundException: F:\tt.txt (系統找不到指定的文件。)
          2011-06-30 21:59:37[com.tchzt.logTest.Test] [http-8080-2:8656] - [INFO]  日志信息開始!
          2011-06-30 21:59:37[com.tchzt.logTest.Test] [http-8080-2:8656] - [INFO]  日志信息結束!
          2011-06-30 21:59:37[com.tchzt.logTest.Test] [http-8080-2:8656] - [ERROR]  解析數字出現異常
          java.lang.NumberFormatException: For input string: "a"
           at java.lang.NumberFormatException.forInputString(Unknown Source)
           at java.lang.Integer.parseInt(Unknown Source)
           at java.lang.Integer.parseInt(Unknown Source)
           at com.tchzt.logTest.Test.doGet(Test.java:33)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
           at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
           at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
           at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
           at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
           at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
           at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
           at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
           at java.lang.Thread.run(Unknown Source)

          這是原創,如果需要轉載請注明出處!

          補充的:

          ### set log levels ###
          log4j.rootLogger = info,console,news-log
          #單獨指定輸出某個包的日志級別
          log4j.logger.org.springframework=info
          log4j.logger.org.apache.commons=info
          log4j.logger.net.sf.ehcache=info
          log4j.logger.org.apache.ibatis=info
          log4j.logger.org.mybatis.spring=info
          ##控制臺輸出
          log4j.appender.console = org.apache.log4j.ConsoleAppender
          log4j.appender.CONSOLE.Threshold=debug
          log4j.appender.console.Target = System.out
          log4j.appender.console.layout = org.apache.log4j.PatternLayout
          log4j.appender.console.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
          ##可以單指定日志輸出到某個文件:
          log4j.logger.news-log=Info,news-log
          log4j.appender.news-log=org.apache.log4j.DailyRollingFileAppender
          ##配置出來日志編碼
          log4j.appender.news-log.encoding=UTF-8
          log4j.appender.news-log.File=${catalina.home}/logs/news-log.log
          log4j.appender.news-log.DatePattern='.'yyyy-MM-dd
          log4j.appender.news-log.Threshold =info
          ##該配置就是讓job的日志只輸出到自己指定的日志文件中 
          log4j.additivity.job = false 
          log4j.appender.news-log.layout=org.apache.log4j.PatternLayout
          log4j.appender.news-log.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss}[%c] [%t:%r] - [%p]  %m%n

          注冊java代碼中要使用

          org.slf4j.LoggerFactory 包下的

          //如果直接 className.class 日志輸出到全局的 即rootLogger 指定的文件中
              Logger logger = Logger.getLogger(Test.class.getName());
             //如果指定logger名字,則是把日志,輸出到pay-log 指定的日志文件中去
             Logger logger = Logger.getLogger(“pay-log”);
           


          評論

          # re: java Web應用配置log4j日志記錄  回復  更多評論   

          2015-04-28 16:20 by 一樣
          環境空間那就看你可能僅今年可能盡快

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 大同县| 称多县| 旬阳县| 庆安县| 永寿县| 兰州市| 明光市| 木兰县| 舟山市| 合水县| 定远县| 安远县| 巨鹿县| 蛟河市| 岳阳县| 云林县| 赣榆县| 兴隆县| 克什克腾旗| 长乐市| 东丰县| 平凉市| 弥渡县| 新蔡县| 太仆寺旗| 玛沁县| 佛冈县| 莱西市| 攀枝花市| 霍邱县| 荆门市| 洛隆县| 宁海县| 福泉市| 淳化县| 黄龙县| 台南市| 佳木斯市| 磐安县| 上蔡县| 东宁县|