日志管理
<h1>日志管理及配置</h1>
<ul>
<li>Nginx总结(七)Nginx服务器的日志管理及配置</li>
<li><a href="https://www.cnblogs.com/zhangweizhong/p/12342366.html">https://www.cnblogs.com/zhangweizhong/p/12342366.html</a></li>
</ul>
<h2>日志格式</h2>
<ul>
<li>nginx 配置文件的 server 段,可以找到类似信息
<ul>
<li>
<h1>access_log logs/host.access.log main;</h1>
</li>
<li>说明该 server, 它的访问日志的文件是 logs/host.access.log</li>
</ul></li>
<li>使用的日志格式是"main"格式,除了main格式,你可以自定义其他格式</li>
</ul>
<h2>main格式</h2>
<pre><code class="language-nginx">log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';</code></pre>
<ul>
<li>main格式是我们定义好一种日志的格式,并起个名字,便于引用。</li>
<li>以上面的例子,main类型的日志,记录的 remote_addr.... http_x_forwarded_for等选项</li>
</ul>
<h2>日志格式记录选项</h2>
<ul>
<li>
<p>默认的日志格式: main</p>
<pre><code class="language-nginx">log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
</code></pre>
</li>
<li>
<p>默认的main日志格式,记录这么几项</p>
<ul>
<li>远程IP</li>
<li>
<p>远程用户/用户时间 请求方法(如GET/POST) 请求体body长度 referer来源信息</p>
</li>
<li>http-user-agent</li>
<li>
<p>用户代理/蜘蛛 ,被转发的请求的原始IP</p>
</li>
<li>http_x_forwarded_for</li>
<li>在经过代理时,代理把你的本来IP加在此头信息中,传输你的原始IP</li>
</ul>
</li>
</ul>
<h2>进行配置</h2>
<ul>
<li>
<p>声明一个新的log_format并命名 mylog</p>
<pre><code class="language-nginx">log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';</code></pre>
</li>
<li>
<p>在下面的server/location,我们就可以引用 mylog </p>
<pre><code class="language-nginx">server {
listen 8080; #端口
server_name 192.168.32.128; #域名
location / {
root /usr/local/nginx/html/192.168.32.133; #根目录
index.html index.htm;
access_log logs/access_192.168.32.133.log mylog;
}
}</code></pre>
</li>
<li>
<p>nginx 允许针对不同的 server 做不同的 log(有的 web 服务器不支持,如lighttp)</p>
<pre><code class="language-nginx">access_log logs/access_8080.log mylog;
# access_log 声明log
# logs/access_192.168.32.133.log log位置
# mylog log格式</code></pre>
</li>
<li>
<p>查看日志记录</p>
<pre><code class="language-shell"># nginx 日志配置完成后,重启,查看日志是否生成成功
systemctl restart nginx
ps aux | grep nginx</code></pre>
</li>
</ul>
<h2>实际应用</h2>
<ul>
<li>
<p>日志实际生产环境一般是按日期分割存储的</p>
</li>
<li>
<p>实现方式</p>
<ul>
<li>shell + 定时任务 + nginx信号管理,完成日志按日期存储</li>
</ul>
</li>
<li>
<p>分析思路</p>
<ul>
<li>凌晨 02:00:00,把昨天的日志重命名,放在相应的目录下</li>
<li>把 USR1 信息号控制 nginx 重新生成新的日志文件</li>
</ul>
</li>
<li>
<p>实现</p>
<pre><code class="language-shell"># 增加按日期备份日志的脚本
#!/bin/bash
base_path='/usr/local/nginx/logs'
log_path=$(date -d yesterday +"%Y%m")
day=$(date -d yesterday +"%d")
mkdir -p $base_path/$log_path
mv $base_path/access.log $base_path/$log_path/access_$day.log
# echo $base_path/$log_path/access_$day.log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`</code></pre>
</li>
<li>
<p>增加定时任务</p>
<pre><code class="language-shell">* * * 02 1 /xxx/path/b.sh # 每天02时1分(建议在02-04点之间,系统负载小)</code></pre>
</li>
</ul>