抱歉,你查看的文章不存在

在Linux VPS上配置日志自动按日分割压缩处理

从风云主机跑路之后,就一直在折腾VPS,虽然我没有什么重要的站,只有一个很久没更新也没什么流量的小博客,但是这个小博客不管怎么说也是从2005年(实际是2004年)就一直坚持下来的“成果”,记录了我在编程、前端上学习和成长的点滴,无论如何我还是要让它坚持在这个网络里存在下去的。

风云主机跑路之后,我痛定思痛,虽然还是选择的国人VPS,但一口气买了几家的,然后多台VPS之间,文件实时同步,MySQL主主同步(这个貌似有网友感兴趣,QQ上反复咨询,回头我再写一篇),这样即使某一家跑路了,我也不用手忙脚乱了,而且还保证了一台VPS宕机时博客的访问不受影响(感谢DNSPod的A记录负载均衡)。

以前很不重视webserver的日志分析,这次配置lnmp环境后,nginx和apache的日志都启用了,为了避免日志文件过大,又利用cron和logrotate实现了日志的每日截断备份和自动清理。网上教程很多,但是参考中还是走了少量弯路(MySQL主主同步也如此),所以还是把自己的步骤记录一下,以备日后参照:

一、指定log路径

我希望nginx、apache、php的日志都一起处理,不想分开单独搞,所以就把所有的log都统一存放到同一个地方,统一用.log后缀。

首先是nginx,在nginx.conf中指定全局的error_log路径:

error_log  /home/wwwlogs/nginx_error.log  crit;

然后在每个虚拟主机的配置文件中指定access_log路径,一样的:

access_log  /home/wwwlogs/ofcss-access.log  ofcss-www;

然后是apache,也是分别指定,在httpd.conf中指定全局的log路径:

ErrorLog "/home/wwwlogs/httpd-error.log"
CustomLog "/home/wwwlogs/httpd-access.log" combinedio

然后在每个虚拟主机的配置文件中单独指定

ErrorLog "/home/wwwlogs/ofcss-error.log"
CustomLog "/home/wwwlogs/ofcss-access.log" combined

最后是php的错误日志,在php.ini中指定

error_log = /home/wwwlogs/php_errors.log

基本上,要点有两条:

  • 所有的log文件都指定到同一个位置存放(我这里就是/home/wwwlogs/
  • 所有的log文件都统一后缀(我这里就是.log

二、配置logrotate

logrotate是linux系统自带的日志转储工具,有默认而好用的工具,我一般就不会考虑单独装个软件来实现了,毕竟VPS的资源能省则省嘛。

logrotate的配置文件一般是在/etc/logrotate.conf文件里,但是它默认包含了/etc/logrotate.d/目录下的其它配置文件,所以我把我的配置文件放在/etc/logrotate.d/weblog里:

/home/wwwlogs/*.log
    {
        nocompress
        daily
        copytruncate
        create
        ifempty
        olddir /home/wwwlogs/days
        rotate 5
    }

按照之前指定的路径,这个配置就指定了对/home/wwwlogs/目录下的所有**.log*都做相同处理。

三、编写定时脚本

logrotate的配置文件只是指定了每日执行转储、不压缩、转储路径等选项,但是要按日期命名、压缩、删除旧文件等,还需要写个定时脚本来实现。代码如下(假定文件为/usr/local/sbin/logrotate-weblog.sh):

#!/bin/bash
    #创建转储日志压缩存放目录
    mkdir -p /home/wwwlogs/days
    #手工对nginx日志进行切割转换
    /usr/sbin/logrotate -vf /etc/logrotate.d/weblog
    #当前时间
    time=$(date -d "yesterday" +"%Y-%m-%d")
    #进入转储日志存放目录
    cd /home/wwwlogs/days
    #对目录中的转储日志文件的文件名进行统一转换
    for i in $(ls ./ | grep "^\(.*\)\.[[:digit:]]$")
    do
    mv ${i} ./$(echo ${i}|sed -n 's/^\(.*\)\.\([[:digit:]]\)$/\1/p')-$(echo $time)
    done
    #对转储的日志文件进行压缩存放,并删除原有转储的日志文件,只保存压缩后的日志文件。以节约存储空间
    for i in $(ls ./ | grep "^\(.*\)\-\([[:digit:]-]\+\)$")
    do
    tar jcvf ${i}.bz2 ./${i}
    rm -rf ./${i}
    done
    #只保留最近7天的压缩转储日志文件
    find /home/wwwlogs/days/* -name "*.bz2" -mtime 7 -type f -exec rm -rf {} \;

四、制定cron计划定时执行这个脚本

这个很简单了,crontab -e然后输入并保存即可:

#logrotate-weblog
    0 2 \* * *| /usr/local/sbin/logrotate-weblog.sh > /dev/null 2>&1

要定时执行任务,必须确保crond服务是自动运行的:

chkconfig crond on

以上只是基于我自己的VPS所做的配置,中间的代码注释未必细致和准确,如果需要进一步了解的话,可以自行google,教程很多。其它发行版的操作也差不多。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

小李刀刀的专栏

52 篇文章39 人订阅

相关文章

来自专栏安恒网络空间安全讲武堂

【翻译】t-pot 16.10-多蜜罐平台

t-pot 16.10-多蜜罐平台 2016年10月31日,德国电信公司Honeypot项目 在2016年3月,我们发布了T-Pot 16.03,积极的反馈鼓励...

51110
来自专栏IMWeb前端团队

教你开发whistle插件

whistle介绍 whistle是一款用Node实现的跨平台的Web调试代理工具,支持查看修改http(s)、Websocket连接的请求和响应内容。IMWE...

2820
来自专栏蓝天

cron 的配置和说明

作者:北南南北 来自:LinuxSir.Org 摘要:Linux操作系统中,计划任务通常由cron来承担,了解或掌握cron,能为我们管理服务器带来更多的便利,...

1152
来自专栏编程坑太多

『高级篇』docker之kubernetes基础集群部署(下)(34)

kube-scheduler负责分配调度Pod到集群内的节点上,它监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分...

1414
来自专栏JadePeng的技术博客

Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目

前文使用Docker搭建Jenkins+Docker持续集成环境我们已经搭建了基于docker+jenkins的持续集成环境,并构建了基于maven的项目。这一...

6617

Jelastic专用存储容器指南

在我们以前的文章中,我们已经开始揭示数据存储容器主要的可能性,这有助于改善你的项目文件系统的结构。我们还介绍了Jelastic中存储的5种类型的数据,现在我们将...

2026
来自专栏颇忒脱的技术博客

使用Kubespray安装k8s集群

本文撰写时,Kubespray的master分支不稳定,请使用release版本来安装,具体来说就是切换到最新的tag上。

4473
来自专栏Java后端技术

Python学习的路上,Anaconda送你一双遮天神翼

​  最近在学习python,发现在本地搭建python环境的时候,要是想要同时搭建不同python版本的环境,就比较麻烦,很容易就出现冲突了,很是头疼。然后光...

1012
来自专栏程序猿

在 VMware workstation 安装 CentOS 虚拟机

上一篇介绍了怎么安装 VMware workstation Pro,安装完肯定是要装虚拟机啊,下面就来介绍一下怎么安装 CentOS 7.

3136
来自专栏陈本布衣

布衣之路(二):虚拟机的文件共享和网络模式

除夕之夜,当别的大神都在和家人一起辞旧岁,迎新年的时候,博主这样的小喽啰不敢懈怠,想着一年之计,当早做谋划,趁着别人嗨的时间,笔耕不辍的写篇日志,以此颇觉有意...

3287

扫码关注云+社区

领取腾讯云代金券