Linux 日誌採用 設備 × 級別 矩陣路由:
| 設備 | 用途 |
|---|---|
LOCAL0~LOCAL7 | 自定義應用(推薦) |
USER | 通用用戶進程(預設) |
DAEMON | 系統守護進程 |
AUTH/AUTHPRIV | 認證授權 |
級別由高到低:emerg > alert > crit > err > warning > notice > info > debug。
# /etc/rsyslog.conf 或 /etc/rsyslog.d/50-myapp.conf
# 將 LOCAL4 設備 info 及以上級別寫入專用文件
local4.info -/var/log/myapp.log
# 同步刷盤(去掉 - 前綴)提高可靠性,性能略降
# local4.info /var/log/myapp.log
生效:systemctl restart rsyslog 或 service rsyslog reload。
# 手動寫入測試
logger -p local4.info "PHP syslog test message"
# 即時查看
tail -f /var/log/myapp.log
<?php
// 初始化:標譤、選項、設備
openlog('MyApp', LOG_PID | LOG_PERROR, LOG_LOCAL4);
// 記錄不同級別日誌
syslog(LOG_INFO, '用戶登入:user_id=1001');
syslog(LOG_WARNING, 'API 響應超時:endpoint=/order');
syslog(LOG_ERR, '數據庫連接失敗:' . $mysqli->error);
// 關閉(腳本結束自動調用,顯式調用釋放資源更佳)
closelog();
?>
openlog($ident, $options, $facility)
$ident:每條日誌前綴標識,便於過濾。$options:LOG_PID 附加進程 ID,LOG_PERROR 同時輸出到 stderr,LOG_NDELAY 立即打開連接。$facility:對應 rsyslog 設備,LOG_LOCAL0~LOG_LOCAL7。syslog($priority, $message):$priority 組合級別,如 LOG_LOCAL4 | LOG_WARNING。<?php
class SyslogLogger {
private static $initialized = false;
public static function init($ident = 'App', $facility = LOG_LOCAL4) {
if (!self::$initialized) {
openlog($ident, LOG_PID | LOG_PERROR, $facility);
self::$initialized = true;
}
}
public static function log($level, $message, array $context = []) {
self::init();
$msg = $message;
if ($context) $msg .= ' ' . json_encode($context, JSON_UNESCAPED_UNICODE);
syslog($level, $msg);
}
public static function info($msg, $ctx = []) { self::log(LOG_INFO, $msg, $ctx); }
public static function warn($msg, $ctx = []) { self::log(LOG_WARNING, $msg, $ctx); }
public static function error($msg, $ctx = []) { self::log(LOG_ERR, $msg, $ctx); }
}
// 使用
SyslogLogger::info('訂單創建', ['order_id' => 123, 'amount' => 99.9]);
?>