由于項目中使用的log4j.xml這種配置 在網(wǎng)上找到這份介紹較全的 就摘錄下來 一起分享
使用log4j
獲取logger
Logger.getRootLogger() 獲取根logger
Logger.getLogger(String name)獲取子logger
Logger.getLogger(Class clazz)或
Logger.getLogger(clazz.getName())
設(shè)置日志級別(.setLevel(int,Exception))
Level.ALL打開所有日志
Level.DEBUG 用于調(diào)試
Level.INFO 用于運行過程
Level.WARN 用于潛在的錯誤
Level.ERROR 用于錯誤事件
Level.FATAL 用于嚴(yán)重錯誤時間
Level.OFF 關(guān)閉所有日志
輸出端Appender(.addAppender(Appender).setAdditivity(boolean additive)是否覆蓋)
org.apache.log4j.ConsoleAppender 輸出到控制臺
targer:
ConsoleAppender.SYSTEM_OUT(Default)
ConsoleAppender.SYSTEM_ERR
public ConsoleAppender(Layout)
public ConsoleAppender(Layout,String targer)
org.apache.log4j.FileAppender 輸出到文件
public FileAppender(Layout,String fileName)
public FileAppender(Layout,String fileName,boolean append)是否覆蓋
org.apache.log4j.DailyRollingFileAppender 輸出到文件,每天一個新文件
org.apache.log4j.RollingFileAppender 輸出到文件,自動新增改名
public RollingFileAppender(Layout,String fileName)
void setMaxBackupIndex(int index) 設(shè)置日志文件最大備份數(shù)
void setMaximumFileSize(long size) 設(shè)置日志文件最大尺寸
org.apache.log4j.WriterAppender 流格式輸出到任意地方
org.apache.log4j.JDBCAppender 輸出到數(shù)據(jù)庫
日志格式化(Layout)
%c 類全名
%d 時間
%f 類名
%l 位置
%m 信息
%n 換行
%p 級別
%r 耗時
%t 線程名
public PatternLayout() 使用默認(rèn)設(shè)置DEFAULT_CONVERSION_PATTERN 只打印信息
public PatternLayout(String)使用自定義的pattern構(gòu)造一個PatternLayout
void setConversionPattern(String) 設(shè)置日志格式
HTMLLayout
SimpleLayout
5.
1.BasicConfigurator.configure()
PatternLayout p = new PatternLayout("%p [%t] %c (%F:%L) - %m%n");
ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT);
root.addAppender(a);
rootLogger.setLevel(Level.DEBUG);
2.PropertyConfigurator.configure("/help/example.properties")
String resource = "/help/example.properties";
URL configFileResource = Log4J.class.getResource(resource);
PropertyConfigurator.configure(configFileResource);
3.DOMConfigurator.configure("/help/example.xml")
xml declaration and dtd
|
log4j:configuration
|
+-- appender (name, class)
| |
| +-- param (name, value)
| +-- layout (class)
| |
| +-- param (name, value)
+-- logger (name, additivity)
| |
| +-- level (class, value)
| | |
| | +-- param (name, value)
| +-- appender-ref (ref)
+-- root
|
+-- param (name, class)
+-- level
| |
| +-- param (name, value)
+-- appender-ref (ref)
0.log4j.properties模板
log4j.rootLogger=info,CONSOLE,RFILE,FILE,DB 設(shè)置級別和三個輸出端
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out 控制臺類型
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= %4p [%t] (%F:%L) - %m%n
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=/help/my.properties 目標(biāo)文件
log4j.appender.FILE.Append=false 是否追加
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 布局模式
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %c:%L - %m%n 格式化布局
log4j.appender.RFILE=org.apache.log4j.RollingFileAppender
log4j.appender.RFILE.File=/help/my.properties 目標(biāo)文件
log4j.appender.RFILE.MaxFileSize=1KB 最大長度
log4j.appender.RFILE.MaxBackupIndex=3 最多備份
log4j.appender.RFILE.layout=org.apache.log4j.PatternLayout 布局模式
log4j.appender.RFILE.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %c:%L - %m%n 格式化布局
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DB.URL=jdbc:oracle:thin:@127.0.0.1:1521:mumu URL
log4j.appender.DB.driver=oracle.jdbc.driver.OracleDriver 驅(qū)動
log4j.appender.DB.user=liulibo 用戶名
log4j.appender.DB.password=liulibo 密碼
log4j.appender.DB.layout=org.apache.log4j.PatternLayout 布局模式
log4j.appender.DB.layout.ConversionPattern=insert into log4j(createdate,thread,level_,class,message) values(\'%d\',\'%t\',\'%-5p\',\'%c\',\'%m\')
create table log4j(createdate varchar2(32),thread varchar2(32),level_ varchar2(32),class varchar2(32),message varchar2(32));
0.XML模板
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n"/>
</layout>
</appender>
<appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender">
<param name="Append" value="false"/>
<param name="MaxFileSize" value="1KB"/>
<param name="File" value="dom/my.log"/>
<param name="MaxBackupIndex" value="3"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n"/>
</layout>
</appender>
<appender name="JDBCAppender" class="org.apache.log4j.jdbc.JDBCAppender">
<param name="URL" value="jdbc:oracle:thin:@127.0.0.1:1521:mumu"/>
<param name="user" value="liulibo"/>
<param name="password" value="liulibo"/>
<param name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="insert into log4j(createdate,thread,level_,class,message) values(\'%d\',\'%t\',\'%-5p\',\'%c\',\'%m\')"/>
</layout>
</appender>
<root>
<priority value ="debug" />
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="RollingFileAppender"/>
<appender-ref ref="JDBCAppender"/>
</root>
</log4j:configuration>
應(yīng)用
web.xml
<context-param>
<param-name>props</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>cart.listener.SCServletContextListener</listener-class>
</listener>
初始化方法中添加
private void initLog4j(ServletContext context){
String prefix = context.getRealPath("/");
System.out.println("prefix:"+prefix);
String props = context.getInitParameter("props");
if(props != null) {
PropertyConfigurator.configure(prefix+props);
}
Logger logger = Logger.getLogger(SCServletContextListener.class);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration threshold="debug"
xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="console.CONSOLE"
class="org.apache.log4j.ConsoleAppender">
<param name="threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<!--
<param name="ConversionPattern" value="%d{HH:mm:ss}[%C.%M(%L)-%p] %m%n"/>
-->
<param name="ConversionPattern" value="%d{HH:mm:ss}[%C(%L)-%p] %m%n"/>
</layout>
</appender>
<appender name="file.text.SYSFILE"
class="org.apache.log4j.RollingFileAppender">
<param name="threshold" value="error" />
<param name="file" value="/juyee.log" />
<param name="maxFileSize" value="2MB" />
<param name="maxBackupIndex" value="5" />
<param name="append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%-d{yyyy-MM-dd HH:mm:ss.SSS} [%p]-[%c] %m%n" />
</layout>
</appender>
<appender name="file.text.DATE_FILE"
class="org.apache.log4j.DailyRollingFileAppender">
<param name="threshold" value="debug" />
<param name="file" value="/juyee.log" />
<param name="append" value="true" />
<param name="datePattern" value="'.'yyyy-MM-dd" />
<!-- each hour
<param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>
-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c] %m%n" />
</layout>
</appender>
<appender name="file.text.APPFILE"
class="org.apache.log4j.RollingFileAppender">
<param name="threshold" value="error" />
<param name="file" value="${webapp.root}/WEB-INF/logs/juyee.log" />
<param name="maxFileSize" value="1024KB" />
<param name="maxBackupIndex" value="5" />
<param name="append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d %-5p %c - %m [%t] (%F:%L)%n" />
</layout>
</appender>
<appender name="file.html.HTML"
class="org.apache.log4j.RollingFileAppender">
<param name="threshold" value="error" />
<param name="file" value="/juyee-log.html" />
<param name="maxFileSize" value="1024KB" />
<param name="maxBackupIndex" value="5" />
<param name="append" value="true" />
<layout class="org.apache.log4j.HTMLLayout" />
</appender>
<appender name="file.xml.XML"
class="org.apache.log4j.RollingFileAppender">
<param name="threshold" value="error" />
<param name="file" value="/juyee-log.xml" />
<param name="maxFileSize" value="1024KB" />
<param name="maxBackupIndex" value="5" />
<param name="append" value="true" />
<layout class="org.apache.log4j.xml.XMLLayout" />
</appender>
<appender name="mail.MAIL" class="org.apache.log4j.net.SMTPAppender">
<param name="threshold" value="debug"/>
<!--
<param name="threshold" value="fatal"/>
-->
<param name="BufferSize" value="10"/>
<param name="From" value="yangguanjun@justonetech.com"/>
<param name="SMTPHost" value="www.justonetech.com"/>
<param name="Subject" value="juyee-log4jMessage"/>
<param name="To" value="yangguanjun@justonetech.com"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss.SSS} [%p]-[%c] %m%n" />
</layout>
</appender>
<appender name="remote.CHAINSAW"
class="org.apache.log4j.net.SocketAppender">
<param name="threshold" value="fatal" />
<param name="remoteHost" value="localhost" />
<param name="port" value="4445" />
<param name="locationInfo" value="true" />
</appender>
<category name="com.juyee" additivity="true">
<priority value="info" />
<appender-ref ref="console.CONSOLE" />
<!--
<appender-ref ref="file.text.DATE_FILE" />
-->
</category>
<category name="com.co" additivity="true">
<priority value="debug" />
<appender-ref ref="console.CONSOLE" />
<appender-ref ref="file.text.DATE_FILE" />
</category>
<category name="org" additivity="true">
<priority value="WARN" />
<appender-ref ref="console.CONSOLE" />
<!--
<appender-ref ref="file.text.DATE_FILE" />
-->
</category>
<root>
<!--
<level value="trace" />
<level value="debug" />
<level value="info" />
<level value="warn" />
<level value="error" />
<level value="fatal" />
<appender-ref ref="console.CONSOLE" />
<appender-ref ref="file.text.DATE_FILE"/>
-->
</root>
</log4j:configuration>
===================================================
今天弄mondrian時才注意log4j.xml,原來一直使用log4j.properties,發(fā)現(xiàn)它比properties功能強大,可以配置輸出多個log文件。
轉(zhuǎn)一個基本的配置:
log4j 有兩種配置方法,大家熟知的是properties文件但是最近的項目實施中,每次去用戶那里裝系統(tǒng),都要苦惱于log文件放在不同位置,要改property文件就要重打jar包,麻煩的緊。而如果采用xml配置的方法,直接放在WEB-INFO下,要修改路徑,很方便。查了些資料,終于把系統(tǒng)的log4j改成在xml中配置啦。
記一下記一下……嘿嘿
附:log4j的API http://logging.apache.org/log4j/docs/api/index.html
log4i.xml 文件
<?xml version="1.0" encoding="GB2312" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="FILE"
class="org.apache.log4j.RollingFileAppender">
<!-- 設(shè)置通道file和輸出方式:org.apache.log4j.RollingFileAppender -->
<param name="File" value="D:/zhaotj/all.output.log" /><!-- 設(shè)置File參數(shù):日志輸出文件名 -->
<param name="Append" value="true" /><!-- 設(shè)置是否在重新啟動服務(wù)時,在原有日志的基礎(chǔ)添加新日志 -->
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" /><!-- 設(shè)置輸出文件項目和格式 -->
</layout>
</appender>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<!-- 設(shè)置監(jiān)視器輸出方式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%-4r [%t] %-5p %c %x - %m%n" />
</layout>
<!--濾鏡設(shè)置輸出的級別-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="info" />
<param name="levelMax" value="info" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<root><!-- 設(shè)置接收所有輸出的通道 -->
<priority value="info" />
<appender-ref ref="FILE" /><!-- 與前面的通道id相對應(yīng) -->
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
建好xml文件后 要寫一個servlet類繼承actionservlet,當(dāng)工程初始化時自動加載xml配置文件
package com.asiainfo;
import javax.servlet.ServletException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.struts.action.ActionServlet;
public class ExtendedActionServlet extends ActionServlet {
private Log log = LogFactory.getLog(this.getClass().getName());
public ExtendedActionServlet() {}
public void init() throws ServletException {
log.info(
"Initializing, My MyActionServlet init this System's Const Variable");
String prefix = this.getServletConfig().getServletContext().getRealPath(
"/");//讀取項目的路徑
String file = this.getServletConfig().getInitParameter("log4j");
//讀取log4j相對路徑
String filePath = prefix + file;
DOMConfigurator.configure(filePath);//加載.xml文件
log.info("Initializing, end My Init");
super.init();//應(yīng)用了struts,此方法不能省,ActionServlet覆蓋了的此方法中有很多重要操作
}
}
我們可以看到 在此類中 用了相對路徑來加載xml的方法,首先通過prefix 讀取了項目的路徑然后再通過讀取web.xml中的log4j變量,獲得log4j.xml的相對路徑 兩者結(jié)合 就是他的絕對路徑拉
最后在web.xml中配置action信息 就可以實現(xiàn)加載啦
web.xml
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
com.asiainfo.ExtendedActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<!-- tsExtend -->
<init-param>
<param-name>config/tsextend</param-name><!--設(shè)備檢測子模塊-->
<param-value>
/WEB-INF/tsextend/struts-config.xml
</param-value>
</init-param>
<init-param>
<param-name>log4j</param-name><!--log4j.xml的路徑-->
<param-value>
/WEB-INF/log4j.xml
</param-value>
</init-param>
<init-param>
<param-name>info</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup><!--設(shè)置當(dāng)工程初始時便執(zhí)行-->
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
依據(jù)各個級別的日志輸出到不同文件
log4j支持這個功能,不過不能再使用Properties配置,必須使用XML
建一個log4j.xml
<?xml version= "1.0 " encoding= "UTF-8 "?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd ">
<log4j:configuration xmlns:log4j= "http://jakarta.apache.org/log4j/ ">
<appender name= "STDOUT " class= "org.apache.log4j.ConsoleAppender ">
<layout class= "org.apache.log4j.PatternLayout "/>
</appender>
<appender name= "DEBUG " class= "org.apache.log4j.RollingFileAppender ">
<param name= "File " value= "debug.log "/>
<param name= "Append " value= "true "/>
<param name= "MaxFileSize " value= "500KB "/>
<param name= "MaxBackupIndex " value= "2 "/>
<layout class= "org.apache.log4j.PatternLayout "/>
<filter class= "org.apache.log4j.varia.LevelRangeFilter ">
<param name= "LevelMax " value= "DEBUG " />
<param name= "LevelMin " value= "DEBUG " />
</filter>
</appender>
<appender name= "INFO " class= "org.apache.log4j.RollingFileAppender ">
<param name= "File " value= "info.log "/>
<param name= "Append " value= "true "/>
<param name= "MaxFileSize " value= "500KB "/>
<param name= "MaxBackupIndex " value= "2 "/>
<layout class= "org.apache.log4j.PatternLayout "/>
<filter class= "org.apache.log4j.varia.LevelRangeFilter ">
<param name= "LevelMax " value= "INFO " />
<param name= "LevelMin " value= "INFO " />
</filter>
</appender>
<root>
<appender-ref ref= "STDOUT "/>
<appender-ref ref= "DEBUG "/>
<appender-ref ref= "INFO "/>
</root>
</log4j:configuration>
代碼中DOMConfigurator.configure( "log4j.xml ");
這樣就可以在log.debug和log.info時分別打印到不同文件中,如果你還需要更多的文件,可以復(fù)制多幾次appender就可以了
(1). 輸出方式appender一般有5種:
org.apache.log4j.RollingFileAppender(滾動文件,自動記錄最新日志)
org.apache.log4j.ConsoleAppender (控制臺)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天產(chǎn)生一個日志文件)
org.apache.log4j.WriterAppender (將日志信息以流格式發(fā)送到任意指定的地方)
(2). 日記記錄的優(yōu)先級priority,優(yōu)先級由高到低分為
OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。
Log4j建議只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG這五個級別。
(3). 格式說明layout中的參數(shù)都以%開始,后面不同的參數(shù)代表不同的格式化信息(參數(shù)按字母表順序列出):
%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 輸出日志事件發(fā)生位置,包括類目名、發(fā)生線程,在代碼中的行數(shù)
%n 換行符
%m 輸出代碼指定信息,如info(“message”),輸出message
%p 輸出優(yōu)先級,即 FATAL ,ERROR 等
%r 輸出從啟動到顯示該log信息所耗費的毫秒數(shù)
%t 輸出產(chǎn)生該日志事件的線程名