代码之家  ›  专栏  ›  技术社区  ›  Synesso

如何让系统日志在JVM上工作?

  •  1
  • Synesso  · 技术社区  · 14 年前

    我想用Java做系统日志。有一个log4j附加器,但它似乎不起作用(无论如何对我来说…尽管谷歌的调查结果显示,还有许多人对此问题仍未解决)。

    我正在尝试调试附加程序,因此我已经根据以下脚本编写了 RFC3164

    它运行,但系统日志中没有日志记录。

    // scala
    import java.io._
    import java.net._
    val ds = new DatagramSocket()
    val fullMsg = "<11>May 26 14:47:22 Hello World"
    val packet = new DatagramPacket(fullMsg.getBytes("UTF-8"), fullMsg.length, 
      InetAddress.getLocalHost, 514)
    ds send packet
    ds.close
    

    我也试过使用/bin/nc,但它也不起作用。

    echo "<14>May 26 15:23:33 Hello world" > nc -u localhost 514
    

    ubuntu命令/usr/bin/logger 然而,工作。

    logger -p user.info hello world
    # logs: May 26 15:25:10 dsupport2 jem: hello world
    

    我可能做错什么了?

    编辑

    两个NC和scala都会生成以下数据包:

    jem@dsupport2:~/projects/log4j$ grep -A 10 514 out
    xxx.xxx.xxx.xxx:37920(unknown) -> xxx.xxx.xxx.xxx:514(syslog)
    Version: 4   Total Lenght: 63   TTL: 64
    Packet Number: 4
    
    ---[ UDP Data ]------------------------------------------------------
    
    <14>May 26 15:26:33 Hello world 22
    

    似乎我不能让/usr/bin/logger(工作的那个)远程通话。我想您应该将本地系统日志设置为中继。

    编辑

    使用nc,wireshark显示消息格式化为OK,但端口无法访问。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Thorbjørn Ravn Andersen    14 年前

    需要明确告知Ubuntu中的网络防火墙,以允许到给定端口的通信,这包括Syslog。

        2
  •  1
  •   gustafc    14 年前

    您是否尝试嗅探本地网络流量以查看日志消息是否真的被发送,是否看起来格式良好等等?你可以使用 nast 或者类似的。

        3
  •  1
  •   Geoff Reedy    14 年前

    Syslogd可能没有在IP套接字上侦听,而是在Unix域套接字上侦听。标准插座是 /dev/log . 您需要使用一个库,例如 JUDS 连接到这个插座。这将提供一个输出流,您可以将日志记录写入该输出流。