日志级别:OFF(关闭)-->SEVERE(严重)-->WARNING(警告)-->INFO(信息)-->CONFIG(配置)-->FINE(详细)-->FINER(较详细)-->FINEST(非常详细)-->ALL(打开)
日志级别从左到右一次递减,系统默认配置是INFO级别,表示INFO级别以上的才可以输出。OFF和ALL代表日志的开关,仅作为关闭和打开的作用存在,不是真正的日志级别。即设置为OFF的话,则不输出,设置为ALL的话则输出SEVERE到FINEST的所有级别日志。
日志创建过程:
使用Logger类创建日志对象,LoggerManager通过加载配置文件,最后通过Logger输出
一、不通过配置文件配置(默认JUL配置文件)
首先通过Logger.getLogger(name)创建日志记录器,使用默认的JUL配置信息(不使用自定义配置文件)即使用顶级父元素RootLogger的相关配置
ConsoleHandler和FileHandler分别为控制台输出和文件输出控制器
public void testLog() throws Exception{
//创建日志记录器
Logger logger = Logger.getLogger("forTest.JULTest");
//关闭系统默认配置
logger.setUseParentHandlers(false);
//自定义日志配置级别
//创建consoleHandler:控制台输出
ConsoleHandler consoleHandler = new ConsoleHandler();
//创建简单格式转换对象
SimpleFormatter simpleFormatter = new SimpleFormatter();
//进行关联
consoleHandler.setFormatter(simpleFormatter);
logger.addHandler(consoleHandler);
//配置日志级别
logger.setLevel(Level.ALL);
consoleHandler.setLevel(Level.ALL);
//创建fileHandler:log文件输出
FileHandler fileHandler = new FileHandler("jul.log");
fileHandler.setFormatter(simpleFormatter);
logger.addHandler(fileHandler);
//日志输出
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
输出结果:
四月 14, 2020 1:04:02 下午 forTest.JULTest testLog
严重: severe
四月 14, 2020 1:04:02 下午 forTest.JULTest testLog
警告: warning
四月 14, 2020 1:04:02 下午 forTest.JULTest testLog
信息: info
四月 14, 2020 1:04:02 下午 forTest.JULTest testLog
配置: config
四月 14, 2020 1:04:02 下午 forTest.JULTest testLog
详细: fine
四月 14, 2020 1:04:02 下午 forTest.JULTest testLog
较详细: finer
四月 14, 2020 1:04:02 下午 forTest.JULTest testLog
非常详细: finest
二、通过配置文件配置
步骤:创建配置文件-->读取配置文件(流)-->LogManager加载配置文件-->创建日志记录器对象logger-->logger输出日志
在项目中创建配置文件:logging.properties
配置如下:
# RootLogger 顶级父元素指定的默认处理器为:ConsoleHandler和FileHandler
handlers = java.util.logging.ConsoleHandler,java.util.logging.FileHandler
# RootLogger 顶级父元素默认的日志级别
.level = CONFIG
# 自定义Logger,可以指定到某个方法
forTest.testLog.Handlers = java.util.logging.ConsoleHandler
forTest.testLog.level = INFO
#关闭默认配置
#forTest.testLog.useParentHandlers = false
# 向日志文件输出 handler对象
# 指定文件路径 H://test/forTest/\%u.log
java.util.logging.FileHandler.pattern = H://test/forTest/\%u.log
# 指定日志文件内容大小
java.util.logging.FileHandler.limit = 50000
# 指定日志文件数量
java.util.logging.FileHandler.count = 1
# 指定 handler 对象日志消息格式对象 SimpleFormatter 或者 XMLFormatter
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
# 指定以追加的方式添加日志内容
java.util.logging.FileHandler.append = true
# 向控制台输出 handler 对象
# 指定 handler 对象的日志级别
java.util.logging.ConsoleHandler.level = ALL
# 指定 handler 对象的日志消息格式对象
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# 指定 handler 对象的字符集
#java.util.logging.ConsoleHandler.encoding = UTF-8
# 指定日志消息格式
java.util.logging.SimpleFormatter.format = %4$s: %5$s [%1$tc]%n
通过查看format源码可以看到相应的格式示例:
其中这里使用的就是第一个示例%4$s: %5$s [%1$tc]%n,有兴趣的可以自己去了解下
* <p>Some example formats:<br>
* <ul>
* <li> {@code java.util.logging.SimpleFormatter.format="%4$s: %5$s [%1$tc]%n"}
* <p>This prints 1 line with the log level ({@code 4$}),
* the log message ({@code 5$}) and the timestamp ({@code 1$}) in
* a square bracket.
* <pre>
* WARNING: warning message [Tue Mar 22 13:11:31 PDT 2011]
* </pre></li>
* <li> {@code java.util.logging.SimpleFormatter.format="%1$tc %2$s%n%4$s: %5$s%6$s%n"}
* <p>This prints 2 lines where the first line includes
* the timestamp ({@code 1$}) and the source ({@code 2$});
* the second line includes the log level ({@code 4$}) and
* the log message ({@code 5$}) followed with the throwable
* and its backtrace ({@code 6$}), if any:
* <pre>
* Tue Mar 22 13:11:31 PDT 2011 MyClass fatal
* SEVERE: several message with an exception
* java.lang.IllegalArgumentException: invalid argument
* at MyClass.mash(MyClass.java:9)
* at MyClass.crunch(MyClass.java:6)
* at MyClass.main(MyClass.java:3)
* </pre></li>
* <li> {@code java.util.logging.SimpleFormatter.format="%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s%n%4$s: %5$s%n"}
* <p>This prints 2 lines similar to the example above
* with a different date/time formatting and does not print
* the throwable and its backtrace:
* <pre>
* Mar 22, 2011 1:11:31 PM MyClass fatal
* SEVERE: several message with an exception
* </pre></li>
* </ul>
程序代码:
首先通过类加载器获取配置文件流,然后创建logManager对象,通过logManager加载,接着创建日志记录器。详细的配置信息都会通过logManager加载到。
public void testLogProperties() throws Exception{
//读取配置文件,通过类加载器
InputStream ins = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");
//创建logManager
LogManager logManager = LogManager.getLogManager();
//通过LogManager加载配置文件
logManager.readConfiguration(ins);
//创建日志记录器
Logger logger = Logger.getLogger("forTest");
//日志输出
logger.severe("severe 严重");
logger.warning("warning 警告");
logger.info("info 信息");
logger.config("config 配置");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
输出结果:
严重: severe 严重 [星期二 四月 14 13:23:42 CST 2020]
警告: warning 警告 [星期二 四月 14 13:23:42 CST 2020]
信息: info 信息 [星期二 四月 14 13:23:42 CST 2020]
配置: config 配置 [星期二 四月 14 13:23:42 CST 2020]