apache logs rotate to s3

使用s3cmd
http://www.dowdandassociates.com/blog/content/howto-install-aws-cli-amazon-simple-storage-service-s3-s3cmd/

http://www.dowdandassociates.com/blog/content/howto-rotate-logs-to-s3/

https://www.lustforge.com/2012/07/15/logrotate-apache-logs-to-amazon-s3/

s3cmd:http://s3tools.org/
s3cmd  使用说明:
http://s3tools.org/s3cmd-howto

aws ec2(ami)下安装s3cmd
git clone https://github.com/s3tools/s3cmd.git
cd s3cmd
sudo python setup.py install

ubuntu 下安装s3cmd
sudo apt-get install s3cmd

http://tecadmin.net/install-s3cmd-manage-amazon-s3-buckets/


配置
s3cmd --configure

新建bucket
s3cmd mb s3://logix.cz-test

列出所有bucket
s3cmd ls

列出某个bucket的内容
s3cmd ls s3://logix.cz-test

上传文件到bucket
s3cmd put addressbook.xml s3://logix.cz-test/addrbook.xml

下载文件到本地
s3cmd get s3://logix.cz-test/addrbook.xml addressbook-2.xml

删除bucket(只能删除空的bucket,有文件删除不了)
s3cmd rb s3://logix.cz-test

删除文件
s3cmd del s3://logix.cz-test/addrbook.xml s3://logix.cz-test/storage.jpg

同步文件到S3
http://s3tools.org/s3cmd-sync
将httpd目录下的文件都同步到s3
s3cmd sync /var/log/httpd/* s3://your_bucket_name/httpd/

------------------------------
下面是logrotate的介绍
logrotate

http://huoding.com/2013/04/21/246
http://www.codeceo.com/article/linux-logrotate-usage.html
http://www.linuxcommand.org/man_pages/logrotate8.html

logrotate 的配置文件是 /etc/logrotate.conf  主要参数如下表:

   参数                         功能
   compress                     通过gzip 压缩转储以后的日志
   nocompress                   不需要压缩时,用这个参数
   copytruncate                 用于还在打开中的日志文件,把当前日志备份并截断
   nocopytruncate               备份日志文件但是不截断
   create mode owner group      转储文件,使用指定的文件模式创建新的日志文件
   nocreate                     不建立新的日志文件
   delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
   nodelaycompress              覆盖 delaycompress 选项,转储同时压缩。
   errors address               专储时的错误信息发送到指定的Email 地址
   ifempty                      即使是空文件也转储,这个是 logrotate 的缺省选项。
   notifempty                   如果是空文件的话,不转储
   mail address                 把转储的日志文件发送到指定的E-mail 地址
   nomail                       转储时不发送日志文件
   olddir directory             转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
   noolddir                     转储后的日志文件和当前日志文件放在同一个目录下
   prerotate/endscript          在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
   postrotate/endscript         在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
   daily                        指定转储周期为每天
   weekly                       指定转储周期为每周
   monthly                      指定转储周期为每月
   rotate count                 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
   tabootext [+] list           让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
   size size                    当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).

如果要同步自定义路径下的log文件,可以自己在/etc/logrotate.d/目录下新建一个文件,输入内容,postrotate的同步脚本也可以放在sh文件中

/home/web/message_center/log/* {
        hourly
        su www-data
        missingok
        rotate 5
        nocompress
        notifempty
        size 1k
        sharedscripts
        postrotate
               /home/web/message_center/sync.sh
        endscript
}




手动执行logrotate

sudo logrotate -f  /etc/logrotate.d/httpd (如果带了-d是模拟演示。不会实际执行)
参考:
http://zylhz.com/?p=120

手动执行logrotate
  logrotate可以在任何时候从命令行手动调用。

  要调用为/etc/lograte.d/下配置的所有日志调用logrotate:

# logrotate /etc/logrotate.conf

  要为某个特定的配置调用logrotate:

# logrotate /etc/logrotate.d/nginx-access

预先执行logrotate
   排错过程中的最佳选择是使用‘-d’选项以预演方式运行logrotate。要进行验证,不用实际轮循任何日志文件,可以模拟演练日志轮循并显示其输出。

# logrotate -d /etc/logrotate.d/nginx-access

强制执行logrotate
   即使轮循条件没有满足,我们也可以通过使用‘-f’选项来强制logrotate轮循日志文件,‘-v’参数提供了详细的输出。

# logrotate -vf /etc/logrotate.d/nginx-access

Logrotate日志信息
   logrotate自身的日志通常存放于/var/lib/logrotate/status目录。如果处于排障目的,我们想要logrotate记录到任何指定的文件,我们可以指定像下面这样从命令行指定。

# logrotate –s /var/log/logrotate-status -vf /etc/logrotate.d/nginx-access




cron 说明
http://cering.github.io/2015/11/02/%E8%BD%AC-Linux%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1crontab-cron-d%E4%BB%8B%E7%BB%8D/

发现cron 有执行,但是sync没成功, 通过查看系统email,
sudo cat /var/spool/mail/root
发现了问题所在,/bin/sh: /home/log/s3.log: No such file or directory
不存在这个文件。怎么会抛出这个文件呢?原来是在crontab中设置了输入日志路径是/home/log/s3.log。手动创建这个路径和文件,并赋予权限。

再次执行,出了这个/bin/sh: /home/s3_sync_httpd.sh: Permission denied 错误,给它权限。再次执行
ERROR: /root/.s3cfg: None
ERROR: Configuration file not available.
ERROR: Consider using --configure parameter to create one.

出了这个错误。手动执行sh /home/s3_sync_httpd.sh是正常同步的。而在crontab中有这个问题。

在做s3cmd --configure 的时候,生成了一个配置文件/home/ec2-user/.s3cfg

New settings:
  Access Key: xxx
  Secret Key: xxx
  Default Region: us-west-2
  Encryption password: nmg
  Path to GPG program: /usr/bin/gpg
  Use HTTPS protocol: True
  HTTP Proxy server name:
  HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] Y
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)

Now verifying that encryption works...
Success. Encryption and decryption worked fine :-)

Save settings? [y/N] Y
Configuration saved to '/home/ec2-user/.s3cfg'

用ls /home/ec2-user .* -l 可以列出隐藏文件。这个配置文件应该是在/home/ec2-user 下而不是在/root/下。因此。我们在sh文件中要指定运行的默认路径
#!/bin/bash
/usr/local/bin/s3cmd sync /var/log/httpd/* s3://xxx/s3_httpd/

在重启下service crond restart

终于成功了。正常上传,上传日志也输出到/home/log/s3.log 了

----------------
message center 不适用logrotate的几点说明:
1 logrotate会将log文件截断并重命名到old log路径下,若这样做的话,message center不会再重新生成log文件,导致log丢失
2 不會迭代處理子文件夾的log

s3cmd同步文件夹不需要自己处理文件是否更新的问题。s3cmd本身支持如果文件更新了才上传的判断。但是不要直接写某个文件名称。例如
/usr/local/bin/s3cmd sync ${sync_file_path} s3://${bucket_name}/xxx/${ip}/a.log >> ./sync_log.log


在旧的s3cmd版本(s3cmd version 1.1.0-beta3)中有无写a.log的效果是一样的,都会判断文件是否更新过。(通过size判断)
但是在新版本(s3cmd version 1.6.1)如果带了a.log则不论文件有无更新,一定会上传的。如果没有带a.log,则会判断是否更新(可以设置通过md5判断是否更新,当然速度会慢了),更新了才会上传

s3cmd 命令行参数说明:
http://s3tools.org/usage

猜你喜欢

转载自lhdst-163-com.iteye.com/blog/2319721