Log4配置和用法
对JAVA WEB 应用来说,我们可以有两种方案。一种是配置成 log4j.properties ,一种是配置成 log4j.xml形式。我们这里采用的是log4j.xml形式。现分别叙述如下:
<1>配置成log4j.properties 需要Log4jInit.java初始化Sevlet类,Web.xml,log4j.properties
(1)Log4jInit.java初始化Sevlet类:
public class Log4jInit extends HttpServlet {
public void init() {
//通过web.xml来动态取得配置文件
String prefix = getServletContext().getRealPath("/WEB-INF/class/");
String file = getInitParameter("log4j-init-file");
// 如果没有给出相应的配置文件,则不进行初始化
if(file != null) {
PropertyConfigurator.configure(prefix+file);//(1)
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res) {
}
}
(2)Web.xml需要配置这个Servlet。
<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>pub.Log4jInit</servlet-class>
<init-param>
<param-name>log4j-init-file</param-name>
<param-value>log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
因为log4j的初始化要在所有的log4j调用之前完成,所以在web.xml文件中,我们一定要把对应的Servlet定义的load-on-startup应设为1,以便在Web容器启动时即装入该Servlet。
(3)配置log4j.properties
一个有用的log4j.properties文件模板 ##Log4J的配置之简单使它遍及于越来越多的应用中了 ##Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了。 ##此文件(log4j.properties)内容来自网络,非本文作者原创。
log4j.rootLogger=DEBUG, CONSOLE,A1 log4j.addivity.org.apache=true # 应用于控制台 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.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#应用于文件 log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=file.log log4j.appender.FILE.Append=false log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n # Use this layout for LogFactor 5 analysis
# 应用于文件回滚 log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.MaxFileSize=10KB log4j.appender.ROLLING_FILE.MaxBackupIndex=1 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#应用于socket log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 发送日志给邮件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From=web@www.wuset.com log4j.appender.MAIL.SMTPHost=www.wusetu.com log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=web@www.wusetu.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# 用于数据库 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.user=root
|
我们这么采用的是:
#log4j.properties
log4j.rootLogger=debug, A1 #RollingFileAppender log4j.appender.A1=org.apache.log4j.RollingFileAppender log4j.appender.A1.File=d:/log/picchr.log log4j.appender.A1.MaxFileSize=100KB log4j.appender.A1.MaxBackupIndex=1 log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n #backup need:debug, A1 ,R #log4j.appender.R=org.apache.log4j.RollingFileAppender #log4j.appender.R.File=backup.log #log4j.appender.R.MaxFileSize=100KB #log4j.appender.R.MaxBackupIndex=1 #log4j.appender.R.layout=org.apache.log4j.TTCCLayout
#ConsoleAppender log4j.appender.B1=org.apache.log4j.ConsoleAppender log4j.appender.B1.layout=org.apache.log4j.PatternLayout log4j.appender.B1.layout.ConversionPattern=%-4r %-5p [%t] % 37c %3x - %m%n log4j.appender.B1.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n |
完成了这三个步骤这后,我们就可以象在application开发中一样在web application任何地方应用log4j了
其中 下面是在javabean中的应用的一个例子。
import org.apache.log4j.Logger;
public class InfoForm {
static Logger logger = Logger.getLogger(InfoForm.class);
protected String title;
protected String content;
public InfoForm() {}
public void setTitle(Object value) {
logger.debug("nepalon:title = " + title);
title = value;
}
public String getTitle() {
logger.debug("nepalon:title = " + title);
return title;
}
public void setContent(String value) {
content = value;
logger.debug("nepalon: content() = " + content);
}
public String getContent() {
logger.debug("nepalon: content = /n" + content);
return content;
}
}
<2>配置成log4j.xml ,不需要Log4jInit.java初始化Sevlet类,Web.xml等
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!-- Standard Log4j Logging file for Spring Application --> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Make sure a copy of what we log goes to the console --> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <param name="Threshold" value="INFO"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> </layout> </appender>
<!-- Make sure a copy of what we log goes to log file --> <appender name="LOGFILE" class="org.apache.log4j.RollingFileAppender"> <param name="Threshold" value="DEBUG"/> <param name="File" value="d://log//picchr.log"/> <param name="Append" value="true"/> <param name="MaxFileSize" value="3000KB"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{DATE} %-5p % -15c {1}: %m%n"/> </layout> </appender>
<!-- Sample of how to switch off / on debugging for different parts of the application in this case , the plugin-manager --> <!-- <category name="net.firstpartners.rp.mid.global.PluginManager" additivity="false"> <priority value="DEBUG"/> <appender-ref ref="LOGFILE"/> </category> --> <root> <priority value="DEBUG"/> <appender-ref ref="CONSOLE"/> <appender-ref ref="LOGFILE"/> </root> </log4j:configuration> |
对应的BaseScaleBean.java文件如下
/** * @author lss *社保比例设定 */ public class BaseScaleBean { protected final Logger log = Logger.getLogger(getClass()); public String LastOperMsg=""; private Conn conn=new Conn (); public boolean PostEdit(HttpServletRequest request){ if(log.isInfoEnabled()){ log.info("薪酬管理_社保比例设定");} try{ String Oper=request.getParameter("Oper"); if (Oper==null || Oper.trim().length()<1) { LastOperMsg="参数不正确!"; return false; } if(Oper.equals("edit")) { String strID=request.getParameter("HiddenKey"); //入职时间,试用期,缴纳保险金时间 String CropScale=request.getParameter("CropScale"); String PersonScale=request.getParameter("PersonScale"); String Other=request.getParameter("Other");
String mSql="update salary02_formula set "; mSql+="CropScale="+CropScale+",PersonScale="+PersonScale+",Other="+Other+""; mSql+=" where id="+strID; if(log.isDebugEnabled()){ log.debug("薪酬管理_社保比例设定_编辑_SQL语句:"+mSql);} if (conn.execSql(mSql)) { return true; }else{ LastOperMsg="编辑错误!"; return false; } } else { LastOperMsg="参数不正确!"; return false; }
}catch(Exception e){ log.error("薪酬管理_社保比例设定_编辑_报错:"+e.getMessage()); LastOperMsg=e.getMessage(); return false; } }
} |
对应的jsp文件。如seleader.jsp
<%@ page contentType="text/html; charset=gbk" language="java" import="java.sql.*" errorPage="" %> <%@ page import ="pub.*" %> <%@ page import ="org.apache.log4j.Logger"%> <%-- Get a reference to the logger for this class --%> <% Logger log = Logger.getLogger(getClass()); %> <% int x=Check.CheckPage(request,"salary_societybase_list"); String Error=""; if (x==1){ Error="<script>alert('你已掉线,需要重新登陆!');top.location.href='../login.jsp'</script>"; }else{ if (x==2){ Error="<script>alert('你无权进入该页面!');history.back();</script>"; } } %> <%=Error%> <% if (x!=0){ return; } %> <!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk"> <title>领导权限设定</title> <link href="../css/putong.css" type="text/css" rel="stylesheet"> </head> <script language="javascript"> function fPopUpDlg(endtarget,ctl,WINname,Wleft,Wtop,WINwidth,WINheight){ newWINwidth = WINwidth + 4 + 18; var features = 'dialogWidth:' + newWINwidth + 'px;' + 'dialogHeight:' + WINheight + 'px;' + 'dialogLeft:' + Wleft + 'px;' + 'dialogTop:' + Wtop + 'px;' + 'directories:no; localtion:no; menubar:no; status=no; toolbar=no;scrollbars:yes;Resizeable=no'; retval = window.showModalDialog(endtarget, WINname , features ); if( retval != null ){ ctl.value = retval; }else{ //alert("canceled"); } }
function Add() { var a=showModalDialog("leader_add_dialog.jsp?Oper=add&Key=0","","status:no;resizable:yes;dialogHeight:410px;dialogWidth:460px;unadorne:yes"); if ((a==0)){ document.formlist.submit(); } }
function query(){ var a=showModalDialog("leader_dialogquery1.jsp","","status:no;resizable:yes;dialogHeight:410px;dialogWidth:460px;unadorne:yes"); if ((a!=null)){ document.all.hiddensql.value=a; document.formlist.submit(); } }
function Edit(key) { var a=showModalDialog("leader_edit.jsp?Oper=edit&Key="+key,"","status:no;resizable:yes;dialogHeight:410px;dialogWidth:460px;unadorne:yes"); if ((a==0)){ document.formlist.submit(); } }
function Del (key){ if (window.confirm("确实要删除吗?")){ var a=showModalDialog("leader_ctl.jsp?datetime="+new Date().toString()+"&Oper= del &Key="+key,"","status:no;resizable:yes;dialogHeight:410px;dialogWidth:460px;unadorne:yes"); if ((a==0)){ document.formlist.submit(); } } }
function chan(){ document.formlist.submit(); }
</script> <body> <form name="formlist" action="setleader.jsp" method="post"> <table cellSpacing="0" cellPadding="0" width="100%" bgColor="#bfcae6" border="0" background="../images/subtitle.gif"> <tr> <td width="100%" height="26"><FONT face="宋体"> <DIV align="left"><FONT face="宋体" color="#ffffff"> 当前位置:系统管理>>领导权限设定</FONT> </DIV> </FONT> </td> </tr> </table> <table border="0" cellpadding="0" cellspacing="0" width="100%" background="../images/ico_14.jpg"> <tr>
<td height="26" align="right"> </td> <td width="60" align="right">领导职务:</td> <td width="80" align="right"><input type="text" name="LeaderPostion" style="width:80px " class="input"></td> <td width="60" align="right">领导姓名:</td> <td width="80" align="right"><input type="text" name="LeaderName" style="width:80px " class="input"></td> <td width="90" align="right"><input name="submit" type="submit" class="button" style="WIDTH: 80px" value="查询"></td> <td width="90" align="right"><input name="button2" type="button" class="button" style="WIDTH: 80px" onClick="Add();" value="添加领导"></td> <td width="90" align="right"><input name="button" type="button" class="button" style="WIDTH: 80px" onClick="javascript:window.print();" value="打印"></td> <td width="10" align="right"> </td> </tr> </table>
<%
DataGrid dg=new DataGrid("1",request,"formlist",15,""); DataGridColumnItem dgci=new DataGridColumnItem(); dgci.ColType=ColumnItemType.BindDataColumn; dgci.HeadText="领导号"; dgci.BindField="LeaderID"; dgci.Width="10%"; dg.addColumn(dgci);
dgci=new DataGridColumnItem(); dgci.ColType=ColumnItemType.BindDataColumn; dgci.HeadText="领导职务"; dgci.BindField="LeaderPostion"; dgci.Width="10%"; dg.addColumn(dgci);
dgci=new DataGridColumnItem(); dgci.ColType=ColumnItemType.BindDataColumn; dgci.HeadText="领导姓名"; dgci.BindField="UserName"; dgci.Width="10%"; dg.addColumn(dgci);
dgci=new DataGridColumnItem(); dgci.ColType=ColumnItemType.BindDataColumn; dgci.HeadText="领导职工号"; dgci.BindField="UserCode"; dgci.Width="10%"; dg.addColumn(dgci);
dgci=new DataGridColumnItem(); dgci.ColType=ColumnItemType.ButtonColumn; //dgci.HeadText="编辑"; dgci.BindField="编辑"; dgci.Script="Edit([LeaderID]);"; dgci.Width="5%"; dg.addColumn(dgci);
dgci=new DataGridColumnItem(); dgci.ColType=ColumnItemType.LinkButtonColumn; //dgci.HeadText="编辑"; dgci.BindField="查看详细信息"; dgci.Script="leader_detailedinfo.jsp?Key=[LeaderID]"; dgci.Width="20%"; dg.addColumn(dgci);
dgci=new DataGridColumnItem(); dgci.ColType=ColumnItemType.ButtonColumn; dgci.BindField="删除"; dgci.Script=" Del ([LeaderID]);"; dgci.Width="5%"; dg.addColumn(dgci);
String strLeaderPostion=request.getParameter("LeaderPostion"); String strLeaderName=request.getParameter("LeaderName"); if (strLeaderPostion== null) strLeaderPostion=""; if(strLeaderName==null) strLeaderName="";
//String strSql="select *from leader"; String strSql="select a.LeaderID,a.LeaderPostion,a.UserCode,b.UserName"; strSql+=" FROM leader a LEFT OUTER JOIN employee01_Basic b on a.LeaderID = b.UserCode " ; if(strLeaderPostion.length()>0) strSql+=" where a.LeaderPostion ='"+PubClass.getString(strLeaderPostion)+"' "; if (strLeaderPostion.length()==0 && strLeaderName.length()>0) strSql+= " where b.UserName = '"+PubClass.getString(strLeaderName)+"' "; if (strLeaderPostion.length()>0 && strLeaderName.length()>0) strSql+= " and b.UserName = '"+PubClass.getString(strLeaderName)+"' "; //System.out.println(strSql); if(log.isDebugEnabled()){ log.debug("领导设定_设定领导_SQL语句:"+strSql);} dg.bindSql(strSql); out.print(dg.ShowGrid()); %> <% String sLeaderList=""; sLeaderList="<script>document.all.LeaderPostion.value='"+PubClass.getString(strLeaderPostion)+"';</script>"; //System.out.println(sLeaderList); sLeaderList+="<script>document.all.LeaderName.value='"+PubClass.getString(strLeaderName)+"';</script>"; //System.out.println(sLeaderList); %> <%=sLeaderList%> </form> </body> </html> |
|
2006-09-12