我使用以下方法执行log rotation
:
bash 'adding_logrotate_for_consul' do
code <<-EOH
echo "" >> /etc/logrotate.conf
echo "/tmp/output.log {" >> /etc/logrotate.conf
echo -e "\tsize 20M" >> /etc/logrotate.conf
echo -e "\tcreate 700 root root" >> /etc/logrotate.conf
echo -e "\trotate 3" >> /etc/logrotate.conf
echo "}" >> /etc/logrotate.conf
EOH
end
上面的代码运行完全正常,它在/etc/logrotate.conf
/tmp/output.log {
size 20M
create 700 root root
rotate 3
}
但是,在使用chef添加上述条目后,我必须每次在节点上手动运行以下命令:
logrotate -s /var/log/logstatus /etc/logrotate.conf
如何在厨师食谱中包含上述命令,以便在文件大小达到20M后使用厨师食谱执行日志轮换?
答案 0 :(得分:3)
我认为这里有一些事情你做得不够理想。让我一个接一个走:
我使用以下配方执行日志轮换:
bash'adding_logrotate_for_consul'做 代码......
这不是创建logrotate条目的好方法。 Chef(和其他业务流程工具)有一个非常好的功能,叫做idempotency。它的基本含义是你可以多次运行相同的配方,它只会自我收敛,或者如果需要则自己“应用”它。你将这样做的一个问题就是你每次运行cookbook时都会运行你的代码块 - 所以在5次运行之后,你将在/etc/logrotate.conf中有5个相同的条目。那不会很好......
值得庆幸的是,有更好的方法可以做你想做的事。你熟悉Chef Supermarket吗?在这个网站上,您可以找到许多预制的烹饪书,以扩展您的食谱功能。因此,对于您当前的问题,您可以使用名为logrotate的食谱。你如何在自己的食谱中使用它?您需要通过在这些文件中添加以下内容来包含它:
BERKSFILE
source 'https://supermarket.chef.io'
metadata
METADATA.RB
depends 'logrotate'
现在您的食谱了解'logrotate'食谱,您可以使用它提供的Chef资源。所以你可以创建以下食谱:
logrotate_app 'app_with_logs' do
path '/tmp/output.log'
options ['size 20M']
rotate 3
create '700 root adm'
end
现在,当您运行配方时,这将创建logrotate条目,仅当它尚不存在时。便利! (注意,这可能会在/etc/logrotate.d/中创建条目而不是/etc/logratate.conf。这是添加logrotate条目的首选方法。)
转到下一部分。
如何在厨师食谱中包含上述命令以便记录日志 可以在文件大小之后使用chef recipe执行旋转 达到了20M ??
Logrotate作为程序自动运行,每天一次。当它运行时,它将检查/etc/logrotate.conf和/etc/logrotate.d/*中的所有条目,并在它们满足要求时运行它们(在这种情况下,大小为20M)。但是,由于它每天只运行一次,这取决于您的日志增长速度,在评估和轮换时它可能远大于20M!
现在,您有两种选择。或者,其中一个,让logrotate按照预期的方式工作,并且如果在查看它时超过20M的大小,则每天旋转一次日志。或者两个,你可以做你想做的事情并在Chef配方中运行该命令,尽管这不是一个好方法。但是,为了完整起见,我将告诉您如何使用Chef运行命令。但要记住!这将再次不是幂等的。那么为什么这不是一个好方法呢!
要从Chef配方运行命令,请使用execute资源。例如:
execute 'rotate_my_log_because_I_cant_wait_24h' do
command 'logrotate -s /var/log/logstatus /etc/logrotate.conf'
end
这将在您的节点上运行该命令。但同样,这不是推荐的做法。