包含时间戳的文件名的首选格式

正如我们都知道“unix”除了“/”和“\ 0”之外可以有任何文件,系统pipe理员往往会有一个更小的偏好,主要是由于没有任何喜欢空间作为input…和一堆事情对“:”和“@”等特殊含义。

最近我又看到了另外一个例子,在一个文件名中使用了一个时间戳,在用不同的格式播放了一些后使它“更好”,我想我会试图find一个“最佳实践”,而不是看到一个我只是问在这里,看看人们的想法。

可能的“常见”解决scheme(p =前缀和s =后缀):

  1. syslog / logrotate / DNS格式如下:

    p-%Y%m%d-suffix = prefix-20110719-s p-%Y%m%d%H%M-suffix = prefix-201107191732-s p-%Y%m%d%H%M%S-suffix = prefix-20110719173216-s 

    优点:

    • 这是“共同的”,所以“够好”可能比“最好”更好。
    • 没有怪异的字符。
    • 容易区分“date/时间一滴”与其他一切。

    缺点:

    • 只有date的版本是不容易阅读,包括时间,使我的眼睛stream血,秒也是“大声笑”。
    • 假设TZ。
  2. ISO-8601格式

     p-%Y-%m-%ds = p-2011-07-19-s p-%Y-%m-%dT%H:%M%zs = p-2011-07-19T17:32-0400-s p-%Y-%m-%dT%H:%M:%S%zs = p-2011-07-19T17:32:16-0400-s p-%Y-%m-%dT%H:%M:%S%zs = p-2011-07-19T23:32:16+0200-s 

    优点:

    • 没有空间。
    • 考虑TZ。
    • 人类阅读是否“不错”(只有date是好的)。
    • 可以由$(date –iso = {hours,minutes,seconds})生成

    缺点:

    • SCP /焦油/等。 不会喜欢那些':'字符。
    • 需要一些“正常”的人看到“T”的WTF,最后是什么:)。
    • 很多' – '字符。
  3. rfc-3339格式

     p-%Y-%m-%ds = p-2011-07-19-s p-%Y-%m-%d %H:%M%:zs = p-2011-07-19 17:32-04:00-s p-%Y-%m-%d %H:%M:%S%:zs = p-2011-07-19 17:32:16-04:00-s p-%Y-%m-%d %H:%M:%S%:zs = p-2011-07-19 23:32:16+02:00-s 

    优点:

    • 考虑TZ。
    • 可以很容易地被“全人类”读取。
    • 可以从前缀/后缀中区分date/时间。
    • 上面的一些可以用$(date –iso = {hours,seconds})生成

    缺点:

    • 在时间版本中有空格(这意味着所有的代码都会讨厌它)。
    • SCP /焦油/等。 不会喜欢那些':'字符。
  4. 我喜欢连字符:

     p-%Y-%m-%ds = p-2011-07-19-s p-%Y-%m-%d-%H-%Ms = p-2011-07-19-17-32-s p-%Y-%m-%d-%H-%M-%Ss = p-2011-07-19-23-32-16-s 

    优点:

    • 基本上是一个更好的系统日志/等。 变种。

    缺点:

    • 很多' – '字符。
    • 假设TZ。
  5. 我喜欢连字符,扩展名是:

     p.%Y-%m-%ds = p.2011-07-19.s p.%Y-%m-%d.%H-%Ms = p.2011-07-19.17-32.s p.%Y-%m-%d.%H-%M-%Ss = p.2011-07-19.23-32-16.s 

    优点:

    • 基本上是一个更好的“我爱连字符”变体。
    • 没有怪异的字符。
    • 可以从前缀/后缀中区分出date/时间。

    缺点:

    • 使用'。' 这里有点不太传统。
    • 假设TZ。

…所以任何人都想给一个偏好和一个理由,或者不止一个(例如,如果95%的机器呆在机器本地,不关心TZ,但是如果不是的话,可以多花点心思)。

或者,显然,不在上面的列表中。

  1. 应尽可能遵守ISO 8601格式,因为它是最接近标准的东西。
  2. “T”还不足以成为一个绊脚石,真正值得去掉它。
  3. 这个':'是潜在的杀手,所以应该避免。
  4. 由于他人答案中提到的原因,应使用UTC(或“Z”时间)。
  5. ISO 8601包含使用UTC('Z'时间)的格式,应该使用。
  6. ISO 8601包含一个不使用“:”字符的格式,应该使用该字符。

所以…样本“最好”的date格式:

  1. 20120317T1748Z

    • 100%符合ISO 8601
    • 只有字母数字字符(非常适合系统pipe理员)
    • 不是最快的阅读,但肯定是外行可读的
  2. 2012-03-17T1748Z

    • date部分符合ISO 8601
    • 时间部分符合ISO 8601
    • date和时间之间的转换符合ISO 8601
    • 将ISO 8601'扩展'格式(带有连字符的date,带冒号的时间)与ISO 8601'基本'格式(date无连字符,无冒号的时间)混合在一起,这可能不太正确
    • 增加“ – ”字符(vs 1.)
    • 外行人阅读起来更容易一点(vs 1)
  3. 2012-03-17–1748Z

    • date部分符合ISO 8601
    • 时间部分符合ISO 8601
    • date和时间之间的转换不符合ISO 8601
    • 将ISO 8601'扩展'格式与ISO 8601'基本'格式混合
    • 外行人阅读起来要容易一些(对比1和2)
    • 没有新的字符(vs 2)

我偏向于1,因为它完全符合IAW的标准,但其他的则接近。

注::当然,根据需要添加秒。 …是的,有或没有秒(甚至分钟)是所有IAW ISO 8601。:)

我不会包括一个时区,只能使用世界时间。 如果可能有混淆,可以添加-UTC后缀。 如果你指定一个时区,有人可能会依赖它。 并且会出现奇怪的边缘情况,其中DST更改或DST偏移对某些处理造成严重破坏,或者某些系统上的处理不同,因为它们的DSTconfiguration不是最新的。 UTC在任何地方都一样。

我认为连字符使文件名更具可读性,因为它使得更容易辨别文件数据的date时间。 如果你想包括亚秒精度,通常是.nnnnn。

我个人不喜欢T.在文件名中使用冒号可能会影响与其他文件系统的互操作性。

  1. 我也不包括时区。 处理日志的脚本/工具应该知道这一点。 另外就夏季/冬季时间的变化而言,我build议您始终将您的服务器始终固定在UTC。 基本服务器时区与在其上运行的数据库的(不变)时区之间的突然差异可能会导致头痛;-)。

  2. 关于日志文件命名 – 我知道,许多人不喜欢它,但我想保持简单:

p-%s-type.log = p-1311116459-type.log

优点:

  • 公分母
  • 非常容易在进一步的脚本中使用

缺点:

  • 不是人类可读的

在同事(无论什么原因)需要手动检查日志的机器上,我select了每天轮换的这个变体:

p-%Y-%m-%d-type.log = p-2011-07-20-type.log

最好的祝福