nginx或tengine服务器默认访问日志日志放在一个文件中,随着文件增大,必然影响运行效率,那么如何象Tomcat那样按日切割日志呢?
网上有很多方法采用了shell脚本+crontab定时任务,每天凌晨定时给日志文件重新命名,这种方法虽然有效,比较麻烦,其实可以用nginx(或tengine)服务器的原生方法可以轻松解决。
方法如下:
打开日志配置文件nginx.conf,在所有的server段中加入
if ($time_iso8601 ~ "(\d{4})-(\d{2})-(\d{2})") {
set $time $1$2$3;
}
access_log logs/access_${time}.log main;
形如:
server {
listen 443 ssl;
server_name huadaninfo.com www.huadaninfo.com;
if ($time_iso8601 ~ "(\d{4})-(\d{2})-(\d{2})") {
set $time $1$2$3;
}
access_log logs/access_${time}.log main;
charset utf-8;
if ( $host = 'huadaninfo.com' ) {
rewrite ^/(.*)$ https://www.huadaninfo.com/$1 permanent;
}
ssl_certificate certs/www.huadaninfo.com.pem;
ssl_certificate_key certs/www.huadaninfo.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
...
对于tengine服务器,还可以更简单,因为tengine服务器支持$year,$month,$day等变量,可以直接在http段写即可,形如:
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;#隐藏版本号
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 logs/access_$year$month$day.log main;
...
通过上述设置,重启nginx(或tengine)后,没能正确写入日志,error.log报错信息为:
*2420 open() "/usr/local/nginx/log/access-20201225.log" failed (13: Permission denied)
产生这种错误的原因是日志目录/usr/local/nginx/logs/是由root创建的,而ngix的用户和用户组是nginxe及nginx(这是在编译nginx时,由configure参数指定的),当nginx(或tengine)按日期去写新的日志文件时,发现nginx用户组权限较低,无法在指定的日志目录下创建日志文件。
解决方案为:将日志目录/usr/local/nginx/logs/的拥有者改为nginx用户即可:
chown -R nginx:nginx /usr/local/nginx/logs/
改完就可以正常写日志了。