由于項(xiàng)目中使用的log4j.xml這種配置 在網(wǎng)上找到這份介紹較全的 就摘錄下來(lái) 一起分享
使用log4j
獲取logger
Logger.getRootLogger() 獲取根logger
Logger.getLogger(String name)獲取子logger
Logger.getLogger(Class clazz)或
Logger.getLogger(clazz.getName())
設(shè)置日志級(jí)別(.setLevel(int,Exception))
Level.ALL打開(kāi)所有日志
Level.DEBUG 用于調(diào)試
Level.INFO 用于運(yùn)行過(guò)程
Level.WARN 用于潛在的錯(cuò)誤
Level.ERROR 用于錯(cuò)誤事件
Level.FATAL 用于嚴(yán)重錯(cuò)誤時(shí)間
Level.OFF 關(guān)閉所有日志
輸出端Appender(.addAppender(Appender).setAdditivity(boolean additive)是否覆蓋)
org.apache.log4j.ConsoleAppender 輸出到控制臺(tái)
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 輸出到文件,每天一個(gè)新文件
org.apache.log4j.RollingFileAppender 輸出到文件,自動(dòng)新增改名
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ù)庫(kù)
日志格式化(Layout)
%c 類(lèi)全名
%d 時(shí)間
%f 類(lèi)名
%l 位置
%m 信息
%n 換行
%p 級(jí)別
%r 耗時(shí)
%t 線程名
public PatternLayout() 使用默認(rèn)設(shè)置DEFAULT_CONVERSION_PATTERN 只打印信息
public PatternLayout(String)使用自定義的pattern構(gòu)造一個(gè)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è)置級(jí)別和三個(gè)輸出端
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out 控制臺(tái)類(lèi)型
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 最大長(zhǎng)度
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ū)動(dòng)
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時(shí)才注意log4j.xml,原來(lái)一直使用log4j.properties,發(fā)現(xiàn)它比properties功能強(qiáng)大,可以配置輸出多個(gè)log文件。
轉(zhuǎn)一個(gè)基本的配置:
log4j 有兩種配置方法,大家熟知的是properties文件但是最近的項(xiàng)目實(shí)施中,每次去用戶那里裝系統(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è)置是否在重新啟動(dòng)服務(wù)時(shí),在原有日志的基礎(chǔ)添加新日志 -->
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" /><!-- 設(shè)置輸出文件項(xiàng)目和格式 -->
</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è)置輸出的級(jí)別-->
<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相對(duì)應(yīng) -->
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
建好xml文件后 要寫(xiě)一個(gè)servlet類(lèi)繼承actionservlet,當(dāng)工程初始化時(shí)自動(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(
"/");//讀取項(xiàng)目的路徑
String file = this.getServletConfig().getInitParameter("log4j");
//讀取log4j相對(duì)路徑
String filePath = prefix + file;
DOMConfigurator.configure(filePath);//加載.xml文件
log.info("Initializing, end My Init");
super.init();//應(yīng)用了struts,此方法不能省,ActionServlet覆蓋了的此方法中有很多重要操作
}
}
我們可以看到 在此類(lèi)中 用了相對(duì)路徑來(lái)加載xml的方法,首先通過(guò)prefix 讀取了項(xiàng)目的路徑然后再通過(guò)讀取web.xml中的log4j變量,獲得log4j.xml的相對(duì)路徑 兩者結(jié)合 就是他的絕對(duì)路徑拉
最后在web.xml中配置action信息 就可以實(shí)現(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è)備檢測(cè)子模塊-->
<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)工程初始時(shí)便執(zhí)行-->
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
依據(jù)各個(gè)級(jí)別的日志輸出到不同文件
log4j支持這個(gè)功能,不過(guò)不能再使用Properties配置,必須使用XML
建一個(gè)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時(shí)分別打印到不同文件中,如果你還需要更多的文件,可以復(fù)制多幾次appender就可以了
(1). 輸出方式appender一般有5種:
org.apache.log4j.RollingFileAppender(滾動(dòng)文件,自動(dòng)記錄最新日志)
org.apache.log4j.ConsoleAppender (控制臺(tái))
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天產(chǎn)生一個(gè)日志文件)
org.apache.log4j.WriterAppender (將日志信息以流格式發(fā)送到任意指定的地方)
(2). 日記記錄的優(yōu)先級(jí)priority,優(yōu)先級(jí)由高到低分為
OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。
Log4j建議只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG這五個(gè)級(jí)別。
(3). 格式說(shuō)明layout中的參數(shù)都以%開(kāi)始,后面不同的參數(shù)代表不同的格式化信息(參數(shù)按字母表順序列出):
%c 輸出所屬類(lèi)的全名,可在修改為 %d{Num} ,Num類(lèi)名輸出的維(如:"org.apache.elathen.ClassName",%C{2}將輸出elathen.ClassName)
%d 輸出日志時(shí)間其格式為 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
%l 輸出日志事件發(fā)生位置,包括類(lèi)目名、發(fā)生線程,在代碼中的行數(shù)
%n 換行符
%m 輸出代碼指定信息,如info(“message”),輸出message
%p 輸出優(yōu)先級(jí),即 FATAL ,ERROR 等
%r 輸出從啟動(dòng)到顯示該log信息所耗費(fèi)的毫秒數(shù)
%t 輸出產(chǎn)生該日志事件的線程名