系统日志的常见位置与标准
在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
}