java 在linux環境下寫入 syslog 問題研究


1.Syslog

在Unix類操作系統上,syslog廣泛應用於系統日志。syslog日志消息既可以記錄在本地文件中,也可以通過網絡發送到接收syslog的服務器。接收syslog的服務器可以對多個設備的syslog消息進行統一的存儲,或者解析其中的內容做相應的處理。常見的應用場景是網

絡管理工具、安全管理系統、日志審計系統。

2.linux下syslog系統

syslog是Linux系統默認的日志守護進,內核等一些模塊的日志基本上是通過syslog存儲的。新版本的ubuntu(不知道具體從哪個版本開始),把syslog擴展到了rsyslog。

syslog日志最主要的部分是產生日志的程序模塊(Facility)和日志等級(Level),其他還有諸如時間、主機ip、進程ID等信息。

ubuntu下syslog服務的配置文件為: /etc/rsyslog.conf

打開這個文件,比較有用的部分是:

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf

這句話告訴服務器去哪里讀取更詳細的配置文件,在/etc/rsyslog.d/文件夾下,有數個詳細配置文件。如果想要包含別的路徑的配置文件,可以按照類似規則添加。

在/etc/rsyslog.d/文件夾下有兩個文件20-ufw.conf和50-default.conf,在50-default.conf中可以看到有如下部分信息:

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
local1.*                        -/var/log/local1.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
#daemon.*                       -/var/log/daemon.log

其中的local1.* 代表了前文說的[Facility].[Level]組合。

Facility代表服務,指定syslog功能,local0~local7 為自定義程序使用,一般應用都選取1~7中的一個作為服務標志。

Level代表優先級,由高到低為panic, alert, crit, err, warning, notice, info, debug, none。

后半部分-/var/log/local1.log 表示日志文件的路徑。

cmd語句示例如:logger -p local1.info -t "test" "a test of syslog"。

 

3. java寫入syslog代碼

在linux環境下,使用logback日志框架連接syslog,xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <appender name="RSYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
    <syslogHost>127.0.0.1</syslogHost>
    <facility>LOCAL1</facility>
    <suffixPattern>%msg</suffixPattern>
  </appender>

  <logger name="com.xy.SystemLogger" level="DEBUG">
    <appender-ref ref="RSYSLOG" />
  </logger>

</configuration>

 java代碼如下:

static final Logger LOGGER = LoggerFactory.getLogger(SystemLogger.class);

 // send to syslog
 LOGGER.info("java[" + pid + "]: " + message);

但是,在syslog日志中沒有發現對應語句,java代碼沒有寫入。。。

 

請教大牛后,排查過程如下:

tcpdump -XX -v -i any host 127.0.0.1 and port 514
tail -f /opt/slk/var/log/SLK.log
strace -f java -jar target/consumer-1.0-SNAPSHOT.jar
ps auxwww | grep syslog
netstat -alp
ls /proc/pid/

最后找到原因:syslog在linux中默認使用unix domain socket機制,而java logger使用UDP socket方式無法鏈接上。

解決辦法是讓syslog使用UDP方式,修改/etc/rsyslog.conf:

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM