log4控制日志器输出的控制级别有debug(调试信息),info(提示信息),warn(警告信息),error(错误信息),fatal(严重错误信息)等级别。
Log4j建议只使用四个级别,优先级 从高到低分别是 ERROR、WARN、INFO、DEBUG。
=== Debug ===
这个级别最低的东东,一般的来说,在系统实际运行过程中,一般都是不输出的。
因此这个级别的信息,可以随意的使用,任何觉得有利于在调试时更详细的了解系统运行状态的东东,比如变量的值等等,都输出来看看也无妨。
当然,在每一个 Debug 调用之前,一定要加上 If 判断。
=== Info ===
这个应该用来反馈系统的当前状态给最终用户的,所以,在这里输出的信息,应该对最终用户具有实际意义,也就是最终用户要能够看得明白是什么意思才行。
从某种角度上说,Info 输出的信息可以看作是软件产品的一部分(就像那些交互界面上的文字一样),所以需要谨慎对待,不可随便。
=== Warn、Error、Fatal ===
警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态,他们之间的区别大致是这样区分的:
警告:是这个时候进行一些修复性的工作,应该还可以把系统恢复到正常状态中来,系统应该可以继续运行下去。
错误:可以进行一些修复性的工作,但无法确定系统会正常的工作下去,系统在以后的某个阶段,很可能会因为当前的这个问题,导致一个无法修复的错误(例如宕机),但也可能一直工作到停止也不出现严重问题。
Fatal:严重错误,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话,可以肯定必然会越来越乱。这时候采取的最好的措施不是试图将系统状态恢复到正常,而是尽可能地保留系统有效数据并停止运行。
也就是说,选择 Warn、Error、Fatal 中的具体哪一个,是根据当前的这个问题对以后可能产生的影响而定的,如果对以后基本没什么影响,则警告之,如果肯定是以后要出严重问题的了,则Fatal之,拿不准会怎么样,则 Error 之。
Warn 信息和 Debug 一样,应该在产品测试和调试时使用,而 Info、Erro 以及 Fatal 则在产品发布后需要继续使用。
日志文件使用例子
新建Java project
1、导入包
log4j-1.2.17.jar 下载地址
2、新建log4j.properties文件,用于配置log4
#配置日志器,用于配置日志 输出级别 和 输出目的
#日志器的核心使用思想就是:能够通过控制日志器的控制级别,控制日志输出
log4j.rootCategory=info, stdout , R
#配置输出目的:ConsoleAppender是控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#日志格式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
#配置输出目的:DailyRollingFileAppender是每天生成一个日志文件
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
#日志文件名称
log4j.appender.R.File=./qc.log
#日志格式
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
其中 log4j.rootCategory=info, stdout , R 的info控制控制器输出日志文件的等级
log4j.rootCategory=info, stdout , R
使用 log4j.appender.R.File = 配置输出日志文件的路径
log4j.appender.R.File=./qc.log
2、test类
package test;
import java.util.Random;
import org.apache.log4j.Logger;
import org.junit.Test;
public class TestLog4j {
private Logger logger= Logger.getLogger(TestLog4j.class);
@Test
public void testLog4j() {
logger.info("1、准备生成随机数");
int r = new Random().nextInt(20);
int num = r%2 ==0?0:r;
try {
logger.info("2、成功生成随机数,当前随机数是:"+r);
logger.info("当前的随机数是:"+r);
int result = r/num;
logger.info("3、使用随机数进行除法运算的结果是:" + result);
} catch (ArithmeticException e) {
logger.debug("发生了算数异常",e);
logger.warn("发生了算数运算异常");
}
//调试级别的信息一般用于程序开发过程中使用或程序发生问题后需要程序调试时才打开调试开关
//输出的内容为用于调试程序使用的内容
logger.debug("log4j调试信息");
//对于程序运行过程中的重要步骤或流程,可以使用info级别输出相关的提示
logger.info("log4j提示信息");
//当程序发生错误或程序校验到某些重要数据不合法时,可以输出warn或error级别的提示
//可以根据程序需要,选择不同级别
logger.warn("log4j警告信息");
logger.error("log4j错误信息");
//一般用于记录不可修复的错误,类似于error错误
logger.fatal("log4j严重错误信息");
}
}
通过int r = new Random().nextInt(20);产生随机数,
其中int num = r%2 ==0?0:r;,当r为奇数时,num为奇数,int result = r/num;正常
当r为奇数时,num为0,int result = r/num;0不能作为分母,出现异常。
部分日志如下:
其中测试类使用了单元测试 @Test 导入相关包即可