Linux/Unix系统中如何将curl下载日志统一写入系统级日志文件


阅读 8 次

系统日志的常见位置与标准

在Unix/Linux系统中,系统级日志通常存储在以下目录:

/var/log/
/var/log/syslog
/var/log/messages
/var/log/daemon.log

这些日志文件由syslog服务管理,应用程序可以通过syslog API将日志写入系统日志。MacOS的Console应用实际上就是从这些系统日志中聚合显示日志信息的。

使用logger命令记录curl输出

最简单的方式是通过管道将curl输出传递给logger命令:

curl -v http://example.com/file.jar 2>&1 | logger -t my_curl_download

其中:

  • -v 参数让curl输出详细日志(包括HTTP头)
  • 2>&1 将标准错误重定向到标准输出
  • -t my_curl_download 为日志条目添加标签

直接使用syslog API的C代码示例

如果需要在自己的程序中实现:

#include <syslog.h>

int main() {
    openlog("my_curl_wrapper", LOG_PID, LOG_DAEMON);
    
    // 执行curl并捕获输出
    FILE* curl_output = popen("curl -v http://example.com/file.jar", "r");
    if (curl_output) {
        char buffer[1024];
        while (fgets(buffer, sizeof(buffer), curl_output)) {
            syslog(LOG_INFO, "%s", buffer);
        }
        pclose(curl_output);
    }
    
    closelog();
    return 0;
}

配置rsyslog创建专用日志文件

在/etc/rsyslog.conf中添加:

# 为curl下载创建专用日志
if $programname == 'my_curl_download' then /var/log/curl_downloads.log
&~

然后重启rsyslog服务:

sudo systemctl restart rsyslog

Python实现示例

使用Python的logging.handlers.SysLogHandler:

import logging
import logging.handlers
import subprocess

logger = logging.getLogger('curl_downloader')
logger.setLevel(logging.INFO)
handler = logging.handlers.SysLogHandler(address='/dev/log')
logger.addHandler(handler)

proc = subprocess.Popen(['curl', '-v', 'http://example.com/file.jar'],
                       stdout=subprocess.PIPE,
                       stderr=subprocess.STDOUT)

for line in iter(proc.stdout.readline, b''):
    logger.info(line.decode('utf-8').strip())

日志轮转配置

在/etc/logrotate.d/下创建配置文件:

/var/log/curl_downloads.log {
    weekly
    missingok
    rotate 4
    compress
    delaycompress
    notifempty
    create 644 root root
}