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/

改完就可以正常写日志了。