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

这篇博客介绍了如何将JUL日志框架与Log4j2结合,以及如何利用Lombok简化日志注解。内容包括JUL的日志配置、自定义配置文件的设定,通过系统属性进行配置,以及逐步将日志框架迁移至Log4j2,并结合Lombok注解提升开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.log4j</groupId>
    <artifactId>log4j-jul</artifactId>
    <version>2.12.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.12.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.12.1</version>
</dependency>

使用log4j2配置文件

<?xml version="1.0" encoding="UTF-8"?>
<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.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.0</version>
</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");
		
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值