如何让 Syslogging 在 JVM 上工作?
Posted
技术标签:
【中文标题】如何让 Syslogging 在 JVM 上工作?【英文标题】:How can I get Syslogging to work on the JVM? 【发布时间】:2010-05-26 06:12:31 【问题描述】:我想从 Java 进行系统日志记录。有一个 log4j appender,但它似乎不起作用(无论如何对我来说......虽然谷歌结果显示许多其他人的这个问题仍未解决)。
我正在尝试调试appender,所以我根据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(有效的那个)远程交谈。我假设您应该将本地 syslogd 设置为中继。
编辑
使用nc,wireshark显示消息格式化OK,但是端口不可达。
【问题讨论】:
我认为这是一个比***更适合serverfault的问题。 【参考方案1】:需要明确告知 Ubuntu 中的网络防火墙允许流量到给定端口,这包括 Syslog。
【讨论】:
防火墙未激活。 jem@dsupport2:~/projects$ sudo ufw status 状态:不活动 嗯,ufw 没有开启,但是wireshark 说destination unreachable ... 有什么其他方法可以阻止端口? 改用 GUI 版本。我不知道幕后使用了哪种技术。【参考方案2】:您是否尝试过嗅探本地网络流量以查看日志消息是否实际发送、它们是否格式正确等?你可以使用nast 或类似的东西。
【讨论】:
不知道当流量是环回时有可能。但我还没有尝试过 nast,所以这里......nast
只是我在 Google 上找到的第一件事,我只是假设它可以嗅探环回。无论如何,WireShark 可以:wiki.wireshark.org/CaptureSetup/Loopback【参考方案3】:
Syslogd 可能不是在侦听 IP 套接字,而是侦听 unix 域套接字。标准套接字是/dev/log
。您将需要使用诸如JUDS 之类的库来连接到此套接字。这将提供一个可以写入日志记录的 OutputStream。
【讨论】:
以上是关于如何让 Syslogging 在 JVM 上工作?的主要内容,如果未能解决你的问题,请参考以下文章
JVM:17 深入理解JVM的年轻代回收器ParNew是如何工作的?
Spark 在具有多个应用程序的工作人员上运行了多少 JVM