啊,在经过使用正则表达式之后我们的实验又让我们使用日志记录发生的异常了,老师上课时候非常高兴的告诉我们日志很简单并且有多种日志可以使用。我回去一看,嚯还真是不少,而且他们都有一个共同特点——————我都不会用。。。所以在我搞完实验之后赶紧过来写一手我用到过的日志。
1.logging
logging是Java里面自带的日志工具,由于是自带的所以我们不用导入库直接import import java.util.logging.Logger;
再import之后我们创建一个logging类就可以直接使用了。
package P1;
import java.util.logging.Logger;
public class yanshi {
public static void main(String[] args) {
Logger logger=Logger.getLogger(yanshi.class.getName());
logger.info("i'm a log");
}
}
点击运行,输出
我们看到输出的十分详细直接将时间,位置,内容全输出出来了,在这里我们用的是info等级但其实logging中有7个等级:
SEVERE (最高级别)
WARNING
INFO
CONFIG
FINE
FINER
FINEST (最低级别)
但是我们使用的时候会发现在info之后的都不会输出,这是因为自动设置的缺省日志级别是info也就是说只有info或它以上的级别被输出,它以下的级别不被输出。这是最简单的使用方法,但是只是输出到控制台能满足吗,不能,我们的要求是输出到文件中去,这时候配置文件就闪亮登场了,通过配置文件我们可以改变log的很多属性。我们先看一下配置文件怎末写
# "handlers" specifies a comma separated list of log Handler
handlers= java.util.logging.FileHandler
# Default logging level.
.level= CONFIG
# default file output is in "log/Log.log" directory.
java.util.logging.FileHandler.pattern =log/Log.log
java.util.logging.FileHandler.limit = 0
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = CONFIG
java.util.logging.FileHandler.append=true
java.util.logging.SimpleFormatter.format=%1$tF %1$tH:%1$tM:%1$tS %2$s%n%4$s: %5$s%6$s%n
我们来分析一下这个配置文件,
handlers是指输出到哪,如果想同时输出到控制台上在后面添加,java.util.logging.FileHandler即可
.level是用来设置总缺省级别的,后面每一种handler的.level时设置格子缺省级别的
由于我们是要输出到file文件中所以我们的操作都是对于FileHandler的。
pattern制定了文件的相对路径,绝对路径也可以。
limit是文件的近似最大字节,0的意思是无限制。
append是设置是否将输出追加到现有文件上,如果是false就是覆盖,如果是true就是追加。
剩下的就是设置输出结构的了。
现在我们已经有了一个配置文件,那么现在就是将配置文件加载到log中去了,为此我们使用LogManger类
package P1;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class yanshi {
public static void main(String[] args) {
Logger logger=Logger.getLogger(yanshi.class.getName());
LogManager logManager = LogManager.getLogManager();
InputStream inputStream=null;
inputStream = yanshi.class.getClassLoader().getResourceAsStream("log.properties");
try {
logManager.readConfiguration(inputStream);
} catch (SecurityException | IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
logManager.addLogger(logger);
logger.info("i'm a log");
}
}
我们通过输入流将配置文件log.properties加载到LogManger对象中去,之后使用addLogger方法将他与logging对象绑定,我们运行一下看看(注意路径中的文件可以没有但是文件夹一定要有,文件夹是与src在同一路径下的)
成功出现,看来我们设置的没有问题,logging我们已经有一个大体上的了解了
2.log4j
这是一个外部的log方式。所以我们首先需要将包导入项目中。
log4j我们也是说一说配置文件,相对于logging,log4j使用配置文件更加方便放里就行了自动就加载上了。
log4j的输出级别有5级:
FATAL
ERROR
WARN
INFO
DEBUG
下面贴一下我的代码文件和配置文件
### \u8BBE\u7F6E\u7EA7\u522B\u548C\u76EE\u7684\u5730(\u8FD9\u91CC\u591A\u4E2A\u76EE\u7684\u5730) ###
log4j.rootLogger =info,graphchange,errorlog
### \u8F93\u51FA\u5230\u65E5\u5FD7\u6587\u4EF6 ###
log4j.appender.graphchange = org.apache.log4j.DailyRollingFileAppender
log4j.appender.graphchange.File =log/debug.log
## \u53EA\u8F93\u51FADEBUG\u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7
log4j.appender.graphchange.Threshold = INFO
#INFO
log4j.appender.graphchange.Append=false
log4j.appender.graphchange.DatePattern = '.'yyyy-MM-dd
log4j.appender.graphchange.layout = org.apache.log4j.PatternLayout
log4j.appender.graphchange.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] \n %m%n
log4j.appender.errorlog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorlog.File =log/error.log
## \u53EA\u8F93\u51FADEBUG\u7EA7\u522B\u4EE5\u4E0A\u7684\u65E5\u5FD7
log4j.appender.errorlog.Threshold = ERROR
#ERROR
#'.'yyyy-MM-dd: \u6BCF\u5929\u4EA7\u751F\u4E00\u4E2A\u65B0\u7684\u6587\u4EF6
log4j.appender.errorlog.DatePattern = '.'yyyy-MM-dd
log4j.appender.errorlog.layout = org.apache.log4j.PatternLayout
log4j.appender.errorlog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] \n %m%n
log4j.appender.errorlog.Append = false
我们可以看出log4j的配置文件大体上和logging的一样,但是他可以为不同的等级设置不同的参数,就像这个配置文件,在rootLogger中我们设置了graphchange和errorlog,并将他们设置成INFO级和ERROR级,所以error级别的日志会同时输出到error.log和debug.info种,这点做的比logging智能一点。
package P1;
import org.apache.log4j.Logger;
public class yanshi {
public static void main(String[] args) {
Logger logger=Logger.getLogger(yanshi.class.getName());
logger.info("i'm a log");
}
}
运行之后的结果:
我们可以发现除了配置文件比较复杂,log4j的使用比logging简单不少,但是相对应的log4j的功能也比较多,所以平时使用我推荐log4j。