JUL日志框架 - 简单示例代码

文章目录

  • JUL日志框架 - 简单示例代码
    • 准备工作
    • 使用默认配置
      • 默认配置文件
    • 使用自定义配置
      • 定义自定义配置文件
      • 使用自定义配置文件
        • 编程方式
        • 系统属性方式
    • 与Log4j2结合
      • 引入 jar 包
      • 使用log4j2配置文件
      • 系统属性方式结合(推荐)
    • 使用Lombok日志注解(推荐)
      • 引入 jar 包
      • 使用注解
  • 最终方案
    • 原始代码
    • 修改后代码

JUL日志框架 - 简单示例代码

准备工作

  1. JDK1.8
  2. org.junit:junit:4.12
  3. 准备基本测试类
public class JULBaseTests {

	protected Logger logger;
	
	@After
	public void print() {
		//日志输出简写形式,有不同的级别,可带参数,其它类似
        logger.log(Level.SEVERE, "this is a severe", new Exception("my excep")); //带异常输出
        logger.log(Level.WARNING, "this is a warn, {0} {1}", new Object[]{"p1", "p2"});
        logger.log(Level.INFO, "this is a info, {0}", "p1");
        logger.log(Level.CONFIG, "this is a config");
        logger.log(Level.FINE, "this is a fine");
        logger.log(Level.FINER, "this is a finer");
        logger.log(Level.FINEST, "this is a finest");
 
        //日志输出简写形式,有不同的级别
        logger.severe("severe log");
        logger.warning("warning log");
        logger.info("info log");
        logger.config("config log");
        logger.fine("fine log");
        logger.finer("finer log");
        logger.finest("finest log");
	}
}

使用默认配置

public class JULDefaultConfigTests extends JULBaseTests {
	
	@Test
	public void testDefaultLogger() {
		// 日志记录器
		logger = Logger.getLogger(JULDefaultConfigTests.class.getName());
	}
	
}

默认情况下配置文件路径为$JAVAHOME\jre\lib\logging.properties

默认配置文件

# 全局属性
## 添加处理器:这些处理器会在VM启动时安装,所以这些类必须在系统类路径中
handlers= java.util.logging.ConsoleHandler
#handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler
## 默认全局级别
.level= INFO

# 处理器特定属性
## 默认文件处理器
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
## 默认控制台处理器
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# 自定义格式化器
## Simple格式化器
#java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n

# 日志记录器特定属性
com.xyz.foo.level = SEVERE

使用自定义配置

properties 配置文件

定义自定义配置文件

# 全局属性
## 添加处理器
handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler
## 默认全局级别
.level= INFO

# 处理器特定属性
## 默认文件处理器
java.util.logging.FileHandler.pattern = jul-customConfig.log
java.util.logging.FileHandler.encoding = UTF-8
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
## 默认控制台处理器
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# 日志记录器特定属性
com.jasper.logs.jul.hello.handlers = java.util.logging.FileHandler
com.jasper.logs.jul.hello.level = SEVERE
com.jasper.logs.jul.hello.useParentHandlers = false

使用自定义配置文件

编程方式

编码配置全局单例的LogManager,指定使用自定义的配置文件。

public class JULCustomConfigTests extends JULBaseTests {
	
	@Before
	public void init() {
		// logManager 是全局单例的
		LogManager logManager = LogManager.getLogManager();
		try {
			logManager.readConfiguration(this.getClass().getResourceAsStream("/jul-custom-config.properties"));
		} catch (SecurityException | IOException e) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void testDefaultLogger() {
		// 日志记录器
		logger = Logger.getLogger(JULCustomConfigTests.class.getName());
	}

}

系统属性方式

或者使用系统属性指定-Djava.util.logging.config.file=myfile

与Log4j2结合

原项目使用JUL日志框架(JUL API + JUL配置文件),现在改用log4j2配置(JUL API + Log4j2配置文件)

引入 jar 包


<dependency>
    <groupId>org.apache.logging.log4jgroupId>
    <artifactId>log4j-julartifactId>
    <version>2.12.1version>
dependency>
<dependency>
    <groupId>org.apache.logging.log4jgroupId>
    <artifactId>log4j-apiartifactId>
    <version>2.12.1version>
dependency>
<dependency>
    <groupId>org.apache.logging.log4jgroupId>
    <artifactId>log4j-coreartifactId>
    <version>2.12.1version>
dependency>

使用log4j2配置文件


<Configuration status="WARN">
	<Appenders>
		<Console name="STDOUT" target="SYSTEM_OUT">
			<PatternLayout
				pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
		Console>
		<Console name="ERROUT" target="SYSTEM_ERR">
			<PatternLayout
				pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
		Console>
		
	Appenders>
	<Loggers>
		<Logger name="com.jasper.logs.jul.hello" level="trace" additivity="false">
			<AppenderRef ref="STDOUT" />
		Logger>
		<Root level="ERROR">
			<AppenderRef ref="ERROUT" />
		Root>
	Loggers>
Configuration>

系统属性方式结合(推荐)

VM启动时,配置-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager,或者获取logger前,执行System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");

使用Lombok日志注解(推荐)

需要确保IDE支持Lombok,否则编译报错。

引入 jar 包


<dependency>
    <groupId>org.projectlombokgroupId>
    <artifactId>lombokartifactId>
    <version>1.18.0version>
dependency>

使用注解

直接在类上使用注解@Log,即可引入log

最终方案

原项目使用JUL日志框架的API的情况下,转为使用log4j2自定义配置+Lombok日志注解。

原始代码

/**
 * 使用JUL API + JUL默认配置
 */
public class JULDefaultConfigTests {
	private static final Logger logger = Logger.getLogger(JULDefaultConfigTests.class.getName());
    
	@Test
	public void log() {
		//日志输出简写形式,有不同的级别,可带参数,其它类似
        logger.log(Level.SEVERE, "this is a severe");
        logger.log(Level.WARNING, "this is a warn, {0} {1}", new Object[]{"p1", "p2"});
        logger.log(Level.INFO, "this is a info, {0}", "p1");
        logger.log(Level.CONFIG, "this is a config");
        logger.log(Level.FINE, "this is a fine");
        logger.log(Level.FINER, "this is a finer", new Exception("my excep")); //带异常输出
        logger.log(Level.FINEST, "this is a finest");
 
        //日志输出简写形式,有不同的级别
        logger.severe("severe log");
        logger.warning("warning log");
        logger.info("info log");
        logger.config("config log");
        logger.fine("fine log");
        logger.finer("finer log");
        logger.finest("finest log");
		
	}
	
}

修改后代码

  1. 结合log4j2
    • 添加log4j2的api及core包,添加log4j2配置文件,
    • 添加log4j-jul适配包,设置系统属性-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
  2. 结合lombok
    • 添加lombok的jar包
    • 相应类上添加@Log注解
    • 使用log代替旧的logger
/**
 * 使用JUL API + log4j2自定义配置 (系统属性)+ lombok 日志注解
 */
@Log
public class JULDefaultConfigTests {
    
	@Test
	public void log() {
		//日志输出简写形式,有不同的级别,可带参数,其它类似
        log.log(Level.SEVERE, "this is a severe");
        log.log(Level.WARNING, "this is a warn, {0} {1}", new Object[]{"p1", "p2"});
        log.log(Level.INFO, "this is a info, {0}", "p1");
        log.log(Level.CONFIG, "this is a config");
        log.log(Level.FINE, "this is a fine");
        log.log(Level.FINER, "this is a finer", new Exception("my excep")); //带异常输出
        log.log(Level.FINEST, "this is a finest");
 
        //日志输出简写形式,有不同的级别
        log.severe("severe log");
        log.warning("warning log");
        log.info("info log");
        log.config("config log");
        log.fine("fine log");
        log.finer("finer log");
        log.finest("finest log");
		
	}
	
}

你可能感兴趣的:(日志专题)