日志框架学习(3)— Log4j详细使用教程

log4j的强大功能无可置疑,但实际应用中免不了遇到某个功能需要输出独立的日志文件的情况,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢?其实只要在现有的log4j基础上稍加配置即可轻松实现这一功能。下面我们就来实际实验一把。

先来说一下环境:新建一个Java工程并导入包log4j-1.2.17.jar,整个工程最终目录如下:
这里写图片描述

源码地址:https://gitee.com/liupeifeng3514/LogLearning_Java

log4j 配置文件加载

log4j 的 jar 包内部包含 preference 默认配置,使用者可以通过log4j.xmllog4j.properties来指定自己的配置。xmlproperties优先。另外注意 java 读取properties文件时只是通过“=”号来分割键值对,所以 # 注释不能与键值对定义放在同一行。

指定配置文件的方式有:

  1. log4j.jar 包会先使用System.getProperty("log4j.xml或configuration")看是否有jvm参数,我们可以通过java -Dlog4j.configuration=file:/full_path/log4j.properties来指定(file:前缀不能省)。
  2. 代码中使用PropertyConfigurator.configure(param);来指定。比较令人困惑的可能是相对路径的问题了,在 IDE 或 jar 包中可以通过getClassLoader().getResource("log4j.properties");来获得存在于CLASSPATH中资源文件。

一、不同类的日志输出到不同的文件

包路径:com.lpf.abToab

(1)需要打印日志的两个类:ClassA 和 ClassB

public class ClassA {

    private static Logger logger = Logger.getLogger(ClassA.class);

    public void printLog() {
        // 记录debug级别的信息
        logger.debug("这是 debug 消息。");
        // 记录info级别的信息
        logger.info("这是 info 消息。");
        // 记录error级别的信息
        logger.error("这是 error 消息。");
    }
}
public class ClassB {

    private static Logger logger = Logger.getLogger(ClassB.class);

    public void printLog() {
        // 记录debug级别的信息
        logger.debug("这是 debug 消息。");
        // 记录info级别的信息
        logger.info("这是 info 消息。");
        // 记录error级别的信息
        logger.error("这是 error 消息。");
    }
}

(2)再来看看 Log4j 的配置文件

### 输出DEBUG 级别以上的日志到=E://logs/abToab/Alog.log ###
log4j.logger.com.lpf.abToab.ClassA= DEBUG, A
log4j.appender.A=org.apache.log4j.FileAppender
log4j.appender.A.File=E://logs/abToab/Alog.log
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d %p [%c] - %m%n

### 输出ERROR 级别以上的日志到=E://logs/abToab/Blog.log ###
log4j.logger.com.lpf.abToab.ClassB= ERROR, B
log4j.appender.B=org.apache.log4j.FileAppender
log4j.appender.B.File=E://logs/abToab/Blog.log
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=%d %p [%c] - %m%n

也就是让com.lpf.abToab.ClassA中的 logger 使用log4j.appender.A所做的配置,让com.lpf.abToab.ClassB中的logger 使用 log4j.appender.B所做的配置。

(3)测试类

/**
 * 不同的类输出不同的文件
 */
public class Test {

    public static void main(String[] args) {
        // 加载指定的配置文件
        PropertyConfigurator.configure(Test.class.getResource("log4jAB.properties").getPath());

        // 控制两个类打印日志
        new ClassA().printLog();
        new ClassB().printLog();
    }
}

输出结果:
这里写图片描述
可以看到,ClassA 和 ClassB 分别输出日志到各自的文件中。要注意的是,我们并没有将日志输出到控制台。

二、同一类中需要输出多个日志文件

包路径:com.lpf.aToab

(1)看一下配置文件

### 输出DEBUG 级别以上的日志到=E://logs/aToab/test1.log ###
log4j.logger.myTest1= DEBUG, test1
log4j.appender.test1=org.apache.log4j.FileAppender
log4j.appender.test1.File=E://logs/aToab/test1.log
log4j.appender.test1.layout=org.apache.log4j.PatternLayout
log4j.appender.test1.layout.ConversionPattern=%d %p [%c] - %m%n

### 输出ERROR 级别以上的日志到=E://logs/aToab/test2.log ###
log4j.logger.myTest2= ERROR, test2
log4j.appender.test2=org.apache.log4j.FileAppender
log4j.appender.test2.File=E://logs/aToab/test2.log
log4j.appender.test2.layout=org.apache.log4j.PatternLayout
log4j.appender.test2.layout.ConversionPattern=%d %p [%c] - %m%n

也就是在用logger时给它一个自定义的名字(如这里的”myTest1”),然后在log4j.properties中做出相应配置即可。别忘了不同日志要使用不同的logger(如输出到test1.log的要用logger1.info(“abc”))。

(2)测试类

/**
 * 同一类中需要输出多个日志文件
 */
public class Test {

    public static void main(String[] args) {
        // 加载指定的配置文件
        PropertyConfigurator.configure(Test.class.getResource("log4jA.properties").getPath());

        Logger logger1 = Logger.getLogger("myTest1");
        Logger logger2 = Logger.getLogger("myTest2");

        // 记录debug级别的信息
        logger1.debug("这是 debug 消息。");
        // 记录info级别的信息
        logger1.info("这是 info 消息。");
        // 记录error级别的信息
        logger1.error("这是 error 消息。");

        // 记录debug级别的信息
        logger2.debug("这是 debug 消息。");
        // 记录info级别的信息
        logger2.info("这是 info 消息。");
        // 记录error级别的信息
        logger2.error("这是 error 消息。");
    }
}

这里写图片描述

三、只让它们输出到自己指定的日志中

还有一个问题,就是这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中呢?别急,这里有个开关:

log4j.additivity.com.lpf.only.ClassB = false

它用来设置是否同时输出到log4j.rootLogger所配置的日志中,设为false就不会输出到其它地方啦!注意这里的”myTest1”是你在程序中给logger起的那个自定义的名字!

包路径:com.lpf.only

(1)需要打印日志的两个类:ClassA 和 ClassB

类 ClassA 和 ClassB 就是上边的两个类,这里不再贴出来了。

(2)再来看看 Log4j 的配置文件

log4j.rootLogger=ERROR, stdout

### 设置 B 只输出到自己的日志文件中
log4j.additivity.com.lpf.only.ClassB = false

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/only/Aonlylog.log ###
log4j.logger.com.lpf.only.ClassA= DEBUG, A
log4j.appender.A=org.apache.log4j.FileAppender
log4j.appender.A.File=E://logs/only/Aonlylog.log
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d %p [%c] - %m%n

### 输出ERROR 级别以上的日志到=E://logs/only/Bonlylog.log ###
log4j.logger.com.lpf.only.ClassB= ERROR, B
log4j.appender.B=org.apache.log4j.FileAppender
log4j.appender.B.File=E://logs/only/Bonlylog.log
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=%d %p [%c] - %m%n

(3)测试类

/**
 * 只让它们输出到自己指定的日志中
 */
public class Test {

    public static void main(String[] args) {
        // 加载指定的配置文件
        PropertyConfigurator.configure(Test.class.getResource("log4jOnly.properties").getPath());

        // 控制两个类打印日志
        new ClassA().printLog();
        new ClassB().printLog();
    }
}

输出结果:
这里写图片描述
可以看到类 B 的日志并没有在控制台输出。

四、只让它们输出到自己指定的日志中,并在控制台输出

如果你说,我只是不想同时输出这个日志到log4j.rootLogger所配置的日志文件中,stdout里我还想同时输出呢!那也好办,把你的log4j.logger.com.lpf.only2.ClassB= ERROR, B改为下式就OK啦!

log4j.logger.com.lpf.only2.ClassB= ERROR, B, stdout

包路径:com.lpf.only2

(1)需要打印日志的两个类:ClassA 和 ClassB

类 ClassA 和 ClassB 就是上边的两个类,这里不再贴出来了。

(2)再来看看 Log4j 的配置文件

log4j.rootLogger=ERROR, D, stdout

### 设置 B 只输出到自己的日志文件中
log4j.additivity.com.lpf.only2.ClassB = false

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 增加的部分:输出DEBUG 级别以上的日志到=E://logs/only2/log.log ###  
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender  
log4j.appender.D.File = E://logs/only2/log.log
log4j.appender.D.Append = true  
log4j.appender.D.Threshold = DEBUG   
log4j.appender.D.layout = org.apache.log4j.PatternLayout  
log4j.appender.D.layout.ConversionPattern = %d %p [%c] - %m%n

### 输出DEBUG 级别以上的日志到=E://logs/only2/Aonly2log.log ###
log4j.logger.com.lpf.only2.ClassA= DEBUG, A
log4j.appender.A=org.apache.log4j.FileAppender
log4j.appender.A.File=E://logs/only2/Aonly2log.log
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d %p [%c] - %m%n

### 输出ERROR 级别以上的日志到=E://logs/only2/Bonly2log.log ###
log4j.logger.com.lpf.only2.ClassB= ERROR, B, stdout
log4j.appender.B=org.apache.log4j.FileAppender
log4j.appender.B.File=E://logs/only2/Bonly2log.log
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=%d %p [%c] - %m%n

(3)测试类

/**
 * 只让它们输出到自己指定的日志中,并在控制台输出
 */
public class Test {

    public static void main(String[] args) {
        // 加载指定的配置文件
        PropertyConfigurator.configure(Test.class.getResource("log4jOnly2.properties").getPath());

        // 控制两个类打印日志
        new ClassA().printLog();
        new ClassB().printLog();
    }
}

输出结果:
这里写图片描述
可以看到:控制台输出了全部的日志,而 log.log 文件中没有输出类 B 的日志。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值