日志和监控
1:如何使用日志?
1. 使用 java.util.logging
java.util.logging
是 Java 标准库提供的日志框架,使用简单,无需额外依赖。
import java.util.logging.Logger;
public class LoggingExample {
private static final Logger logger = Logger.getLogger(LoggingExample.class.getName());
public static void main(String[] args) {
logger.info("This is an info message");
logger.warning("This is a warning message");
logger.severe("This is a severe message");
}
}
2. 使用 Log4j
Log4j 是一个广泛使用的日志框架,提供了灵活的配置和丰富的特性。
1:导入依赖
<!-- 添加 Log4j 依赖 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
2:代码演示:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4jExample {
private static final Logger logger = LogManager.getLogger(Log4jExample.class);
public static void main(String[] args) {
logger.info("This is an info message");
logger.warn("This is a warning message");
logger.error("This is an error message");
}
}
3. 使用 Logback
Logback 是由 Log4j 的创始人开发的日志框架,具有性能优势和功能丰富。
1:导入依赖
<!-- 添加 Logback 依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
2:代码演示:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackExample {
private static final Logger logger = LoggerFactory.getLogger(LogbackExample.class);
public static void main(String[] args) {
logger.info("This is an info message");
logger.warn("This is a warning message");
logger.error("This is an error message");
}
}
4. 使用 SLF4J
SLF4J 是一个日志门面框架,可以与不同的日志实现框架结合使用,提供了统一的日志接口。
1:导入依赖
<!-- 添加 SLF4J 和 Logback 依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
2:代码演示
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jExample {
private static final Logger logger = LoggerFactory.getLogger(Slf4jExample.class);
public static void main(String[] args) {
logger.info("This is an info message");
logger.warn("This is a warning message");
logger.error("This is an error message");
}
}
2:如何使用监控?
1:JMX(Java Management Extensions)监控:
JMX是Java平台的管理和监控扩展,可以提供对Java应用程序的管理和监控能力。通过MBean(管理Bean)来定义被监控的资源,可以使用JMX API来获取和修改这些MBean的属性。
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
public class JMXMonitor {
public static void main(String[] args) throws Exception {
// 创建MBeanServer
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
// 创建ObjectName,用于标识被监控资源
ObjectName name = new ObjectName("com.example:type=MyResource");
// 注册MBean到MBeanServer
MyResource myResource = new MyResource();
mbs.registerMBean(myResource, name);
// 进入监控状态,保持程序运行
System.in.read();
}
}
// 被监控的资源
public class MyResource {
private int counter = 0;
public int getCounter() {
return counter;
}
public void incrementCounter() {
counter++;
}
}
2:JMX注解(Java 6+):
从Java 6开始,JMX提供了使用注解来简化MBean的定义过程。使用@ManagedResource
、@ManagedAttribute
和@ManagedOperation
等注解来标记被监控资源及其属性和操作。
import javax.management.*;
import java.lang.management.ManagementFactory;
public class JMXAnnotationMonitor {
public static void main(String[] args) throws Exception {
// 创建MBeanServer
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
// 注册MBean到MBeanServer
MyResourceAnnotation myResource = new MyResourceAnnotation();
ObjectName name = new ObjectName("com.example:type=MyResourceAnnotation");
mbs.registerMBean(myResource, name);
// 进入监控状态,保持程序运行
System.in.read();
}
}
@ManagedResource
public class MyResourceAnnotation {
private int counter = 0;
@ManagedAttribute
public int getCounter() {
return counter;
}
@ManagedOperation
public void incrementCounter() {
counter++;
}
}
3:监控系统资源
可以使用Java提供的ManagementFactory
类来获取系统资源的信息,例如内存使用情况、线程信息、GC信息等。以下是一个获取系统内存使用情况的示例:
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.util.concurrent.TimeUnit;
public class SystemResourceMonitor {
public static void main(String[] args) throws Exception {
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
while (true) {
MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
System.out.println("Heap Memory Usage: " + heapUsage);
MemoryUsage nonHeapUsage = memoryBean.getNonHeapMemoryUsage();
System.out.println("Non-Heap Memory Usage: " + nonHeapUsage);
TimeUnit.SECONDS.sleep(1);
}
}
}