如何让 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,wir​​eshark显示消息格式化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是如何工作的呢?

JVM:17 深入理解JVM的年轻代回收器ParNew是如何工作的?

Spark 在具有多个应用程序的工作人员上运行了多少 JVM

JVM(上)- JAVA面试必问基础知识

我就改了一下参数,竟然让Tomcat和JVM的性能提升了两倍!

一篇笔记整理JVM工作原理