javaWeb項目配置log4j

前段時間由於需要將項目部署到服務器,由於習慣了打印到控制檯DEBUG追蹤,部署到服務器後發現光關控制檯信息很難追蹤到問題所在,並且控制檯還不能複製打印的信息,所以下定決心自己將項目的日誌輸出到自己能夠隨時查看的文件夾中。    


Log4j由三個重要的組件構成:日誌信息的優先級,日誌信息的輸出目的地,日誌信息的輸出格式。日誌信息的優先級從高到低有ERRORWARNINFODEBUG、ALL,分別用來指定這條日誌信息的重要程度;日誌信息的輸出目的地指定了日誌將打印到控制檯還是文件中;而輸出格式則控制了日誌信息的顯示內容。


一、首先你有一個Web項目  其次你得準備好log4j的依賴包  log4j-1.2.15.jar   commons-logging-1.0.4.jar    分別測試了下   2個依賴包缺一不可,否則就會報錯。

二、在你的項目根目錄下的WEB-INF 新建log4j配置  取名log4j.properties  位置和文件名你都可以重新指定,只要在後續配置下能夠根據路徑找到這個配置就行。一般採取約定熟成的方式。

    

            log4j.rootLogger = [ level ] , appenderName1,appenderName2, …

              1. rootLogger    指的是配置log4j  level 包括了5種 文章開始指明 這裏意思只打印 INFO 級別以上的信息。

                                                                 appenderName1  appenderName2 ... 指的將日誌信息輸出到哪個地方 由下面具體指定

    2.appender具體指定將日誌信息打印在哪

        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(將日誌信息以流格式發送到任意指定的地方)

    3.layout  配置日誌信息的格式(佈局)

        1.org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
         2.org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),
         3.org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串),
         4.org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)



   具體log4j配置網上一搜一大把,這裏就不再贅述了。下面是我的配置的具體含義

log4j.rootLogger=info,ServerDailyRollingFile,stdout log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender            log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd
log4j.appender.ServerDailyRollingFile.File=D:/hang222/hlserverlogs/hlserver.log               log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout                   log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n
log4j.appender.ServerDailyRollingFile.Append=true

log4j.appender.stdout=org.apache.log4j.ConsoleAppender                               log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n



   1.1ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender   每天產生一個日誌文件 以及在後續定義了打印日誌時間的格式和日誌的路徑,其中路徑你可以採用相對路徑  其中只需要修改D:/hang213/hlserverlogs/hlserver.log,

   1.1.1普通相對路徑:

     log4j.appender.logfile.File=../logs/app.log,將日誌記錄到tomcat下的logs文件夾;

                    log4j.appender.logfile.File=logs/app.log,將日誌記錄到tomcat的bin目錄下的logs文件夾;

   1.1.2環境變量的相對路徑:(其他需要可以自行網上搜索)通過在程序裏打印可以定位到你想的位置

       System.out.println("Java運行時環境版本:/n"+System.getProperty("java.version"));  

                 log4j.appender.logfile.File=${user.dir}/logs/app.log,使用tomcat容器時${user.dir}對應tomcat的bin目錄;

                     log4j.appender.logfile.File=${user.home}/logs/app.log,${user.home}對應操作系統當前用戶目錄
                     log4j.appender.logfile.File=${webApp.root}/logs/app.log,${webApp.root}對應當前應用根目錄

  1.2 stdout= org.apache.log4j.ConsoleAppender    打印在控制檯

      PropertyConfigurator.configure(props); //裝入log4j配置信息

      } catch (IOException e) {
       e.printStackTrace();
      }
      System.err.println("初始化log4j日誌組件");
     }

}

三、在Web.xml配置log4j 用於項目自動加載log4j的配置   

   <!-- 加載Log4J 配置文件  -->  
    <context-param>  
     <param-name>log4jConfigLocation</param-name>  
     <param-value>WEB-INF/log4j.properties</param-value>  
    </context-param>     
 
    <context-param>  
     <param-name>log4jRefreshInterval</param-name>  
      <param-value>3000</param-value>  
    </context-param>  
 
 <listener>  
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
 </listener>

  項目在運行時就會根據設置的路徑將log4j的配置加載,log4jRefreshInterval這是設置每3秒掃描查看配置是否發生變化,等同於動態加載,不過一般不需要可以去掉,上面使用監聽器,當然也可以servlet實現,原理相同:只需將listener換成servlet

<servlet>    
 <servlet-name>log4j</servlet-name>    
 <servlet-class>    
 org.springframework.web.util.Log4jConfigServlet    
 </servlet-class>    
 <load-on-startup>1</load-on-startup>    
</servlet>

到此 我們的log4j就配置完成了,在項目中需要打印日誌的方法時:

private static Logger logger = Logger.getLogger(類名.class);


logger.info("打印的日誌"+需要打印的參數等);

到此over  查看下完成沒有:控制檯


文件:


 

當然由於配置了 DatePattern  你的前面日誌文件會自動生成 hlserver.log.2017-10-18


我瞭解的還有一種就是通過servlet初始化init()方法中加載file屬性實現相對路徑

原理相同  寫一個類 用於加載log4j的配置  並在WEB.xml配置這個類並加載他。


/WEB-INF/config/log4j.properties

log4j.appender.AFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.AFile.DatePattern='.'yyyy-MM-dd'.html'
log4j.appender.AFile.File=..//webapps//logs//d1cm_log.html
log4j.appender.AFile.layout=org.apache.log4j.HTMLLayout
log4j.appender.AFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c %m %n




com.lq.utils.ConfigServlet.java

public class ConfigServlet extends HttpServlet {
    
     private static final long serialVersionUID = 1L;
     public void init(ServletConfig config) throws ServletException {
      super.init(config);
          //初始化log4j日誌組件
      initLogConfig(config);
      
     }
    
    
     private void initLogConfig(ServletConfig config) {
      String prifix = getServletContext().getRealPath("/");
        //System.out.println(prifix);
        
         //獲取log4j配置文件地址
      String Log4jFile = config.getInitParameter("Log4jFile");
      //System.out.println(Log4jFile);
      String filePath = prifix + Log4jFile;
      //System.out.println(filePath);
      PropertyConfigurator.configure(filePath);
      Properties props = new Properties();
     /* try {
       String Log4jFileSavePath = config.getInitParameter("Log4jFileSavePath");
       //System.out.println(Log4jFileSavePath);
       FileInputStream log4jStream = new FileInputStream(filePath);
       props.load(log4jStream);
       log4jStream.close();
       //設置日誌保存地址
       String logFile = prifix + Log4jFileSavePath + File.separator + "d1cm_log.html" ;
       //System.out.println(logFile);
       props.setProperty("log4j.appender.AFile.File", logFile);
       PropertyConfigurator.configure(props); //裝入log4j配置信息
      } catch (IOException e) {
       e.printStackTrace();
      }*/
      System.err.println("初始化log4j日誌組件");
     }

}

web.xml

 <!-- 系統初始化配置信息  servlet -->
 <servlet>
  <servlet-name>configServlet</servlet-name>
  <servlet-class>com.common.config.ConfigServlet</servlet-class>
  <init-param>
   <param-name>Log4jFile</param-name>
   <param-value>/WEB-INF/config/log4j.properties</param-value>
  </init-param>
  <init-param>
   <param-name>Log4jFileSavePath</param-name>
   <param-value>/logs</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>

網上資源很多慢慢總結 慢慢學習

第三種照着這個網址實現:也就沒怎麼研究了,大同小異,都是將配置加載

  http://blog.csdn.net/longaohun/article/details/6233099

   

實現完了發現控制檯還好,日誌文件中每次啓動重新啓動項目就老是顯示很多不需要的信息,嚴重干擾了閱讀查錯,


網站上找了半天解決辦法,什麼不打印Spring的相關等,最後幡然醒悟,你將一個成熟的項目部署到服務器後,很少會不斷的重啓服務,自己想多了。。。。。不知道會不會有人和我一樣陷入怪圈。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章