一、有关日志
日志是系统运行过程中的后台输出信息,方便程序员进行系统运行的管控以及Bug的查找。
二、有关Log4j
Log4j是一个日志输出的插件,专门用来进行日志的管理的。
传统方式获取日志是使用System.out.println()语句进行后台打印,而由此引发四个问题是:
- 日志信息无法保存
- 无法显示完整日志信息
- 日志的显示没有级别所有的日志混杂在一起显示(不能针对性显示,不能进行日志信息的筛选)
- 日志显示格式不友好(即,无法控制System.out.println()的输出格式)
因此解决方法是:当然是使用Log4j啦。
Log4j的四个特点总结:
- 日志可以单独保存在文件中
- 可以获取完整的日志信息
- 可以进行日志显示的筛选
- 格式友好
(完美地解决了上述问题)
三、Log4j使用流程
- 导入Log4j的jar包
- 配置Log4j的配置文件(具体形式详见四)
- 在使用Log4j的类中声明全局的Logger变量
static Logger logger=Logger.getLogger(类名.class);
- 使用logger对象调用的日志方法进行日志输出语句声明
//一般在方法内部使用
logger.debug("我是debug信息");
//一般在调用方法使用
logger.info("我是info信息");
//一般在需要警告的位置使用
logger.warn("我是警告信息");
//在catch代码块中使用
logger.error("我是错误信息");
//在catch代码块中使用
logger.fatal("我是致命的错误信息");
四、书写基本Log4j.properties
# 声明日志级别以及日志输出位置
# Log4j的日志级别(级别由高到低排列):
# FATAL:致命的错误
# ERROR:异常错误
# WARN:警告
# INFO:信息(方法级别)
# DEBUG:调试(代码级别)
# 下面这句话的意思是在控制台(console)显示INFO级别的日志,并将日志输入到LOGFILE,这句话是全局默认设置
log4j.rootLogger=DEBUG,CONSOLE,LOGFILE
# 其中org.apache.log4j是包名
# 这句话的意思是在该包内,在控制台(console)显示FATAL级别的日志,这句话是针对指定说明
# 如果没有这句话,在控制台(console)就会显示最初定义的INFO级别的日志
log4j.logger.包名=FATAL,CONSOLE,LOGFILE
log4j.logger.包名.类名=FATAL,CONSOLE,LOGFILE
log4j.logger.包名.类名.方法名=DEBUG,CONSOLE,LOGFILE
# 其中org.apache.log4j依旧是包名,ConsoleAppender是类名
# 这句话的意思是将日志显示到控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
# 声明该控制台(console)是INFO及其以上级别,此时就会覆盖全局声明
log4j.appender.CONSOLE.Threshold=INFO
# 这句话的意思是日志如何显示到控制台
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
# 这句话是定义显示格式
log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n
# 即,ConsoleAppender(控制打印)调用PatternLayout(控制打印样式),而PatternLayout使用-%m%n格式
# 其中,FileAppender是LOGFILE的名字
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
# src/moon.txt是路径
log4j.appender.LOGFILE.File=src/moon.txt
# 对日志内容进行追加,否则将一直对日志内容进行覆盖
log4j.appendeer.LOGFILE.Appender=true
# 此处与 log4j.appender.CONSOLE 的部分相同
log4j.appender.LOGFILE.Threshold=INFO
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
五、通过具体实例理解Log4j
此部分是Log4j.properties。
值得注意的是,该文件需写在src内(即路径必须为src/Log4j.properties),且必须命名为Log4j.properties。
log4j.rootLogger=DEBUG,CONSOLE,LOGFILE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
# 我将日志存储在moon.txt中
log4j.appender.LOGFILE.File=src/moon.txt
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
此部分为主类。
package com.moon.Log4j;
import org.apache.log4j.Logger;
public class Test {
//获取Log4j对象
public static Logger logger=Logger.getLogger(Test.class);
public static void main(String[] args) {
User user=new User();
int result=user.getMessage(1,2);
logger.info("方法的执行结果为:"+result);
System.out.println();
//logger.warn()可加在任意地方
logger.warn("我是警告信息");
//logger.error及logger.fatal在catch中添加
logger.error("我是错误信息");
logger.fatal("我是致命的错误信息");
}
}
再写一个类叭,便于理解logger.debug()和logger.info()的应用~
package com.moon.Log4j;
import org.apache.log4j.Logger;
public class User {
Logger logger=Logger.getLogger(User.class);
public int getMessage(int a,int b) {
logger.debug("获取的实参为:"+a+":"+b);
return a+b;
}
}
最终得到的结果:

- 最后说一下在码代码时碰到的小问题:一定注意不要在properties文件的语句后加 ; 吖。

被折叠的 条评论
为什么被折叠?



