1. 程式人生 > >web應用中log4j應用--log4j.xml同時輸出多種日誌

web應用中log4j應用--log4j.xml同時輸出多種日誌

OK,現在我們來整理下log4j來web專案中的應用。我之前搞了2年web,使用的日誌都是log4j。關於現在比較火的logback我後面會有部落格整理到,不管怎麼樣,這裡先整理一下web中log4j的使用,特別是log4j.xml,之後如果用到直接過來複制就好了。

1,專案中新增log4j依賴:

<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
當然這裡推薦使用slf4j來統一管理日誌系統,萬一將來日誌系統log4j切換到logback。直接新增一個slf-log4j12.jar包就可以。
<dependency>  
            <groupId>org.slf4j</groupId>  
            <artifactId>slf4j-log4j12</artifactId>  
            <version>1.7.12</version>  
        </dependency>

2,Java程式碼使用logger:

package linkinframe.servlet;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

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

import org.apache.log4j.Logger;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet
{
	public static Logger log = Logger.getLogger(HelloServlet.class);

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		log.trace("trace級別的日誌輸出");
		log.debug("debug級別的日誌輸出");
		log.info("info級別的日誌輸出");
		log.warn("warn級別的日誌輸出");
		log.error("error級別的日誌輸出");
		log.fatal("fatal級別的日誌輸出");
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String currentTime = format.format(new Date());
		req.setAttribute("currentTime", currentTime);
		req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req, resp);
	}

}

3,專案classpath中新增log4j.xml配置檔案:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
	<!--log4j.xml 配置檔案 優先於 log4j.properties 配置檔案 -->
	<!-- * 1. 一個appender子元素定義一個日誌輸出目的地 * 2. 一個logger子元素定義一個日誌寫出器 -->
	<!-- ========================== 自定義輸出格式說明================================ -->
	<!-- %p 輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL -->
	<!-- %r 輸出自應用啟動到輸出該log資訊耗費的毫秒數 -->
	<!-- %c 輸出所屬的類目,通常就是所在類的全名 -->
	<!-- %t 輸出產生該日誌事件的執行緒名 -->
	<!-- %n 輸出一個回車換行符,Windows平臺為“/r/n”,Unix平臺為“/n” -->
	<!-- %d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS} -->
	<!-- 輸出類似:2002年10月18日 22:10:28,921 -->
	<!-- %l 輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main(TestLog4.java:10) -->
	<!-- ========================================================================== -->

	<!-- ========================== 輸出方式說明================================ -->
	<!-- Log4j提供的appender有以下幾種: -->
	<!-- org.apache.log4j.ConsoleAppender(控制檯), -->
	<!-- org.apache.log4j.FileAppender(檔案), -->
	<!-- org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案), -->
	<!-- org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案), -->
	<!-- org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方) -->
	<!-- ========================================================================== -->

	<!-- 輸出到控制檯 -->
	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%c] [%L] %p [%m]%n" />
		</layout>
	</appender>

	<!-- 輸出到日誌檔案 每天一個日誌 -->
	<appender name="LOGDEBUG" class="org.apache.log4j.DailyRollingFileAppender">
		<!-- Threshold遮蔽級別之下的日誌輸出 -->
		<param name="Threshold" value="DEBUG" />
		<param name="encoding" value="UTF-8" />
		<param name="File" value="/Users/LinkinPark/WorkSpace/linkin-frame-javaweb/log/linkin-debug.log" />
		<param name="DatePattern" value="'debug_'yyyy-MM-dd'.log'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%c] [%L] %p [%m]%n" />
		</layout>
	</appender>

	<appender name="LOGINFO" class="org.apache.log4j.DailyRollingFileAppender">
		<!-- <param name="Threshold" value="INFO" /> -->
		<param name="encoding" value="UTF-8" />
		<param name="File" value="/Users/LinkinPark/WorkSpace/linkin-frame-javaweb/log/linkin-info.log" />
		<param name="DatePattern" value="'info_'yyyy-MM-dd'.log'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%c] [%L] %p [%m]%n" />
		</layout>
		<!--限制輸出級別 -->
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="INFO" />
			<param name="LevelMax" value="INFO" />
		</filter>
	</appender>

	<appender name="LOGERROR" class="org.apache.log4j.DailyRollingFileAppender">
		<!-- <param name="Threshold" value="ERROR" /> -->
		<param name="encoding" value="UTF-8" />
		<param name="File" value="/Users/LinkinPark/WorkSpace/linkin-frame-javaweb/log/linkin-error.log" />
		<param name="DatePattern" value="'error_'yyyy-MM-dd'.log'" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%c] [%L] %p [%m]%n" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="ERROR" />
			<param name="LevelMax" value="ERROR" />
		</filter>
	</appender>

	<!-- 設定某些包下的日誌輸出 -->
	<!-- <logger name="com.linkinPark" additivity="false"> <level value="OFF"/> </logger> -->
	<!-- <logger name="com.linlinPark.service"> <level value="ON"/> </logger> -->

	<!-- 日誌的總開關設定 包括日誌級別和 appender -->
	<!-- logger的作用: 1.[name屬性]:指定你定義Logger物件時候的name -->
	<!-- 2. additivity : children-logger是否使用 rootLogger的配置, additivity在log4j預設為true。 -->
	<!-- 這解釋了為什麼有些時候,一個日誌資訊在螢幕上會有多次輸出。 -->
	<!-- 3.還可以指定level(輸出級別)、appender-ref(指定哪個append) -->
	<root>
		<level value="DEBUG" />
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="LOGDEBUG" />
		<appender-ref ref="LOGINFO" />
		<appender-ref ref="LOGERROR" />
	</root>

</log4j:configuration>

4,注意

上面的配置檔案中有3點說明:

1),Threshold屬性只是遮蔽了配置的級別之下的日誌輸出,等於和大於該value等級的日誌都會輸出,一般在統一所有日誌輸出的日誌中才會使用該屬性

2),LevelRangerFilter等級過濾器,可以設定最小的級別和最大的級別,這樣子就可以實現單一日誌輸出單一級別的情景了。

3),為了防止一個日誌資訊重複出現在多個日誌檔案中,可以使用additivity屬性,設定成false就不會從父類繼承appender了。

OK,考慮如下情景,我現在在寫一個web專案,我想要在日誌檔案中實現不同級別的日誌輸出,這樣也方便我直接有效的查詢日誌。

拋開控制檯的輸出,我現在想要在error日誌檔案中只輸出error級別的日誌,然後在info日誌檔案中只輸出info級別的日誌,然後在debug檔案中輸出所有級別的日誌。

使用上面的配置檔案,可以很好地實現上面的功能。我自己測試了下,沒有問題。生成的專案日誌檔案如下:

ok,現在分別開啟幾個日誌檔案,輸出如下:

linkin-debug:全部日誌檔案

[2016-03-03 00:18:47:061] [linkinframe.servlet.HelloServlet] [25] DEBUG [debug級別的日誌輸出]
[2016-03-03 00:18:47:063] [linkinframe.servlet.HelloServlet] [26] INFO [info級別的日誌輸出]
[2016-03-03 00:18:47:063] [linkinframe.servlet.HelloServlet] [27] WARN [warn級別的日誌輸出]
[2016-03-03 00:18:47:064] [linkinframe.servlet.HelloServlet] [28] ERROR [error級別的日誌輸出]
[2016-03-03 00:18:47:064] [linkinframe.servlet.HelloServlet] [29] FATAL [fatal級別的日誌輸出]

linkin-info:info級別的日誌
[2016-03-03 00:18:47:063] [linkinframe.servlet.HelloServlet] [26] INFO [info級別的日誌輸出]

linkin-error:error級別的日誌
[2016-03-03 00:18:47:064] [linkinframe.servlet.HelloServlet] [28] ERROR [error級別的日誌輸出]

OK,挺好的,沒問題,不過建議將來還是使用slf4j+logback的組合好點,關於在web中如何使用slf4j+logback的組合輸出不同的日誌檔案,道理和使用都差不多,我後面的部落格有整理。這篇先這樣子吧。

相關推薦

web應用log4j應用--log4j.xml同時輸出多種日誌

OK,現在我們來整理下log4j來web專案中的應用。我之前搞了2年web,使用的日誌都是log4j。關於現在比較火的logback我後面會有部落格整理到,不管怎麼樣,這裡先整理一下web中log4j的使用,特別是log4j.xml,之後如果用到直接過來複制就好了。 1,

Spring在web開發應用

ica ati spring 配置 還需要 erl 常量 tlist web.xml list (1)在 web 項目中要使用 spring 需要導入一個 jar 包: spring-web-4.2.4.jar包 (2)在 web.xml 文件中配置 Listener 1

【OSS最佳實踐】WEB站點如何應用OSS產品

put discuz論壇 瓶頸 個人 得到 行為 ssim 雲安全 實現 【OSS最佳實踐】WEB站點中如何應用OSS產品http://www.bieryun.com/1194.htmlOSS提供了海量、安全、低成本、高可靠的雲存儲服務,用戶可以通過SDK、API、OSS相

Node.js入門到企業Web開發應用

實戰 tput 統一 sse 介紹 有用 enc oba 入門到 第1章 課程內容介紹主要介紹為什麽我們錄制本次課程、課程包含的主要內容。1-1 導學1-2 課程介紹 第2章 NodeJS 是什麽,為什麽偏愛NodeJS?在一切課程課程內容開始之前先了解一下 NodeJS

精靈圖在 Lottie Web 動畫應用

概述 Lottie是一套跨平臺的平面動畫解決方案;設計師使用AE設計動畫,然後通過外掛將動畫匯出成定義好的json檔案;之後開發人員只需要依賴這個 json 檔案和對應平臺的Lottie動畫庫就可以很方便的在相應平臺中實現動畫了。 普通示例 普通示例線上預覽連結為 newbieyoung.githu

ssm框架,MyBatis逆向工程(MyBatis Generator)在web專案應用

 注意:先匯入mybatis-generator-core相關包 一、建立相關配置檔案mbg.xm mbg.xml編寫方法見MyBatis Generator參考文件:http://www.mybatis.org/generator/configreference/xmlco

多執行緒 —— 多執行緒在WEB開發應用相關問題

    1. web應用中,要對某一個任務用多執行緒實現,最簡單的程式碼格式是不是必須把要執行的程式碼放在run方法中?     WEB伺服器會幫你把每個訪問請求開闢一個執行緒,你只要按照你所開發的框架,比如tomcat會讓你利用servlet這個框架來寫程式碼。具體真的一

【前端框架】Backbone.js在大型單頁面應用應用實踐

Backbone.js是什麼? Backbone.js是一個JavaScript MVC框架,提供了良好的程式碼組織能力,可以方便地將應用程式解耦成可以複用的部分,為建立大型的單頁面應用提供框架支援,目前的版本是0.9.10(注:現在已到1.2.1版本)。通過將應用程式分解成MVC模式中不同職責的模組,

Render函式在Vue多頁面應用應用

標籤 Vue、apiCloud、HTML 寫在前面 背景介紹 因一些歷史遺留問題,需要維護一款藉助apiCloud開發的專案,需要實現公共元件抽離 通過此分享你將 瞭解apiCloud多頁面專案中引入Vue開發 如何在瀏覽器中除錯apiCloud專案

websphere的會話超時設定 和 web應用web.xmlsession-timeout關係

was幫助文件對會話超時的定義: 會話超時 指定在會話不再有效之前它有多長的時間可以保持不使用狀態。指定設定超時或無超時。以分鐘為單位指定大於或等於 2 的值。Web 模組部署描述符檔案中指定的值優先於管理控制檯設定。然而,如果未在 Web 模組部署描述符中指定會話超

tomcat下多個web應用使用相同的log4j的jar包,如何避免配置檔案發生衝突

我們在開發的時候通常會遇到再同一個伺服器下開發多個應用的情況,在公共jar包統一載入的情況下,如果log4j.properties配置不當,經常會發生多個應用的log日誌都列印到一個檔案裡了,如果配置檔案配置的是輸出所有log列印,那麼web應用的載入順序就是導致這個問題的

解決was8.5下自帶log4j和slf4j的jar包與應用jar包衝突問題

解決was下的jar包衝突問題我是為was建立共享庫,更改was的載入順序,使其先載入本地檔案: 第一步:         新建一個資料夾作為共享庫,將log4j和slf4j的相關jar包放到該資料夾下; 第二步:         開啟was的控制檯,環境--共享庫--新建

Java-Servlet--《12-WEB應用的普通Java程序如何讀取資源文件.mp4》 有疑問

疑問 文件 什麽 get java程序 blog java rop col \第五天-servlet開發和ServletConfig與ServletContext對象\12-WEB應用中的普通Java程序如何讀取資源文件.mp4; 多層時,DAO為了得到資源文件中的配置

協程在Web服務器應用(配的圖還不錯)

via 進程 應用 lib 協程 解決方案 多個 微線程 變量 協程(纖程,微線程)這個概念早就有之,各家互聯網公司也都有研究,但在國內各大論壇和大會熱起來,還是今年的事。 最近參與討論開放平臺建設和架構設計過程中,有同事提到了使用協程代替線程,能

web應用的異常處理

異常類 row server ade actor pack exc request ext 樓主前幾天寫了一篇“Java子線程中的異常處理(通用)”文章,介紹了在多線程環境下3種通用的異常處理方法。 但是平時大家的工作一般是基於開發框架進行的(比如

Web-request內置對象在JSP編程應用

web .com quest inf alt http TP jsp 分享 Web-request內置對象在JSP編程中的應用

Java Web應用支持跨域請求

通過 sca info def gist time 並且 tomcat json 轉載:https://blog.csdn.net/lmy86263/article/details/51724221 由於工程合作開發的需要,後臺的應用要能支持跨域訪問,但是在這個跨域

WebSphere配置的數據源在Web應用引用的寫法

padding websphere 技術分享 org info href adding title framework WebSphere中配置的數據源在Web應用中引用時名稱一定要和數據源的JNDI名稱保持一致,否則會出現無法找到數據源的錯誤。 引用WAS的數據源時只需要

學習筆記(七):樸素貝葉斯在Web安全的六個應用

一、檢測Web異常操作        1.資料蒐集:一樣        2.特徵化             使用詞集模型,統計全部操作命令,去重後形

ireport圖片在web應用問題解決方法

要解決的問題? 用ireport設計表報在web中圖片不顯示如何解決! 1、 先用ireport把報表設計好,對應為了解決圖片顯示,所以需要一些簡單處理方式。 第一、在parameters中新增引數,作為圖片要傳的url地址,我這裡命名為:leaf_banner_violet 第