还没整理完,下次接着写
看到几篇文章,记录一下:
http://blog.sina.com.cn/s/blog_541caaee010121gy.html
直接案例说话
案例一
新建Java project(项目名为HelloWord-log4j),新建目录lib,添加jar文件,建包com.test,建类Test1,内容如下:
package com.test;
import org.apache.log4j.Logger;
public class Test1 {
// 得到记录器
private static Logger log = Logger.getLogger(Test1.class.getName());
public static void main(String[] args) {
// 插入记录信息
log.info("Test log4j");
}
}
然后在src目录下新建一个配置文件,命名为log4j.properties,其内容如下:
log4j.rootLogger=INFO,appender1
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.SimpleLayout
运行,控制台输出如下内容:
INFO - Test log4j
案例二
将案例一的配置文件log4j.properties移到com.test包下(或者将其移到项目根目录下),其内容不变,运行,控制台输出如下内容:
log4j:WARN No appenders could be found for logger (com.test.Test1).
log4j:WARN Please initialize the log4j system properly.
案例三
将案例一的配置文件log4j.properties重命名为test.properties,依然位于src目录下,其内容不变,运行,控制台输出如下内容:
log4j:WARN No appenders could be found for logger (com.test.Test1).
log4j:WARN Please initialize the log4j system properly.
这三个案例说明:只要log4j的配置文件名为log4j.properties且该配置文件在类根路径下,则程序可自动加载该配置文件
案例四
在案例三的基础上,修改代码如下:
package com.test;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class Test1 {
// 得到记录器
private static Logger log = Logger.getLogger(Test1.class.getName());
public static void main(String[] args) {
PropertyConfigurator.configure ("src\\test.properties");
// 插入记录信息
log.info("Test log4j");
}
}
运行,控制台输出如下:
INFO - Test log4j
案例五
将案例四中的配置文件移到com.test包下
将代码中的PropertyConfigurator.configure ("src\\test.properties")修改为PropertyConfigurator.configure ("src\\com\\test\\test.properties")
运行,控制台输出如下:
INFO - Test log4j
案例六
将案例四中的配置文件移到项目根目录下
将代码中的PropertyConfigurator.configure ("src\\test.properties")修改为PropertyConfigurator.configure ("test.properties")
运行,控制台输出如下:
INFO - Test log4j
案例七
在案例四的基础上,在项目中新建目录conf,将配置文件移到该目录下
将代码中的PropertyConfigurator.configure ("src\\test.properties")修改为PropertyConfigurator.configure ("conf\\test.properties")
运行,控制台输出如下:
INFO - Test log4j
案例三、四、五、六、七说明:可以通过PropertyConfigurator.configure("");语句来加载自定义命名的配置文件(包括log4j.properties),但是依然得注意配置文件的放置目录
案例八
利用Properties类,配合new FileInputStream("")来加载配置文件,在案例七的基础上(此时配置文件位于conf目录下),修改代码
代码如下:
package com.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class Test1 {
// 得到记录器
private static Logger log = Logger.getLogger(Test1.class.getName());
public static void main(String[] args) {
Properties props = new Properties();
try {
props.load(new FileInputStream("conf\\test.properties"));
} catch (IOException e) {
e.printStackTrace();
}
PropertyConfigurator.configure(props);
// 插入记录信息
log.info("Test log4j");
}
}
运行,控制台输出如下:
INFO - Test log4j
案例九
将案例八中的配置文件移到其它目录下时(如:项目根目录或src目录或com.test包),需要相应改变代码中new FileInputStream("conf\\test.properties")中配置文件的路径,如:当配置文件位于com.test包下时,修改该语句为new FileInputStream("src\\com\\test\\test.properties")
案例八、九说明:利用Properties类,配合new FileInputStream("")读取配置文件时仍然需要使用PropertyConfigurator.configure("")语句,与直接使用PropertyConfigurator.configure("")语句没有什么太大区别;那么为什么要使用案例八/九中更为繁琐的方式呢???
答案:是因为可以完全不使用配置文件,而是在代码中通过直接使用Properties类对象来配置Log4j环境,如:
private static void initLog4j() {
Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "DEBUG, CONSOLE");
prop.setProperty("log4j.appender.CONSOLE", "org.apache.log4j.ConsoleAppender");
prop.setProperty("log4j.appender.CONSOLE.layout", "org.apache.log4j.PatternLayout");
prop.setProperty("log4j.appender.CONSOLE.layout.ConversionPattern", "%d{HH:mm:ss,SSS} [%t] %-5p %C{1} : %m%n");
PropertyConfigurator.configure(prop);
}
案例十
利用Properties类,配合ClassLoader来加载配置文件,在案例八的基础上,将配置文件移到src目录下,修改代码
代码如下:
package com.test;
import java.io.IOException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class Test1 {
// 得到记录器
private static Logger log = Logger.getLogger(Test1.class.getName());
public static void main(String[] args) {
ClassLoader loader = Test1.class.getClassLoader();
Properties props = new Properties();
try {
System.out.println(loader.getResource(""));
props.load(loader.getResourceAsStream("test.properties"));
} catch (IOException e) {
e.printStackTrace();
}
PropertyConfigurator.configure(props);
// 插入记录信息
log.info("Test log4j");
}
}
运行,控制台输出如下:
INFO - Test log4j
可以发现,此处没有src的身影,如果将路径改为src\\test.properties,然后运行程序,程序报错;
将配置文件移到com.test包下,也只需将路径修改为com\\test\\test.properties,程序即可正常运行
将配置文件移到项目根目录下,然后运行程序,程序报错;
此处的原因在于,loader.getResource("")读取的路径是bin目录
暂时还有些很多相关问题没弄明白,等待研究
代码中需要配置这些路径的原因之一在于,IDE暗中帮你做了一些事情,当你在src目录下新建文件时,它会自动将其发布到ClassPath目录(默认为bin目录)下,那代码中为什么写成src而不是bin呢
需要在项目中多处(位于不同包下的某些类中)输出日志信息,是不是应该写成工具类,以实现代码重用