﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-hyljava-随笔分类-Struts1</title><link>http://www.blogjava.net/hyljava/category/51780.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 23 Nov 2013 23:14:00 GMT</lastBuildDate><pubDate>Sat, 23 Nov 2013 23:14:00 GMT</pubDate><ttl>60</ttl><item><title>四海兴唐课程辅导平台</title><link>http://www.blogjava.net/hyljava/archive/2013/11/23/406728.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Sat, 23 Nov 2013 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2013/11/23/406728.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/406728.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2013/11/23/406728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/406728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/406728.html</trackback:ping><description><![CDATA[<div>四海兴唐课程辅导平台<br /><a href="http://fd.itedu-g.cn/login.php">http://fd.itedu-g.cn/login.php</a></div><img src ="http://www.blogjava.net/hyljava/aggbug/406728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2013-11-23 20:52 <a href="http://www.blogjava.net/hyljava/archive/2013/11/23/406728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>升级版JDBC工具类</title><link>http://www.blogjava.net/hyljava/archive/2012/05/31/379691.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Thu, 31 May 2012 14:07:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2012/05/31/379691.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/379691.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2012/05/31/379691.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/379691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/379691.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.ParameterMetaData;<br />import java.sql.PreparedStatement;<br />import java.sql.ResultSet;<br />import java.sql.ResultSetMetaData;<br />import java.sql.SQLException;<br />import java.sql.Statement;<br />import java.util.HashMap;<br />import java.util.LinkedList;<br />import java.util.List;<br />import java.util.Map;</p>
<p><br />/**<br />&nbsp;* 用户数据库访问的类<br />&nbsp;*@作者Administrator<br />&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#99;&#114;&#101;&#97;&#116;&#101;&#84;&#105;&#109;&#101;">*@createTime</a> 2011-12-5 上午11:55:18<br />&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#118;&#101;&#114;&#115;&#105;&#111;&#110;">*@version</a> 1.0<br />&nbsp;*/<br />public class DButil1 {</p>
<p>&nbsp;private Connection conn;<br />&nbsp;private Statement st;<br />&nbsp;private PreparedStatement pps;<br />&nbsp;private ResultSet rs;<br />&nbsp;public&nbsp; String url="jdbc:oracle:thin:@localhost:1521:orcl";<br />&nbsp;private String user="hyl";<br />&nbsp;private String password="hyl";<br />&nbsp;<br />&nbsp;//加载驱动、放在静态代码块中，保证驱动在整个项目中只加载一次，提高效率<br />&nbsp;static{<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Class.forName("oracle.jdbc.driver.OracleDriver");<br />&nbsp;&nbsp;} catch (ClassNotFoundException e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;<br />&nbsp;/**<br />&nbsp; * 获取连接的方法<br />&nbsp; * @return Connection 一个有效的数据库连接<br />&nbsp; */<br />&nbsp;public Connection getConnection()<br />&nbsp;{<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;//注意链接时，要换成自己的数据库名，数据库用户名及密码<br />&nbsp;&nbsp;&nbsp;Connection con=DriverManager.getConnection(url,user,password);<br />&nbsp;&nbsp;&nbsp;return con;<br />&nbsp;&nbsp;} catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return null;<br />&nbsp;}</p>
<p>&nbsp;/**<br />&nbsp; * 用于执行更新的方法,包括（insert delete update）操作<br />&nbsp; * @param sql String 类型的SQL语句<br />&nbsp; * @return Integer 表示受影响的行数<br />&nbsp; */<br />&nbsp;public int update(String sql)<br />&nbsp;{<br />&nbsp;&nbsp;//定义变量用来判断更新操作是否成功，如果返回-1说明没有影响到更新操作的数据库记录条数，即更新操作失败<br />&nbsp;&nbsp;int row=-1;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;//如果数据库链接被关闭了，就要既得一个新的链接<br />&nbsp;&nbsp;&nbsp;if(conn==null||conn.isClosed()){<br />&nbsp;&nbsp;&nbsp;&nbsp; conn=getConnection();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;//使用Connection对象conn的createStatement()创建Statement（数据库语句对象）st<br />&nbsp;&nbsp;&nbsp;st=conn.createStatement();<br />&nbsp;&nbsp;&nbsp;//执行更新操作，返回影响的记录条数row<br />&nbsp;&nbsp;&nbsp;row=st.executeUpdate(sql);<br />&nbsp;&nbsp;} catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;finally{<br />&nbsp;&nbsp;&nbsp;close();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return row;<br />&nbsp;}<br />&nbsp;<br />&nbsp;/**<br />&nbsp; * 基于PreparedStatement的修改方法 PreparedStatement:表示预编译的 SQL 语句的对象<br />&nbsp; * @param sql&nbsp; String 类型的SQL语句（insert delete update）<br />&nbsp; * @param obj 存放动态参数的数组<br />&nbsp; * @return Integer 表示受影响的行数<br />&nbsp; */<br />&nbsp;public int update(String sql,Object ...obj)<br />&nbsp;{<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;//获取链接<br />&nbsp;&nbsp;&nbsp;if(conn==null||conn.isClosed()){<br />&nbsp;&nbsp;&nbsp;&nbsp; conn=getConnection();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;//创建预编译的 SQL 语句对象<br />&nbsp;&nbsp;&nbsp;pps=conn.prepareStatement(sql);<br />&nbsp;&nbsp;&nbsp;//定义变量length代表数组长度，也就是预处理的sql语句中的参数个数 <br />&nbsp;&nbsp;&nbsp;int length=0;<br />&nbsp;&nbsp;&nbsp;//ParameterMetaData：用于获取关于 PreparedStatement 对象中每个参数的类型和属性信息的对象<br />&nbsp;&nbsp;&nbsp;ParameterMetaData pmd=pps.getParameterMetaData();<br />&nbsp;&nbsp;&nbsp;length=pmd.getParameterCount();<br />&nbsp;&nbsp;&nbsp;//循环将sql语句中的?设置为obj数组中对应的值，注意从1开始，所以i要加1<br />&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;length;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;pps.setObject(i+1, obj[i]);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;//执行更新操作<br />&nbsp;&nbsp;&nbsp;return pps.executeUpdate();<br />&nbsp;&nbsp;} catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}finally{<br />&nbsp;&nbsp;&nbsp;close();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;return -1;<br />&nbsp;}<br />&nbsp;/**<br />&nbsp; * 获取一条记录的方法，要依赖于下面的queryToList方法，注意泛型的使用<br />&nbsp; * @param sql<br />&nbsp; * @return　Map&lt;String,Object&gt;<br />&nbsp; */<br />&nbsp;public Map&lt;String,Object&gt; getOneRow(String sql)<br />&nbsp;{<br />&nbsp;&nbsp;//执行下面的queryToList方法<br />&nbsp;&nbsp;List&lt;Map&lt;String,Object&gt;&gt; list=queryToList(sql);<br />&nbsp;&nbsp;//三目运算，查询结果list不为空返回list中第一个对象,否则返回null<br />&nbsp;&nbsp;return list.size()&gt;0?list.get(0):null;<br />&nbsp;}<br />&nbsp;<br />&nbsp;/**<br />&nbsp; * 返回查询结果列表，形如：[{TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}, {TEST_NAME=bbb, TEST_NO=3, TEST_PWD=bbb}...]<br />&nbsp; * @param sql<br />&nbsp; * @return List&lt;Map&lt;String,Object&gt;&gt;<br />&nbsp; */<br />&nbsp;public List&lt;Map&lt;String,Object&gt;&gt; queryToList(String sql)<br />&nbsp;{<br />&nbsp;&nbsp;//创建集合列表用以保存所有查询到的记录<br />&nbsp;&nbsp;List&lt;Map&lt;String, Object&gt;&gt; list=new LinkedList&lt;Map&lt;String, Object&gt;&gt;();<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;if(conn==null||conn.isClosed()){<br />&nbsp;&nbsp;&nbsp;&nbsp; conn=getConnection();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;st=conn.createStatement();<br />&nbsp;&nbsp;&nbsp;rs=st.executeQuery(sql);<br />&nbsp;&nbsp;&nbsp;//ResultSetMetaData 是结果集元数据，可获取关于 ResultSet 对象中列的类型和属性信息的对象 例如：结果集中共包括多少列，每列的名称和类型等信息<br />&nbsp;&nbsp;&nbsp;ResultSetMetaData rsmd=rs.getMetaData();<br />&nbsp;&nbsp;&nbsp;//获取结果集中的列数<br />&nbsp;&nbsp;&nbsp;int columncount=rsmd.getColumnCount();<br />&nbsp;&nbsp;&nbsp;//while条件成立表明结果集中存在数据<br />&nbsp;&nbsp;&nbsp;while(rs.next())<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//创建一个HashMap用于存储一条数据<br />&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;String, Object&gt; onerow=new HashMap&lt;String, Object&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;//循环获取结果集中的列名及列名所对应的值，每次循环都得到一个对象，形如：{TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}<br />&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;columncount;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取指定列的名称，注意orcle中列名的大小写<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String columnName=rsmd.getColumnName(i+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onerow.put(columnName, rs.getObject(i+1));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//将获取到的对象onewrow={TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}放到集合列表中<br />&nbsp;&nbsp;&nbsp;&nbsp;list.add(onerow);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;finally{<br />&nbsp;&nbsp;&nbsp;close();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return list;<br />&nbsp;}<br />&nbsp;/**<br />&nbsp; * 返回查询结果列表,使用的是预编绎SQL 语句对象PreparedStatement<br />&nbsp; * 形如：[{TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}, {TEST_NAME=bbb, TEST_NO=3, TEST_PWD=bbb}]<br />&nbsp; * @param sql<br />&nbsp; * @param paramValues<br />&nbsp; * @return List&lt;Map&lt;String,Object&gt;&gt;<br />&nbsp; */<br />&nbsp;public List&lt;Map&lt;String,Object&gt;&gt; queryWithParam(String sql,Object ...paramValues){<br />&nbsp;&nbsp;//创建集合列表用以保存所有查询到的记录<br />&nbsp;&nbsp;List&lt;Map&lt;String, Object&gt;&gt; list=new LinkedList&lt;Map&lt;String, Object&gt;&gt;();<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;if(conn==null||conn.isClosed()){<br />&nbsp;&nbsp;&nbsp;&nbsp; conn=getConnection();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;pps = conn.prepareStatement(sql);<br />&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; paramValues.length; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;pps.setObject(i + 1, paramValues[i]);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;rs = pps.executeQuery();<br />&nbsp;&nbsp;&nbsp;//ResultSetMetaData 是结果集元数据，可获取关于 ResultSet 对象中列的类型和属性信息的对象 例如：结果集中共包括多少列，每列的名称和类型等信息<br />&nbsp;&nbsp;&nbsp;ResultSetMetaData rsmd=rs.getMetaData();<br />&nbsp;&nbsp;&nbsp;//获取结果集中的列数<br />&nbsp;&nbsp;&nbsp;int columncount=rsmd.getColumnCount();<br />&nbsp;&nbsp;&nbsp;//while条件成立表明结果集中存在数据<br />&nbsp;&nbsp;&nbsp;while (rs.next()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;//创建一个HashMap用于存储一条数据<br />&nbsp;&nbsp;&nbsp;&nbsp;HashMap&lt;String, Object&gt; onerow=new HashMap&lt;String, Object&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;//循环获取结果集中的列名及列名所对应的值，每次循环都得到一个对象，形如：{TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}<br />&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;columncount;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取指定列的名称，注意orcle中列名的大小写<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String columnName=rsmd.getColumnName(i+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onerow.put(columnName, rs.getObject(i+1));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//将获取到的对象onewrow={TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}放到集合列表中<br />&nbsp;&nbsp;&nbsp;&nbsp;list.add(onerow);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;finally{<br />&nbsp;&nbsp;&nbsp;close();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return list;<br />&nbsp;}<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;/**<br />&nbsp; * 实现oracle分页功能<br />&nbsp; * @param sql<br />&nbsp; * @param pagesize<br />&nbsp; * @param pagenow<br />&nbsp; * @return PageBean<br />&nbsp; */<br />&nbsp;public PageBean getPage(String sql,int pagesize,int pagenow)<br />&nbsp;{<br />&nbsp;&nbsp;PageBean pb=new PageBean();<br />&nbsp;&nbsp;int end=pagenow*pagesize;<br />&nbsp;&nbsp;int start=end-pagesize+1;<br />&nbsp;&nbsp;String exesql="select a.* from (select t.*,rownum as rowindex from ("+sql+") t where rownum&lt;="+end+" ) a where a.rowindex&gt;="+start;<br />&nbsp;&nbsp;String countsql="select count(*) as rowcount from ("+sql+")";<br />&nbsp;&nbsp;pb.setResult(queryToList(exesql));<br />&nbsp;&nbsp;pb.setPagenow(pagenow);<br />&nbsp;&nbsp;pb.setPagesize(pagesize);<br />&nbsp;&nbsp;Map&lt;String,Object&gt; map=this.getOneRow(countsql);<br />&nbsp;&nbsp;int rows=Integer.parseInt(map.get("ROWCOUNT").toString());<br />&nbsp;&nbsp;pb.setRows(rows);<br />&nbsp;&nbsp;int pages=rows%pagesize==0?rows/pagesize:rows/pagesize+1;<br />&nbsp;&nbsp;pb.setPages(pages);<br />&nbsp;&nbsp;pb.setSql(sql);<br />&nbsp;&nbsp;return pb;<br />&nbsp;}<br />&nbsp;/**<br />&nbsp; * 关闭数据库各种资源Connection Statement PreparedStatement ResultSet的方法<br />&nbsp; */<br />&nbsp;private void close()<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp; if(rs!=null)<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;rs.close();<br />&nbsp;&nbsp;&nbsp;} catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; if(st!=null)<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;st.close();<br />&nbsp;&nbsp;&nbsp;} catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; if(pps!=null){<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;pps.close();<br />&nbsp;&nbsp;&nbsp;} catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;if(conn!=null&amp;&amp;!conn.isClosed())<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;} catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;} catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;<br />}</p><img src ="http://www.blogjava.net/hyljava/aggbug/379691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2012-05-31 22:07 <a href="http://www.blogjava.net/hyljava/archive/2012/05/31/379691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LOG4J的解析</title><link>http://www.blogjava.net/hyljava/archive/2012/05/28/379380.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Mon, 28 May 2012 11:06:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2012/05/28/379380.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/379380.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2012/05/28/379380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/379380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/379380.html</trackback:ping><description><![CDATA[<p>方法一、 解决的办法自然是用相对路径代替绝对路径，其实log4j的FileAppender本身就有这样的机制，如：log4j.appender.logfile.File=${WORKDIR}/logs/app.log <br />其中&#8220;${WORKDIR}/&#8221;是个变量，会被System Property中的&#8220;WORKDIR&#8221;的值代替。这样，我们就可以在log4j加载配置文件之前，先用System.setProperty ("WORKDIR", WORKDIR);设置好根路径，此操作可通过一初始的servlet进行。 </p>
<p>方法二、可以使用服务器环境变量 <br />log4j的配置文件支持服务器的vm的环境变量，格式类似${catalina.home} <br />log4j.appender.R=org.apache.log4j.RollingFileAppender <br />log4j.appender.R.File=${catalina.home}/logs/logs_tomcat.log <br />log4j.appender.R.MaxFileSize=10KB <br />其中的${catalina.home}并非windows系统的环境变量，这个环境变量就不需要在Windows系统的环境变量中设置。之所以这样，你可以看看tomcat\bin\catalina.bat(startup,shutdown都是调用这个)里面自带有-Dcatalina.home= "%CATALINA_HOME%" 。继承这个思想，所以你也可以自己设定一个参数-Dmylog.home="D:/abc/log"到对应的服务器java启动的vm参数中 </p>
<p>方法三、通过servlet初始化init()方法中加载file属性实现相对路径 <br />具体实现:做一个servlet,在系统加载的时候,就把properties的文件读到一个properties文件中.那个file的属性值(我使用的是相对目录)改掉(前面加上系统的根目录),让后把这个properties对象设置到propertyConfig中去,这样就初始化了log的设置.在后面的使用中就用不着再配置了 <br />一般在我们开发项目过程中,log4j日志输出路径固定到某个文件夹,这样如果我换一个环境,日志路径又需要重新修改,比较不方便,目前我采用了动态改变日志路径方法来实现相对路径保存日志文件 <br />(1).在项目启动时,装入初始化类: <br />public class Log4jInit extends HttpServlet { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static Logger logger = Logger.getLogger(Log4jInit.class); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Log4jInit() { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void init(ServletConfig config) throws ServletException { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String prefix = config.getServletContext().getRealPath("/"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String file = config.getInitParameter("log4j"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = prefix + file; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Properties props = new Properties(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream istream = new FileInputStream(filePath); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.load(istream); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; istream.close(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //toPrint(props.getProperty("log4j.appender.file.File")); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String logFile = prefix + props.getProperty("log4j.appender.file.File");//设置路径 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.setProperty("log4j.appender.file.File",logFile); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PropertyConfigurator.configure(props);//装入log4j配置信息 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; toPrint("Could not read configuration file [" + filePath + "]."); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; toPrint("Ignoring configuration file [" + filePath + "]."); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void toPrint(String content) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(content); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />} <br />实际上log4j的配置文件log4j.properties如为默认名，可放置在JVM能读到的classpath里的任意地方，一般是放在WEB- INF/classes目录下。当log4j的配置文件不再是默认名，则需要另外加载并给出参数，如上 &#8220;ropertyConfigurator.configure(props);//装入log4j配置信息&#8221; </p>
<p>(2).Web.xml中的配置 <br />&lt;servlet&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;log4j-init&lt;/servlet-name&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;Log4jInit&lt;/servlet-class&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;log4j&lt;/param-name&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;WEB-INF/classes/log4j.properties&lt;/param-value&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet&gt; </p>
<p>注意：上面的load-on-startup设为0，以便在Web容器启动时即装入该Servlet。log4j.properties文件放在根的properties子目录中，也可以把它放在其它目录中。应该把.properties文件集中存放，这样方便管理。 <br />(3).log4j.properties中即可配置log4j.appender.file.File为当前应用的相对路径. </p>
<p><br />以上是网上log4j日志文件的相对路径配置的三种方法（我能找到的就三种），分析： </p>
<p>方法一主要是扩展了log4j的RollingFileAppender类，其他的FileAppender同样道理。扩展的方法，就是用一个子类去覆盖setFile方法，这个方法在log4j读取配置文件生成appender的时候调用，传入的就是配 <br />置文件中的路径，这样我就可以按照自己的想法在路径前面加上根路径了。这种方法可以在log4j.properties中用相对路径自由配置log4j.appender.A1.File属性来决定生成的日志相对web应用根 <br />目录的位置。 </p>
<p>方法二是利用服务器vm中已经存在的环境变量如${catalina.home}来设置相对于${catalina.home}的日志路径，日志只能放到服务器子目录里，而且如果是用的其它服务器，则要改对应的环境变量。此方法平台移植不方便。 </p>
<p>方法三是扩展ActionServlet类，覆盖其init()方法，新方法中载入log4j.properties位置的参数，可以自由配置log4j的配置文件的名字和存放位置。也可自由配置log4j日志文件的相对于当前应用的路径。详 <br />细代码如下： </p>
<p>程序代码 <br />package wbb.bysxxglxt.util; </p>
<p>import org.apache.struts.action.*; <br />import org.apache.commons.logging.LogFactory; <br />import org.apache.commons.logging.Log; <br />import javax.servlet.ServletException; <br />import java.util.Properties; <br />import java.io.InputStream; <br />import org.apache.log4j.PropertyConfigurator; <br />import java.io.FileInputStream; <br />import java.io.IOException; </p>
<p>public class ExtendedActionServlet extends ActionServlet { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Log log = LogFactory.getLog(this.getClass().getName()); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ExtendedActionServlet() {} </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void init() throws ServletException { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info( <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Initializing, My MyActionServlet init this System's Const Variable"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String prefix = this.getServletConfig().getServletContext().getRealPath( <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "/"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String file = this.getServletConfig().getInitParameter("log4j"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = prefix + file; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Properties props = new Properties(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(prefix); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(file); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(filePath); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream log4jStream = new FileInputStream(filePath); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.load(log4jStream); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4jStream.close(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String logFile = prefix + <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.getProperty("log4j.appender.A1.File"); //设置路径 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(logFile); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.setProperty("log4j.appender.A1.File", logFile); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PropertyConfigurator.configure(props); //装入log4j配置信息 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info("Initializing, end My Init"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.init();//应用了struts,此方法不能省，ActionServlet覆盖了的此方法中有很多重要操作 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />} </p>
<p><br />**********************应用web.xml 关键部分*************************** </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />程序代码 <br />&lt;servlet&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;wbb.bysxxglxt.util.ExtendedActionServlet&lt;/servlet-class&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;log4j&lt;/param-name&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;properties\log4j.properties&lt;/param-value&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;0&lt;/param-value&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;application&lt;/param-name&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;ApplicationResources&lt;/param-value&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;0&lt;/load-on-startup&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt; </p>
<p><br />注意log4j参数中相对路径的斜杠线的写法，而且log4j属性文件如放置在web-inf/classes目录或web-inf等目录中最好改名，因为在加载此Servlet之前，服务器如tomcat启动时会自动搜索web-inf目录和web-inf/classes目录中log4j.properties文件，如有则自动加载。log4j属性文件加载后,由于该属性文件中log4j.appender.A1.File的值用的是相对路径，自动加载配置便会出错： <br />log4j:ERROR setFile(null,true) call failed. <br />java.io.FileNotFoundException: WEB-INF\logs\bysxxglxt.log (系统找不到指定的路径。) <br />不知道log4j为什么会这么早自动启动。尽管后面加载扩展的ActionServlet中正确设置了log4j属性文件并正常加载了，但报的这个错还是怪不爽的，于是只有更改log4j属性文件名字或者更改其存放位置，让其不能自动加载了，不过还是有两个警告： <br />log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax). <br />log4j:WARN Please initialize the log4j system properly. <br />这样做就算是掩耳盗铃了，如果你有更好的解决办法，希望能在此贴出来，大家一起研究。 </p>
<p>********************log4j.properties***************************** <br />### 设置logger级别 ### </p>
<p>程序代码 <br />log4j.rootLogger=DEBUG,stdout,A1 </p>
<p>### appender.stdout输出到控制台 ### <br />log4j.appender.stdout=org.apache.log4j.ConsoleAppender <br />log4j.appender.stdout.Target=System.out <br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout <br />log4j.appender.stdout.layout.ConversionPattern= [%5p] [BYSXXGLXT] %d{yyyy-MM-dd HH:mm:ss}: %-4r [%-5p] [%t] ( %F,%L ) - %m%n </p>
<p>### appender.A1输出到日志文件 ### <br />log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender <br />log4j.appender.A1.File=WEB-INF\\logs\\bysxxglxt.log <br />##注意上面日志文件相对应用根目录路径的写法 <br />log4j.appender.A1.DatePattern='.'yyyy-MM-dd'.log' <br />log4j.appender.A1.Append=true <br />## 输出DEBUG级别以上的日志 <br />log4j.appender.A1.Threshold=DEBUG <br />log4j.appender.A1.layout=org.apache.log4j.PatternLayout <br />log4j.appender.A1.layout.ConversionPattern= [%5p] [BYSXXGLXT] %d{yyyy-MM-dd HH:mm:ss}: %-4r&nbsp;&nbsp;&nbsp;&nbsp; [%t] ( %F,%L ) - %m%n <br /></p><img src ="http://www.blogjava.net/hyljava/aggbug/379380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2012-05-28 19:06 <a href="http://www.blogjava.net/hyljava/archive/2012/05/28/379380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j的简单配置</title><link>http://www.blogjava.net/hyljava/archive/2012/05/28/379378.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Mon, 28 May 2012 11:04:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2012/05/28/379378.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/379378.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2012/05/28/379378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/379378.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/379378.html</trackback:ping><description><![CDATA[<p>&nbsp;首先导入两个包:&nbsp; commons-logging.jar&nbsp; log4j-1.2.12.jar</p>
<p>&nbsp;&nbsp; 在src下编写3个 properties文件</p>
<p>1.log4j.properties 下面是内容</p>
<p><br />##LOGGERS</p>
<p>#define a logger<br />log4j.rootLogger=INFO,console,file</p>
<p>##APPENDERS<br />#define an appender named console<br />log4j.appender.console=org.apache.log4j.ConsoleAppender<br />#define an appender named file<br />log4j.appender.file=org.apache.log4j.RollingFileAppender<br />log4j.appender.file.File=d:/demo_log.txt<br />#set the log's size<br />log4j.appender.file.MaxFileSize=1000KB<br />log4j.appender.file.MaxBackupIndex=20</p>
<p>##LAYOUTS<br />#assign a SimpleLayout to console appender<br />log4j.appender.console.layout=org.apache.log4j.SimpleLayout<br />#assign a PatternLayout to file appender<br />log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />log4j.appender.file.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n</p>
<p>&nbsp;</p>
<p>2.<br />&nbsp;&nbsp;&nbsp; simplelog.properties下面是内容</p>
<p><br />log.apache.commons.logging.simplelog.defaultlog=info</p>
<p>3.<br />&nbsp;&nbsp;&nbsp; commons-logging.properties下面是内容</p>
<p>##set Log as Log4J<br />org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger</p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/hyljava/aggbug/379378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2012-05-28 19:04 <a href="http://www.blogjava.net/hyljava/archive/2012/05/28/379378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j的作用  </title><link>http://www.blogjava.net/hyljava/archive/2012/05/25/379099.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Fri, 25 May 2012 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2012/05/25/379099.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/379099.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2012/05/25/379099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/379099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/379099.html</trackback:ping><description><![CDATA[<div class="mcnt ztag">
<div class="nbw-bitm bdwb bds2 bdc0 ">
<div class="multicntwrap">
<div class="multicnt">
<div>
<h3 class="title pre fs1"><span class="tcnt"><font size="5" face="微软雅黑">log4j的作用</font></span>&nbsp;&nbsp;<span class="bgc0 fc07 fw0 fs0"></span></h3>
<p style="line-height: 20px" class="tdep clearfix nbw-act fc06"><span class="pleft"><span class="blogsep">&nbsp;</span></span></p></div></div></div>
<div></div>
<div class="nbw-blog-start"></div>
<div class="bct fc05 fc11 nbw-blog ztag js-fs2" __1337909406607__="ev_4088252749"><span>
<p><font face="Times New Roman">一、什么是log4j<br />Log4j 是Apache的一个开放源代码项目，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是，这些可以通过一个配置文件来灵活地进行配置，而不需要修改应用的代码。 </font></p>
<p><font face="Times New Roman">二、日志简介<br />日志指在程序中插入语句以提供调试信息。使用日志能够监视程序的执行。例如，用户利用日志可以获得关于应用程序故障的完整信息。用户可以将调试语句（如 System.out.println）插入到程序中以获得详细的调试信息。 </font></p>
<p><font face="Times New Roman">三、项目中为什么要用log4j<br />大家在编程时经常不可避免地要使用到一些日志操作，比如开发阶段的调试信息、运行时的日志记录及审计。调查显示，日志代码占代码总量的4％。通常大家可以简单地使用System.out.println()语句输出日志信息，但是往往会有一些判断，比如： <br />&nbsp;<br />if (someCondition) <br />{<br />&nbsp;&nbsp;System.out.println("some information.");<br />}</font></p>
<p><font face="Times New Roman">这些判断造成正常的程序逻辑中混杂了大量的输出语句。而在开发阶段写下的这些判断仅为了调试的语句，在开发完成时需要查找并移除。部署运行后，尤其是在一些企业应用系统中，还经常需要进一步调试，这时就遇到了更大的麻烦。所以，我们需要一套完备的、灵活的、可配置的日志工具log4J就是优秀的选择。 </font></p>
<p><font face="Times New Roman">四、log4j组件<br />Log4j 由 logger、appender 和 layout 三个组件组成。可以通过同名的 Java 类访问 Log4j 的这三个组件。</font></p>
<p><span><font face="Times New Roman">Logger - 在执行应用程序时，接收日志语句生成的日志请求。它是一种重要的日志处理组件， 可以通过 log4j API 的 logger 类对其进行访问。它的方法有：debug、info、warn、error、fatal 和 log。这些方法用于记录消息。 <br />Appender - 管理日志语句的输出结果。执行日志语句时，Logger 对象将接收来自日志语句的记录请求。此请求是通过 logger 发送至 appender 的。然后，Appender 将输出结果写入到用户选择的目的地。对于不同的日志目的地，提供不同的 appender 类型。这些 appender 包括：用于文件的 file appender、用于数据库的 JDBC appender 和用于 SMTP 服务器的 SMTP appender。 <br />Layout - 用于指定 appender 将日志语句写入日志目的地所采用的格式。appender 可以用来格式化输出结果的各种布局包括：简单布局、模式布局和 HTML 布局。</font></span></p></span></div></div></div><img src ="http://www.blogjava.net/hyljava/aggbug/379099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2012-05-25 09:32 <a href="http://www.blogjava.net/hyljava/archive/2012/05/25/379099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts自定义标签，验证非法登录</title><link>http://www.blogjava.net/hyljava/archive/2012/05/23/378971.html</link><dc:creator>何云隆</dc:creator><author>何云隆</author><pubDate>Wed, 23 May 2012 14:23:00 GMT</pubDate><guid>http://www.blogjava.net/hyljava/archive/2012/05/23/378971.html</guid><wfw:comment>http://www.blogjava.net/hyljava/comments/378971.html</wfw:comment><comments>http://www.blogjava.net/hyljava/archive/2012/05/23/378971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hyljava/comments/commentRss/378971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hyljava/services/trackbacks/378971.html</trackback:ping><description><![CDATA[<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/hyljava/1.jpg" width="209" height="359" /><br /><br /><img style="width: 1108px; height: 266px" border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/hyljava/2.jpg" width="1108" height="266" /><br /><img style="width: 957px; height: 602px" border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/hyljava/4.jpg" width="957" height="602" /><br /><img style="width: 1044px; height: 556px" border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/hyljava/06550.jpg" width="1044" height="556" /><br /><img style="width: 273px; height: 149px" border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/hyljava/3.jpg" width="273" height="149" /><br /><br /><img style="width: 596px; height: 250px" border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/hyljava/5.jpg" width="596" height="250" /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/hyljava/aggbug/378971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hyljava/" target="_blank">何云隆</a> 2012-05-23 22:23 <a href="http://www.blogjava.net/hyljava/archive/2012/05/23/378971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>