温馨提示×

Ubuntu JS日志中如何检查网络连接状态

小樊
53
2025-09-22 13:48:43
栏目: 编程语言

Ubuntu下通过JS(Node.js)日志检查网络连接状态的方法

在Ubuntu系统中,Node.js应用程序的网络连接状态可通过应用层日志记录系统层日志关联网络工具辅助综合排查。以下是具体步骤:

1. 在Node.js应用中记录详细网络日志

通过代码主动输出网络连接的关键信息(如请求响应、连接错误、Socket状态),是最直接的排查方式。

  • 使用内置console模块:在代码中添加console.logconsole.error,记录请求URL、响应状态码、错误消息等。例如:
    const http = require('http');
    const server = http.createServer((req, res) => {
      console.log(`[INFO] Request received: ${req.method} ${req.url}`); // 记录请求信息
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      res.end('Hello World\n');
    });
    server.listen(3000, () => {
      console.log('[INFO] Server started on port 3000'); // 记录服务启动状态
    });
    
  • 使用第三方日志库(推荐)winston(支持多transport、日志分级)或pino(高性能JSON日志),记录更结构化的网络日志。例如:
    const winston = require('winston');
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new winston.transports.File({ filename: 'network.log' }), // 写入文件
        new winston.transports.Console() // 输出到控制台
      ]
    });
    const http = require('http');
    const server = http.createServer((req, res) => {
      logger.info({ url: req.url }, 'Request received'); // 结构化日志
      res.end('Hello World\n');
    });
    server.listen(3000, () => {
      logger.info('Server started on port 3000');
    });
    
  • 监控Socket连接状态:使用net模块记录客户端连接、断开、错误等事件:
    const net = require('net');
    const logger = require('pino')();
    const server = net.createServer((socket) => {
      logger.info('Client connected'); // 客户端连接
      socket.on('data', (data) => logger.info(`Data received: ${data}`));
      socket.on('end', () => logger.info('Client disconnected')); // 客户端断开
      socket.on('error', (err) => logger.error(`Socket error: ${err.message}`)); // Socket错误
    });
    server.listen(3000, () => logger.info('Server listening on port 3000'));
    
    通过以上日志,可快速定位连接失败、超时、端口占用等问题。

2. 查看系统层网络日志

Ubuntu的系统日志(syslogkern.log)会记录网络层面的异常(如DNS解析失败、防火墙拦截、路由问题),可与Node.js日志结合分析。

  • 实时查看系统日志:使用journalctl命令查看与Node.js服务相关的日志(需服务以systemd管理):
    sudo journalctl -u your-node-service.service -f  # 实时跟踪服务日志
    
  • 查看内核及网络日志
    sudo tail -f /var/log/syslog | grep -i network  # 过滤网络相关日志
    sudo tail -f /var/log/kern.log | grep -i error   # 查看内核错误日志
    
    常见网络错误包括:ECONNREFUSED(目标端口未开放)、ETIMEDOUT(连接超时)、ENOTFOUND(域名解析失败)。

3. 使用网络诊断工具辅助验证

通过命令行工具快速测试网络连接状态,确认问题是否出在系统层面:

  • 测试连通性:用ping命令检查目标主机是否可达:
    ping example.com  # 测试域名连通性
    ping 8.8.8.8      # 测试IP连通性
    
  • 追踪路由路径:用traceroute(或tracepath)查看数据包到目标主机的路径:
    traceroute example.com  # 显示路由跳数及延迟
    
  • 检查端口连接:用telnetnc(netcat)测试目标端口是否开放:
    telnet example.com 80  # 测试HTTP端口
    nc -zv example.com 443 # 测试HTTPS端口(-z表示扫描,-v表示详细)
    
  • 查看网络连接状态:用ss(替代netstat)查看当前连接、监听端口:
    ss -tulnp | grep node  # 查看Node.js进程的网络连接
    
    ss显示大量TIME_WAITCLOSE_WAIT状态的连接,可能需调整Node.js的连接池配置。

4. 检查防火墙及系统配置

确保Ubuntu防火墙(ufwiptables)未阻止Node.js应用的网络访问:

  • 查看防火墙状态
    sudo ufw status  # 查看ufw规则(默认允许SSH、HTTP等)
    
  • 允许端口通过防火墙:若Node.js应用运行在3000端口,添加规则:
    sudo ufw allow 3000/tcp  # 允许TCP端口3000
    sudo ufw reload          # 重新加载规则
    
  • 检查iptables规则:若使用iptables,查看是否有拦截规则:
    sudo iptables -L -n | grep node  # 过滤与Node.js相关的规则
    

通过以上步骤,可从应用层日志系统层日志网络工具验证三个维度全面检查Ubuntu下Node.js应用的网络连接状态,快速定位并解决问题。

0