服务器日志记录文件,本质是应用程序或系统服务把“谁在什么时间做了什么”按约定格式追加写入文本或二进制日志,再由rsyslog、journald这类日志服务统一落盘,最后用logrotate轮转,避免单个文件无限膨胀。 文件写到哪里、用什么格式、保留多久,都要在上线前定好。
服务器日志记录文件的方法有哪些
日志文件不是天生就有的,不同程序、不同运行环境,记录路径差别很大,常见做法就四类:应用自己写、系统日志服务接管、容器运行时落盘、集中采集。
应用程序直接写文件
这是最直观的一种,Nginx、MySQL、Redis这类服务,通常在自己的配置里指定日志路径和格式,Nginx的配置大概是这样:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
应用进程打开文件描述符,收到请求就追加一行,优点是排查快,tail -f /var/log/nginx/access.log 就能盯着看,缺点是应用要自己处理切割,写满磁盘会出事故,MySQL的慢查询日志、错误日志也属于这一类,路径一般在my.cnf里用slow_query_log_file、log_error指定。
系统日志服务统一接管
Linux上更常见的是把日志交给rsyslog或systemd-journald,程序调用syslog(),日志服务根据设施和级别决定写到哪,rsyslog的规则在/etc/rsyslog.conf和/etc/rsyslog.d/下,
.info;mail.none;authpriv.none;cron.none /var/log/messages authpriv. /var/log/secure
authpriv管认证安全,cron管计划任务,daemon管后台服务,syslog消息格式在RFC 5424里有明确定义,时间、主机、进程、消息ID都有位置,systemd-journald则把内核和unit日志收进/var/log/journal/,存的是二进制,得用journalctl -u nginx --since today查,二进制带元数据,结构化好,但不能直接拿grep扫。
容器和云平台的日志驱动
容器里应用通常往stdout/stderr写,Docker默认用json-file驱动,落在/var/lib/docker/containers/<容器ID>/<容器ID>-json.log,可以用docker logs看,也可以在启动时加参数限制大小:
docker run --log-opt max-size=100m --log-opt max-file=3 ...
Kubernetes里容器日志由节点上的容器运行时落盘,再由Filebeat、Fluent Bit采集到Elasticsearch或云日志服务,云服务器上也可以直接用厂商的日志采集器,把多台机器的文件汇总到一个控制台。
| 记录方式 | 典型文件或载体 | 查看方式 | 适合场景 |
|---|---|---|---|
| 应用直写 | /var/log/nginx/access.log |
tail -f、grep |
单机Web、数据库 |
| syslog | /var/log/messages、/var/log/syslog |
tail、grep |
系统服务、安全审计 |
| journald | /var/log/journal/ |
journalctl |
systemd环境 |
| 容器驱动 | /var/lib/docker/...-json.log |
docker logs |
容器化应用 |
| 集中采集 | ES、对象存储、云日志服务 | Kibana、控制台 | 多机、长期留存 |
Linux服务器日志文件一般存放在哪里
多数落在/var/log下,但不是绝对,发行版不同、安装方式不同,路径会变,常见位置可以先记这几类:
- 系统通用:RHEL/CentOS看
/var/log/messages,Debian/Ubuntu看/var/log/syslog - 认证安全:
/var/log/secure、/var/log/auth.log - 计划任务:
/var/log/cron - Web服务:
/var/log/nginx/access.log、error.log,或/var/log/httpd/ - 数据库:
/var/log/mysql/error.log、slow.log - 内核启动:
dmesg,部分系统有/var/log/dmesg - journald:
/var/log/journal/
先跑一条命令看全貌:
sudo ls -lh /var/log sudo du -sh /var/log/ | sort -h
怎么快速定位某个服务的日志文件
别猜默认路径,查配置最准,按下面顺序走:
- 看进程打开了哪些日志文件:
sudo lsof -p <pid> | grep log,或者ls -l /proc/<pid>/fd | grep log - 看应用配置:Nginx用
nginx -T | grep access_log,MySQL用mysqld --verbose --help | grep log-error - 看systemd unit:
systemctl cat nginx,留意StandardOutput、StandardError - 看journal:
journalctl -u nginx -n 50
行业共识认为,先看配置再看默认路径,能少走弯路,同一个服务,源码编译安装和包管理器安装,日志路径可能完全不同。
服务器日志文件太大怎么清理
先说结论:不要直接rm正在写入的日志文件,进程还持有文件描述符,磁盘空间不会释放,du看着小了,df还是满的,正确做法是轮转、截断,再通知进程重开文件。
用logrotate做轮转和清理
logrotate是Linux发行版常见组件,主配置在/etc/logrotate.conf,服务单独配置放/etc/logrotate.d/,Nginx可以这样写:
/var/log/nginx/.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
daily按天切,rotate 14保留14份,compress压缩旧文件,postrotate发信号让Nginx重新打开日志,改完先演练:
sudo logrotate -d /etc/logrotate.d/nginx
确认没问题再强制执行一次:
sudo logrotate -f /etc/logrotate.d/nginx
create后面的权限和属主别写错,否则Nginx重开文件可能失败。
手动截断和清理journald
临时释放空间可以用截断:
sudo truncate -s 0 /var/log/nginx/access.log
或者:
sudo : > /var/log/nginx/access.log
截完同样要通知进程重开,journald有自己的清理命令:
sudo journalctl --vacuum-size=500M sudo journalctl --vacuum-time=7d
清理旧压缩包之前先确认保留策略:
sudo find /var/log -name ".gz" -mtime +30 -delete
从源头限流
清理是事后补救,限流才是根治,Nginx把日志级别调到warn,访问日志按需保留;应用避免长期开debug;Docker日志驱动配max-size和max-file,审计要求高的系统,安全日志单独保留,别和访问日志一起清。
服务器日志按天切割和按大小切割哪个好
两种策略不是二选一,关键看业务流量稳不稳。
| 策略 | 优点 | 缺点 | 适用 |
|---|---|---|---|
| 按天切割 | 归档清晰,按日期检索方便 | 大流量日单文件可能很大 | 访问量稳定 |
| 按大小切割 | 控制单文件体积,防止打满磁盘 | 文件时间边界乱 | 突发流量 |
| 组合策略 | 兼顾归档和磁盘保护 | 配置稍复杂 | 多数生产环境 |
组合策略怎么配
logrotate支持daily加maxsize,达到大小阈值会提前轮转,没达到就按天走,示例:
/var/log/nginx/.log {
daily
maxsize 500M
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
业内专家指出,生产环境常用“按天为主、按大小为兜底”,既方便归档,又避免某天流量暴涨把磁盘打满,配完记得用logrotate -d验证,别直接上生产。
服务器日志存储一个月大概多少费用
这个没有统一价,取决于存哪里、留多久、查不查,成本主要四块:存储介质、索引、流量、保留周期。
- 本地磁盘:不额外付费,但占服务器系统盘,盘满了影响业务
- 对象存储:按量计费,冷归档比标准存储便宜,适合长期留存
- 云日志服务:按写入量、存储量、查询量计费,热查方便但成本高
- 自建ELK:软件免费,服务器和运维人力是隐性成本
估算方法不复杂:先统计每天日志量,du -sh /var/log看当前占用,按保留天数乘上去,再考虑压缩后体积会明显变小,文本日志压缩比通常不错,但别拿这个当精确预算,省钱的做法是分级:最近7天放热存储方便查,30天以上压缩转对象存储,审计日志单独留,据公开的云厂商计费文档,存储和查询是分开计价的,查询越频繁,成本越容易上去。
服务器日志记录文件常见问题Q&A
服务器日志记录文件时,直接删掉旧日志可以吗?
不建议,正在写入的文件被rm后,进程仍持有文件描述符,磁盘空间不释放,用truncate截断或交给logrotate轮转,再让进程重开日志,删除前确认审计和保留要求。
服务器日志记录文件用文本还是二进制好?
看用途,文本可以直接grep、tail,排障快;二进制如journald带元数据、结构化好,但要用journalctl查,对外审计和跨工具采集,文本或JSON更通用。
服务器日志记录文件需要记录哪些字段?
至少时间、主机、服务或进程、级别、消息,Web日志加客户端IP、请求方法、URI、状态码、耗时、User-Agent;安全审计加用户、来源IP、操作结果,字段用JSON等结构化格式,后续采集和分析更省事。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/788799.html

