Nginx日志的指令主要有两条:
log_format,设置日志的格式
access_log,指定日志文件的存放路径、格式和缓存大小
两条指令在Nginx配置文件中的位置可以在http{……..}之间,也可以在虚拟主机之间,即server(…….)两个大括号之间。
Nginx的日志文件没有类似Apache的rotate功能,产生的日志都是存在一个文件,随着网站运行时间越长,日志文件的大小也在不断增长,这对运维人员想分析当天日志非常的不方便,如果不定期清理,很快就是达到了10G级别,下载和分析都极其困难,所以需要每天把日志文件分割出来,并以时间命名。
下面以wdcp这个环境为例,进行说明。通过对ngnix的vhost文件指定网站的日志存放位置的配置,把日志放在/www/web_logs/kzyanyi_com/下面。
创建日志分割脚本
1、登录SSH,创建cut_logs.sh文件
1
|
vi
/
www
/
scrpits
/
cut_logs
.
sh
|
2、粘贴下面代码到cut_logs.sh,并保存。注意wdcp默认的nginx安装路径。
Nginx不支持像Apache 一样使用cronolog来轮转日志,但是可以采用以下方式来实现日志文件的切割,比如:
mv /data1/logs/access.log /data1/logs/20111030.log
kill -USR1 Nginx主进程号
通过mv命令将日志文件重命名为/data1/logs/20111030.log,然后发送kill -USR1信号给Nginx的主进程号,让Nginx重新生成一个新的日志文件/data1/logs/access.log。如果想每天定时切割日志,还须要借助crontab。我们可以写一个按天切割的日志,按年、月
份目录存放日志的shell脚本:
1
2
3
4
5
6
|
#!/bin/bash
# The Nginx logs path
logs_path
=
"/www/web_logs/kzyanyi_com/"
mkdir
-
p
$
{
logs_path
}
$
(
date
-
d
"yesterday"
+
"%Y"
)
/
$
(
date
-
d
"yesterday"
+
"%m"
)
/
mv
$
{
logs_path
}
kzyanyi
.
com_access
.
log
$
{
logs_path
}
$
(
date
-
d
"yesterday"
+
"%Y"
)
/
$
(
date
-
d
"yesterday"
+
"%m"
)
/
kzyanyi_
$
(
date
-
d
"yesterday"
+
"%Y%m%d"
)
.
log
kill
-
USR1
$
(
cat
/
www
/
wdlinux
/
nginx
-
1.2.9
/
logs
/
nginx
.
pid
)
|
以上脚本执行的操作是在日志文件夹下面创建用年月命名的目录,比如/www/web_logs/kzyanyi_com/2015/08/,然后,把原来的日志文件移动并命名为/www/web_logs/kzyanyi_com/2015/08/access_20150830.log文件,然后再发送kill -USR1 信号给Nginx主进程,重新生成一个日志文件。
注意第一行 #!/bin/bash 不是注释,而是定义使用哪种sh解释器来解释脚本。
3、添加cut_logs.sh执行权限
1
|
chmod
+
x
/
www
/
scrpits
/
cut_logs
.
sh
|
或者直接对这个脚本目录下的文件添加执行权限
1
|
chmod
-
R
+
x
/
www
/
scrpits
/
|
4、设置cut_logs.sh启动时间
执行命令crontab -e进入编辑状态
添加如下代码,每天0点01分执行任务。
1
|
01
00
*
*
*
/
bin
/
bash
/
/
www
/
scrpits
/
cut_logs
.
sh
|
这样每天定时分割日志文件就设置成功了。当然如果你担心日志文件占太多空间,还可以执行压缩tar,并设置删除多少天前的日志文件。
必要的话,重启nginx和cron服务:
1
2
|
service
nginxd
restart
service
crond
restart
|
5、以上方法只能对单个日志文件进行分割操作,还有更高级一点的方法,批量分割操作日志文件,并压缩为rar文件,然后删除源日志文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#!/bin/bash
# This script run at 00:00
# www.totodata.com
# 设置日志文件存放目录
logs_path
=
"/www/web_logs/kzyanyi_com/"
# 设置pid文件
pid_path
=
"/www/wdlinux/nginx-1.2.9/logs/nginx.pid"
cd
$
logs_path
for
logfile
in
`
ls *
.
log
`
do
mv
$
{
logs_path
}
$
{
logfile
}
$
{
logs_path
}
$
(
date
-
d
"yesterday"
+
"%Y%m%d_"
)
$
{
logfile
}
done
# 打包压缩日志
tar
czvf
$
(
date
-
d
"yesterday"
+
"%Y%m%d"
)
_log
.
tar
.
gz
$
(
date
-
d
"yesterday"
+
"%Y%m%d_"
)
*
.
log
# 删除压缩源文件
rm
-
f
$
(
date
-
d
"yesterday"
+
"%Y%m%d_"
)
*
.
log
# 向nginx主进程发信号重新打开日志
kill
-
USR1
`
cat
$
{
pid_path
}
`
|
同样记得给这个sh脚本文件授予执行权限
1
|
chmod
+
x
/
www
/
scrpits
/
cut_logs
.
sh
|
测试发现,队列执行完了,并没有按照设计的切割和压缩,排查corntab的日志也没发现什么错误,尝试直接执行这个脚本:
1
|
/
www
/
scrpits
/
cut_logs
.
sh
|
报错:
1
|
-
bash
:
/
www
/
scrpits
/
cut_log
.
sh
:
/
bin
/
sh
^
M
:
bad
interpreter
:
No
such
file
or
directory
|
经过排查和学习,原来我的这个脚本文件是在windows环境用editplus创建并通过sftp上传到linux服务器中,会导致格式冲突:脚本文件是DOS格式的,即每一行的行尾以rn来标识, 使用vi编辑器打开脚本, 运行:
1
|
:
set
ff
?
|
可以看到DOS或UNIX的字样。 使用set ff=unix把它强制为unix格式的,然后存盘退出。 即可。还有一种方法,通过 dos2unix 命令转换格式,由于默认环境没有安装这个命令,需要下载安装:
1
|
yum
install
dos2unix
|
安装完成后,执行命令,把脚本目录所有脚本文件进行格式转化,一了百了:
1
|
dos2unix
/
www
/
scrpits
/
*
.
sh
|
经过格式转化后的sh文件,再用editplus在windows环境编辑上传,就不会有格式问题了。
CentOS Linux系统下apache日志文件设置
引言:
Apache默认安装下,日志记录只有一个文件,时间久了之后,这个文件会变的很大,管理员要想查看分析日志,光打开日志就要花费很长时间,甚至还会影响服务器运行。
下面教大家设置apache,让服务器每天单独生成一个日志文件,这样管理、分析日志会方便很多。
vi /etc/httpd/conf/httpd.conf #编辑文件
#ErrorLog logs/error_log #注释此行,添加下面这行
1
|
ErrorLog
"|rotatelogs /var/log/httpd/error_log%Y%m%d.log 86400 480"
#每天单独生成一个日志文件
|
#CustomLog logs/access_log common #注释此行,添加下面这行
CustomLog "|rotatelogs /var/log/httpd/access_log%Y%m%d.log 86400 480" common #每天单独生成一个日志文件
扩展:如果想禁止Apache日志文件,可以设置如下
1
2
|
ErrorLog
/
dev
/
null
#禁用错误日志
CustomLog
/
dev
/
null
common
#禁用访问日志
|