日志是我们在写代码中经常会用到的,程序出错了我们也需要去查看日志来调错,对于像我们这一些新人来说,怎么去使用日志就比较陌生,下面我将我学习的过程分享一下:
1.需要找到一个log4j包,我使用的是log4j-1.2.15.jar。放在工程lib文件夹下
2.新建一个peoperties配置文件,一般取名为:log4j.properties,最好放在src文件夹下,配置文件详解如下:
# 将等级为debug的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名
log4j.rootLogger = debug, stdout,R
# 定义stdout的输出端是哪种类型,可以是ConsoleAppender(控制台),FileAppender(文件)等
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#指定输出端的layout(布局)是哪种类型
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#以PatternLayout布局,就是设置输出格式
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
#同stdout
log4j.appender.R=org.apache.log4j.RollingFileAppender
#定义以文件类型输出的问津路径及文件名
log4j.appender.R.File=D:\\nepalon\\classes\\TestLog4j\\example.log
# Archive log files (one backup file here)
#设置保存一个备份文件
log4j.appender.R.MaxBackupIndex=1
#以下都同stdout
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n
3.新建java类用来测试,代码如下:
package com.xmh.log1;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.apache.log4j.PropertyConfigurator;
public class TestLog4j {
//获取logger对象,参数为需要使用Logger的相关类
static Logger logger = Logger.getLogger(TestLog4j.class.getName()); //(2)
public TestLog4j(){}
public static void main(String[] args)
{
System.out.println("TestLog4j:"+TestLog4j.class);
System.out.println("TestLog4j:"+TestLog4j.class.getName());
//同时输出到控制台和一个文件的实例并实现了Logger的继承
//加载配置文件,建议放在src下面
PropertyConfigurator.configure("<a target=_blank href="file://\\log4j.properties">\\log4j.properties</a>");
//下面是用logger的5个等级分别输出日志
logger.debug("Start of the main() in TestLog4j");
logger.info("Just testing a log message with priority set to INFO");
logger.warn("Just testing a log message with priority set to WARN");
logger.error("Just testing a log message with priority set to ERROR");
logger.fatal("Just testing a log message with priority set to FATAL");
logger.log(Priority.WARN, "Testing a log message use a alternate form");
logger.debug(TestLog4j.class.getName());
//调用另一文件的testLog()方法
TestLog4 testLog4j2 = new TestLog4();
testLog4j2.testLog();
}
}
package com.xmh.log1;
import java.io.IOException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.apache.log4j.PropertyConfigurator;
import com.xmh.servlet.Log4j.Log4jInit;
public class TestLog4 {
static Logger logger = Logger.getLogger(TestLog4.class.getName());
public TestLog4(){}
public void testLog()
{
//同时输出到控制台和一个文件的实例
/* 用log4包加载配置文件 */
//PropertyConfigurator.configure("\\log4j.properties");
/* 用java自带peoperties加载配置文件 */
Properties props=new Properties();
try {
System.out.println("++++++properties++++++++");
props.load(Log4jInit.class
.getClassLoader()
.getResourceAsStream("log4j.properties")
);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
logger.debug("2Start of the main()");
logger.info("2Just testing a log message with priority set to INFO");
logger.warn("2Just testing a log message with priority set to WARN");
logger.error("2Just testing a log message with priority set to ERROR");
logger.fatal("2Just testing a log message with priority set to FATAL");
logger.log(Priority.DEBUG, "Testing a log message use a alternate form");
logger.debug("2End of the main()");
}
}
4.在java的web项目中初始化Logger,这样在项目中就不用每次加载,只要在需要用到的类中生成logger对象。
a.配置web.xml文件
<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>com.xmh.servlet.Log4j.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>
b.新建一个servlet,重写init方法,注意不要重写带参数的init方法,否则会有问题。
package com.xmh.servlet.Log4j;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletConfig;
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;
import org.apache.log4j.PropertyConfigurator;
/**
* Servlet implementation class Log4jInit
*/
@WebServlet("/Log4jInit")
public class Log4jInit extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see Servlet#init(ServletConfig)
*/
static Logger logger = Logger.getLogger(Log4jInit.class.getName());
public void init() throws ServletException {
System.out.println("logger初始化......");
// TODO Auto-generated method stub
//通过web.xml来动态取得配置文件
String file = getInitParameter("log4j-init-file");
System.out.println("file:"+file);
// 如果没有给出相应的配置文件,则不进行初始化
if(file != null)
{
System.out.println("----------start init------------------");
PropertyConfigurator.configure("/" + file);
logger.error("Start of the main() in TestLog4j");
}else{
System.out.println("===========没有初始化配置文件!==============");
}
}
}
5.遇到的问题:
在自学的过程中,肯定会遇到一些问题,有些人不重视,可能这才是我们真正需要学习的。
像log4的用法,在网上也有很多资料,很容易找到解释,但我在加载配置文件的时候就遇到了一些不理解的地方,
我开始向网上的方法一样,用的
String prefix = this.getServletContext().getRealPath("/");
但这取到的是绝对物理路径,这样会导致部署后有可能读取错误。(我刚开始在这里就报错,如果不报错可能也不能学习到这个知识点了)
我后来又在网上找了其他方法,基本上都不行。
后来请教以前的老师,和我简单说了一下,我和大家分享一下:
"在web应用程序中,想要加载一个文件,路径直接以 / 开头,然后看看当前读取的位置,决定是回到了应用名之前,还是应用名之后。在拼凑一个目标文件的位置就行了。不要读取getRealPath这样的绝对物理路径,这样会导致部署后有可能读取错误。