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