Java链接logger的代码
时间: 2024-05-31 13:07:43 浏览: 25
以下是一个简单的Java代码示例,用于链接logger并在控制台打印日志:
import java.util.logging.*;
public class MyLogger {
private static final Logger LOGGER = Logger.getLogger(MyLogger.class.getName());
public static void main(String[] args) {
LOGGER.info("Logging information message.");
LOGGER.warning("Logging warning message.");
LOGGER.severe("Logging severe message.");
}
}
在这个例子中,我们使用Java的内置日志记录器(Logger)类来创建一个名为“ MyLogger”的日志记录器。然后,我们使用该日志记录器来记录三种不同级别的日志消息,从信息消息到严重消息。在这个例子中,我们将日志消息打印到控制台中,但是您还可以将它们写入文件或其他输出流中,以便稍后进行分析和调试。
相关问题
springboot 实现websocket 客户端多个链接祥细代码
下面是一个简单的 Spring Boot WebSocket 客户端示例,可以建立多个 WebSocket 连接:
首先,添加依赖:
```xml
<!-- WebSocket 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
```
然后,创建一个 `WebSocketClient` 类,用于建立 WebSocket 连接:
```java
@Component
public class WebSocketClient {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
/**
* 建立 WebSocket 连接
*
* @param url WebSocket URL
* @throws Exception
*/
public void connect(String url) throws Exception {
WebSocketHandler handler = new MyWebSocketHandler();
WebSocketSession session = new StandardWebSocketClient()
.doHandshake(handler, null, new URI(url))
.get();
logger.info("WebSocket 连接已建立:{}", url);
sessions.put(url, session);
}
/**
* 发送消息
*
* @param url WebSocket URL
* @param message 消息内容
* @throws Exception
*/
public void sendMessage(String url, String message) throws Exception {
WebSocketSession session = sessions.get(url);
if (session != null && session.isOpen()) {
session.sendMessage(new TextMessage(message));
logger.info("已发送消息:{}", message);
} else {
logger.warn("WebSocket 连接不存在或已关闭:{}", url);
}
}
/**
* 关闭连接
*
* @param url WebSocket URL
* @throws Exception
*/
public void close(String url) throws Exception {
WebSocketSession session = sessions.get(url);
if (session != null && session.isOpen()) {
session.close();
logger.info("WebSocket 连接已关闭:{}", url);
} else {
logger.warn("WebSocket 连接不存在或已关闭:{}", url);
}
sessions.remove(url);
}
/**
* WebSocket 处理器
*/
private class MyWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
logger.info("WebSocket 连接已建立:{}", session.getUri());
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
logger.info("已收到消息:{}", message.getPayload());
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
logger.error("WebSocket 连接出现异常:{}", session.getUri(), exception);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
logger.info("WebSocket 连接已关闭:{},状态码:{},原因:{}", session.getUri(), status.getCode(), status.getReason());
}
}
}
```
在 `WebSocketClient` 类中,我们通过 Map 存储多个 WebSocket 连接,使用 `connect()` 方法创建一个新的 WebSocket 连接,使用 `sendMessage()` 方法发送消息,使用 `close()` 方法关闭连接。
此外,我们还定义了一个内部类 `MyWebSocketHandler`,继承自 `TextWebSocketHandler`,用于处理 WebSocket 消息。
最后,在需要使用 WebSocket 客户端的地方,注入 `WebSocketClient` 即可:
```java
@RestController
public class MyController {
@Autowired
private WebSocketClient webSocketClient;
@GetMapping("/connect")
public void connect() throws Exception {
webSocketClient.connect("ws://localhost:8080/ws");
webSocketClient.connect("ws://localhost:8081/ws");
}
@GetMapping("/send")
public void send() throws Exception {
webSocketClient.sendMessage("ws://localhost:8080/ws", "Hello, WebSocket 1!");
webSocketClient.sendMessage("ws://localhost:8081/ws", "Hello, WebSocket 2!");
}
@GetMapping("/close")
public void close() throws Exception {
webSocketClient.close("ws://localhost:8080/ws");
webSocketClient.close("ws://localhost:8081/ws");
}
}
```
在上面的代码中,我们调用 `WebSocketClient` 的 `connect()` 方法建立两个 WebSocket 连接,调用 `sendMessage()` 方法发送消息,调用 `close()` 方法关闭连接。
请逐句解释一下上面的代码
好的,让我来一句一句地解释这段代码。
```
package ece448.iot_sim;
```
这是一个Java包的声明,表示该类位于ece448.iot_sim包中。
```
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ece448.iot_sim.http_server.RequestHandler;
```
这里导入了一些Java类和接口,包括List、Map、TreeMap、Logger、LoggerFactory和RequestHandler。其中,Logger和LoggerFactory是用于日志记录的,RequestHandler是一个接口,定义了处理HTTP请求的方法。
```
public class HTTPCommands implements RequestHandler {
```
这是一个类的声明,它实现了RequestHandler接口,表示该类的实例可以处理HTTP请求。
```
// Use a map so we can search plugs by name.
private final TreeMap<String, PlugSim> plugs = new TreeMap<>();
```
这里定义了一个私有的TreeMap对象,用于存储所有插座的名称和对应的PlugSim对象。使用TreeMap可以方便地根据插座名称进行查找。
```
public HTTPCommands(List<PlugSim> plugs) {
for (PlugSim plug: plugs)
{
this.plugs.put(plug.getName(), plug);
}
}
```
这是HTTPCommands类的构造函数,它接受一个PlugSim对象列表,并将这些对象添加到plugs TreeMap中,以便后续处理HTTP请求时可以根据插座名称查找对应的PlugSim对象。
```
@Override
public String handleGet(String path, Map<String, String> params) {
// list all: /
// do switch: /plugName?action=on|off|toggle
// just report: /plugName
logger.info("HTTPCmd {}: {}", path, params);
if (path.equals("/"))
{
return listPlugs();
}
PlugSim plug = plugs.get(path.substring(1));
if (plug == null)
return null; // no such plug
String action = params.get("action");
if (action == null)
return report(plug);
// P2: add your code here, modify the next line if necessary
if("toggle".equals(action)){
plug.toggle();
return report(plug);
}else if("on".equals(action)){
plug.switchOn();
return report(plug);
}else if("off".equals(action)){
plug.switchOff();
return report(plug);
}
return "<html><body></body></html>";
}
```
这是HTTPCommands类实现的RequestHandler接口的handleGet方法,用于处理HTTP GET请求。它根据请求路径和参数执行相应的操作,包括列出所有插座、开启/关闭/切换特定插座、报告特定插座的状态和功率读数等。首先,它记录一条日志,记录HTTP请求的路径和参数。接下来,它根据请求路径判断需要执行哪种操作。如果请求路径为“/”,则返回列出所有插座的HTML响应。如果请求路径为特定插座的名称,则根据名称查找对应的PlugSim对象。如果找不到,则返回null表示没有该插座。如果请求参数中没有“action”键,表示需要报告该插座的状态和功率读数,则调用report方法生成HTML响应。如果请求参数中包含“action”键,则根据其值执行相应的操作。如果值为“toggle”,则调用PlugSim对象的toggle方法切换插座的状态并返回HTML响应;如果值为“on”,则调用PlugSim对象的switchOn方法开启插座并返回HTML响应;如果值为“off”,则调用PlugSim对象的switchOff方法关闭插座并返回HTML响应。如果请求参数中的值不是上述三个值之一,则返回一个空的HTML响应。
```
protected String listPlugs() {
StringBuilder sb = new StringBuilder();
sb.append("<html><body>");
for (String plugName: plugs.keySet())
{
sb.append(String.format("<p><a href='/%s'>%s</a></p>",
plugName, plugName));
}
sb.append("</body></html>");
return sb.toString();
}
```
这是HTTPCommands类中的一个辅助方法,用于生成列出所有插座的HTML响应。它使用StringBuilder对象构建HTML响应,遍历plugs TreeMap中的所有插座名称,为每个插座生成一个链接,链接的URL是该插座的名称,链接的文本是该插座的名称。最后返回StringBuilder对象转换为的字符串形式。
```
protected String report(PlugSim plug) {
String name = plug.getName();
return String.format("<html><body>"
+"<p>Plug %s is %s.</p>"
+"<p>Power reading is %.3f.</p>"
+"<p><a href='/%s?action=on'>Switch On</a></p>"
+"<p><a href='/%s?action=off'>Switch Off</a></p>"
+"<p><a href='/%s?action=toggle'>Toggle</a></p>"
+"</body></html>",
name,
plug.isOn()? "on": "off",
plug.getPower(), name, name, name);
}
```
这也是HTTPCommands类中的一个辅助方法,用于生成报告特定插座状态和功率读数的HTML响应。它接受一个PlugSim对象作为参数,使用String.format方法构建HTML响应,该响应包含插座的名称、状态、功率读数以及开启/关闭/切换插座的链接。最后返回生成的HTML响应字符串。