linux推荐使用logrotate自动管理日志文件

最近发现在ubuntu或centos下使用logrotate管理分割nginx日志很方便,再也不用自己写shell了。

一般系统都自带了,如果没有就安装个,容易简单。

yum install logrotate
apt-get install logrotate

命令参数说明

# logrotate --help
Usage: logrotate [OPTION...] 
 -d, --debug 调试模式,输出调试结果,并不执行。隐式-v参数
 -f, --force 强制模式,对所有相关文件进行rotate
 -m, --mail=command 发送邮件 (instead of `/bin/mail')
 -s, --state=statefile 状态文件,对于运行在不同用户情况下有用
 -v, --verbose 显示debug信息

配置选项说明

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:在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
sharedscripts:所有的日志文件都轮转完毕后统一执行一次脚本
daily:指定转储周期为每天
weekly:指定转储周期为每周
monthly:指定转储周期为每月
dateext在文件末尾添加当前日期 
rotate count:指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
size size:当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB

Q&A

1.如何测试logrotate程序执行的情况

答:/usr/sbin/logrotate -d /etc/logrotate.d/nginx

2.怎么查看log文件的具体执行情况

答:cat /var/lib/logrotate/status

3.使用-v或-d参数时,显示log does not need rotating

答:logrotate在对status未记录的文件进行转储时,会在status添加一条该文件的记录,并将操作时间设为当天。之后程序再次对此文件进行转储时发现这个文件今天已经操作过,就不再进行相关操作。

解决方法:
1. vi /var/lib/logrotate/status  更改相对应的文件操作日期
2. 使用-s指定状态文件

4.分割日志时报错:error: skipping “/var/log/nginx/test.access.log” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.

答:添加“su root list”到/etc/logrotate.d/nginx文件中即可

如下;ubuntu才有可能需要指定su root www,centos不用。

/data/logs/nginx/*.log {
 su root www
 daily
 rotate 21
 missingok
 dateext
 compress
 notifempty
 sharedscripts
 postrotate
  [ -e /data/logs/nginx/nginx.pid ] && kill -USR1 `cat /data/logs/nginx/nginx.pid`
 endscript
}

logrotate配置文件一般在:

/etc/logrotate.conf 通用配置文件,可以定义全局默认使用的选项。
/etc/logrotate.d/xxx 自定义服务配置文件

默认的logrotate被加入cron的/etc/cron.daily中作为每日任务执行。
如果有打开cron定时日志,查看的日志即可

# grep logrotate /var/log/cron
发表在 服务器 | 标签为 , , , | 留下评论

svn代码库重定位relocate更换服务器

今天因为更换svn代码库服务器所以本地和远程相关的地方都需要重新定位。

svn重定位操作可能的原因:

a)服务器的计算机名称修改,IP地址已更改

b) 协议已更改(比如从svn http: https:等切换)

c) 版本库在服务器的路径更改

进入版本库目录执行:svn info 查看相关信息

执行以下代码更换:第一个参数原地址,第二个参数新地址

svn switch --relocate http://192.168.0.1/svn http://192.168.0.2/svn

windows下的TortoiseSVN更新地址:右键点击版本库,选择Relocate,弹出窗口更换即可。

发表在 服务器 | 标签为 | 留下评论

AJax如何提交数据数组?

今天原先我是用form表单直接提交php数据。内容如下:

<form action="my/feedback-create" class="form-wrap" method="post" id="Feedback">
      <textarea name="Feedback[content]" class="fb-lang" id="content" placeholder="请输入您反馈的内容" maxlength="150"></textarea>
   <input type="button" class="btn-sub" value="提交">
</form>

php接受后就是个多维数组,可是项目需求不能通过post直接跳转地址,需要通过ajax来提交,查询后使用jquery提交data可以把表单序列化转换即可。

var data = $('#Feedback').serialize();
发表在 服务器 | 标签为 | 留下评论

yii2出现您提交的数据无法被验证。

今天在前端在写提交的时候没有使用ActiveForm生成表单,直接用html写。

刚开始使用ge提交就没问题,接着改成post就出现:您提交的数据无法被验证。

发现是因为打开了csrf验证,而表单里面又没有了csrfToken导致。

在form之间加入

<input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken() ?>">

发现还出现同样的错误,后来发现因为使用yii2配置里面设置了参数名。

'components' => [
   'request' => [
      'csrfParam' => '_csrf-m',
   ],
]

所以只要把name修改成name=”_csrf-m”,再次提交没出错了。

发表在 服务器 | 标签为 , | 留下评论

vim突然无法操作没响应了

今天在linux虚拟机上操作vim,不知道按了什么突然命令行窗口对键盘没有任何相应。

查了半天应该是我不小心切换命令模式的时候按了不该按的组合键;

解决办法: CTRL+S表示停止向终端停止输出; CTRL+Q恢复向终端输出流.

发表在 服务器 | 标签为 , | 留下评论

yii2自带ViewAction视图类渲染静态页面

yii2如果需要渲染一个静态页面提交框架效率可以使用ViewAction类。

这里主要说说它几个参数:

viewPrefix//默认会到对应控制器下视图目录下的pages目录寻找,如果设置为false只会到控制器视图目录下寻到。

viewParam//视图参数名默认为view,可以设置。

defaultView//如果viewParam视图文件名参数没有传送,默认使用defaultView变量参数查询,可以设置。

它会根据用户的设置调用这个action来显示相应的视图文件。 首先在控制器里面的actions里面

<?php
class SiteController extends Controller
{
    public function actions()
    {
        return [
            'static' => [
                'class' => '\yii\web\ViewAction',
                'viewPrefix' => false,
                'viewParam' => 'view',
                'defaultView' => 'index'
            ],
        ];
    }
}
?>

在@app/views/site/pages/目录中创建index.php

<h1>Hello, I am a static page!</h1>

现在可以通过/index.php?r=site/static来访问 默认情况下是通过GET参数中的view变量来显示相应的静态文件的。

如果URL为/index.php?r=site/static?&view=about那么将会显示@app/views/site/pages/about.php静态文件。

静态文件默认按照如下顺序来显示 获取GET参数:view 如果没有指定view参数,将使用默认的index.php静态文件。

在静态文件的目录中查找相应的文件(viewPrefix):pages为目录 使用相应的布局文件。

发表在 服务器 | 标签为 | 留下评论

进入Docker容器attach和exec方式区别

attach 与 exec 主要区别如下:

  1. attach 直接进入容器 启动命令 的终端,不会启动新的进程。
  2. exec 则是在容器中打开新的终端,并且可以启动新的进程。
  3. 如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。
发表在 服务器 | 标签为 | 留下评论

Docker镜像ubuntu安装ssh报错的解决方案

dockerubuntu镜像下安装ssh协议的时候执行安装ssh-client或ssh-server命令的时候出错。

 apt-get install openssh-client
 apt-get install openssh-server

openssh-server : Depends: openssh-client (= 1:5.9p1-5ubuntu1) but 1:5.9p1-5ubuntu1.1 is to be installed
直接提取版本运行一下命令尝试安装:

user@ken:~$sudo apt-get install openssh-client=1:5.9p1-5ubuntu1

发表在 服务器 | 标签为 , | 留下评论

Docker默认ubuntu镜像:bash: vi: command not found

docker纯净ubuntu镜像里面是没有vi命令的,敲vi命令时提示说:vi: command not found。

这时候可以安装vim替换。

这时候需要敲:apt-get update,这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。

等更新完毕以后再敲命令:apt-get install -y vim命令即可。

如果下载速度异常慢而且可能中端,可以配置下国内镜像源,因为还没有vi编辑功能,只能使用echo命令导入文件。

mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.163.com/ubuntu/ wily main restricted universe multiverse" >/etc/apt/sources.list
echo "deb http://mirrors.163.com/ubuntu/ wily-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.163.com/ubuntu/ wily-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ wily main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ wily-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ wily-updates main restricted universe multiverse" >>/etc/apt/sources.list

其中wily版本根据系统修改,查看Ubuntu使用apt-get更新慢解决方法修改镜像

更新安装源

apt-get update

再执行:apt-get install -y vim安装

发表在 服务器 | 留下评论

Ubuntu使用apt-get更新慢解决方法修改镜像

因为默认使用外国镜像地址的原因,所以国内使用很多时候会感觉缓慢,更换下镜像地址即可。

1、原文件备份

cp /etc/apt/sources.list /etc/apt/sources.list.bak

2、编辑源列表文件

vim /etc/apt/sources.list

3、将原来的列表删除,添加如下内容 这里使用网易镜像地址为例,其它自己网上搜索下。

deb http://mirrors.163.com/ubuntu/ Codename main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ Codename-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ Codename-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ Codename-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ Codename-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ Codename main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ Codename-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ Codename-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ Codename-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ Codename-backports main restricted universe multiverse

以上的配置中,表明版本的就是关键字“Codename”,这是Ubuntu表示版本的一种形式(Ubuntu称其为Codename),它即对应了一个发行版。版本号和Codename的对应关系如下表。这里只需要将上面的Codename字符串替换为下文中具体的Codename即可。

版本 别名(codename) 发布日期
4.10 Warty Warthog(长疣的疣猪) 2004年10月20日
5.04 Hoary Hedgehog(灰白的刺猬) 2005年4月8日
5.10 Breezy Badger(活泼的獾) 2005年10月13日
6.06 Dapper Drake(整洁的公鸭) 2006年6月1日(LTS)
6.10 Edgy Eft(急躁的水蜥) 2006年10月6日
7.04 Feisty Fawn(坏脾气的小鹿) 2007年4月19日
7.10 Gutsy Gibbon(勇敢的长臂猿) 2007年10月18日
8.04 Hardy Heron(耐寒的苍鹭) 2008年4月24日(LTS)
8.10 Intrepid Ibex (勇敢的野山羊) 2008年10月30日
9.04 Jaunty Jackalope(得意洋洋的怀俄明野兔) 2009年4月23日
9.10 Karmic Koala(幸运的考拉) 2009年10月29日
10.04 Lucid Lynx(清醒的猞猁) 2010年4月29日
11.10 Oneiric Ocelot(梦幻的豹猫) 2010年10月13日
11.04 Natty Narwhal(敏捷的独角鲸) 2011年4月28日
12.04 Precise Pangolin(精准的穿山甲) 2012年的4月26日(LTS)
12.10 Quantal Quetzal(量子的绿咬鹃) 2012年的10月20日
13.04 Raring Ringtail(铆足了劲的猫熊) 2013年4月25日
13.10 Saucy Salamander(活泼的蝾螈) 2013年10月17日
14.04 Trusty Tahr (可靠的塔尔羊) 2014年4月18日 (LTS)
14.10 Utopic Unicorn(乌托邦独角兽) 2014年10月23日
15.04 Vivid Vervet (活泼的小猴) 2015年4月
15.10 Wily Werewolf (狡猾的狼人) 2015年10月
16.04 Xenial Xerus (好客的非洲地松鼠) 2016年4月 (LTS)
16.10 Yakkety Yak(牦牛) 2016年10月
17.04 Zesty Zapus(开心的跳鼠) 2017年4月
17.10 Artful Aardvark(机灵的土豚) 2017年10月
18.04 Bionic Beaver(仿生海狸) 即将发布2018年4月(LTS)

如何检查当前版本codename

可以使用如下命令:
root@virtual-machine:/# lsb_release -a
 No LSB modules are available.
 Distributor ID: Ubuntu
 Description: Ubuntu 16.04.1 LTS
 Release: 16.04
 Codename: xenial

4、运行sudo apt-get update

附带163镜像说明:http://mirrors.163.com/.help/ubuntu.html

发表在 服务器 | 标签为 | 留下评论