Ubuntu

Systemd/rsyslog 日誌記錄未按預期工作

  • April 11, 2022

我有一個相當普通的 Ubuntu 20.04LTS 盒子,我從 repo 部署了 Tomcat9。開箱即用,這似乎被配置為將其日誌寫入 /var/log/tomcat9/ 並且那裡確實有日誌文件。然而,這些資訊只有我期望的一小部分——其餘部分在輸出中可見,systemctl status tomcat9並且正在寫入 /var/log/syslog。

提供的單元文件中唯一相關的是……

SyslogIdentifier=tomcat9

在安裝tomcat的同時還創建了/etc/rsyslog.d/tomcat9.conf 包含…。

# Send Tomcat messages to catalina.out when using systemd
$template TomcatFormat,"[%timegenerated:::date-year%-%timegenerated:::date-month%-%timegenerated:::date-day% %timegenerated:::date-hour%:%timegenerated:::date-minute%:%timegenerated:::date-second%] [%syslogseverity-text%]%msg%\n"

:programname, startswith, "tomcat9" {
 /var/log/tomcat9/catalina.out;TomcatFormat
 stop
}

的輸出範例systemctl status tomcat9

● tomcat9.service - Apache Tomcat 9 Web Application Server
    Loaded: loaded (/lib/systemd/system/tomcat9.service; enabled; vendor preset: enabled)
   Drop-In: /etc/systemd/system/tomcat9.service.d
            └─override.conf
    Active: active (running) since Fri 2022-04-08 13:07:39 UTC; 17min ago
      Docs: https://tomcat.apache.org/tomcat-9.0-doc/index.html
   Process: 1006 ExecStartPre=/usr/libexec/tomcat9/tomcat-update-policy.sh (code=exited, status=0/SUCCESS)
  Main PID: 1026 (java)
     Tasks: 53 (limit: 2274)
    Memory: 332.9M
    CGroup: /system.slice/tomcat9.service
            └─1026 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.util.logging.config.file=/var/lib/tomcat9/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.C>

Apr 08 13:20:14 myhost.example.com tomcat9[1026]: [cfPullService] DEBUG 13:20:14 ConnectionManager.openConnection(444) | opening JDBC connection
Apr 08 13:20:14 myhost.example.com tomcat9[1026]: [cfPullService] DEBUG 13:20:14 JDBCTransaction.begin(87) | current autocommit status: true
Apr 08 13:20:14 myhost.example.com tomcat9[1026]: [cfPullService] DEBUG 13:20:14 JDBCTransaction.begin(90) | disabling autocommit
Apr 08 13:20:14 myhost.example.com tomcat9[1026]: [cfPullService] DEBUG 13:20:14 JDBCTransaction.commit(134) | commit
Apr 08 13:20:14 myhost.example.com tomcat9[1026]: [cfPullService] DEBUG 13:20:14 JDBCTransaction.toggleAutoCommit(227) | re-enabling autocommit

上面的“cfPullService”來自已部署的 java 程式碼(實際上是一個黑盒子),並且可能在其他時間包含其他值。

以及 /var/log/syslog 中的條目範例…

Apr  8 13:20:12 myhost tomcat9[1026]: [cfPullService] INFO 13:20:12 RunSearchManagerImpl.runEarlyEngagementSearch(165) | Finished saving early engagement notices.
Apr  8 13:20:12 myhost tomcat9[1026]: [cfPullService] INFO 13:20:12 RunSearchManagerImpl.runPipelineSearch(176) | Running pipeline search

提供的 /etc/rsyslog.d/tomcat9.conf 如下所示:

# Send Tomcat messages to catalina.out when using systemd
$template TomcatFormat,"[%timegenerated:::date-year%-%timegenerated:::date-month%-%timegenerated:::date-day% %timegenerated:::date-hour%:%timegenerated:::date-minute%:%timegenerated:::date-second%] [%syslogseverity-text%]%msg%\n"

:programname, startswith, "tomcat9" {
 /var/log/tomcat9/catalina.out;TomcatFormat
 stop
}

我嘗試使用…創建一個 systemd 覆蓋文件(並應用了守護程序重新載入)。

[Service]
StandardOutput=syslog
StandardError=syslog

但這對行為沒有影響。

我如何能

  1. 獲取 tomcat 的輸出到 /var/log/tomcat9 中的文件
  2. 停止將 tomcat 的輸出發送到 /var/log/syslog

似乎部分問題在錯誤 #1861881中進行了描述。

我能夠通過以下方式獲得一個工作日誌文件,同時從 syslog 中排除條目:

  1. 從 /etc/rsyslog.d/tomcat.conf 中刪除內容(保留空白文件以防止通過自動修補恢復)
  2. 將內容放在 /etc/rsyslog.d/12-tomcat9.conf 中(以確保它在 50-default.conf 之前載入)並避免“action ‘action-11-builtin:omfile’ 暫停(模組 ‘builtin:omfile’ ),重試0。在此之前應該有消息給出原因“
  3. 修改從 /var/log/tomcat9/catalina.out 到 /var/log/tomcat.log 的路徑以避免權限問題(/var/log/tomcat9 不能被 syslog 使用者寫入)
  4. 添加一個新的 /etc/logrotate.d 文件,其內容如下……
/var/log/tomcat.log
{
       rotate 7
       daily
       missingok
       notifempty
       delaycompress
       compress
       postrotate
               /usr/lib/rsyslog/rsyslog-rotate
       endscript
}

引用自:https://unix.stackexchange.com/questions/698481