我正在使用一个系统,我想使用dateext
logrotate 函数(或其他方式)在日志文件旋转时添加日期。但是在这个系统中,重要的是不要丢失任何日志,并且 dateext 将覆盖任何现有文件(如果一天调用两次 logrotate,就会发生这种情况)。
有没有可靠的方法可以防止 dateext 覆盖现有文件,而是创建另一个文件?可以接受的情况是,不发生轮换或创建的文件名称不太可预测(日期带有额外的数字,或时间等)。
答案1
dateext
支持%s
格式说明符 - 以秒为单位的 Unix 纪元时间。
如果将日期格式设置为.%Y-%m-%d.%s
,它将看起来像这样:
logfilename.2012-12-11.13572638495
这个数字每秒都在变化,因此两个相同文件的概率是非常偏僻的。
答案2
您可以使用 prerotate/endscript 来确保没有与您要使用的名称相同的文件,但如果您担心在任何奇怪的时间发生轮换,这可能会很棘手。最糟糕的情况是,您同时运行同一个文件的两个轮换(第二个在第一个完成之前开始),如果两者都确定没有名称冲突,那么一个将覆盖另一个。
一种更简单的方法是更改旋转文件名以包含更准确的日期,例如在时间戳中包含纳秒。这应该使名称发生冲突的可能性很小。如果您想确保没有名称冲突,请使用 mktemp,但这样您将得到“丑陋”的名称。这种名称更改的逻辑应该转到 logrotate 配置的 prerotate|postrotate/endscript 部分。