Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 设置日志文件的最大行数_Linux_Bash_Sed - Fatal编程技术网

Linux 设置日志文件的最大行数

Linux 设置日志文件的最大行数,linux,bash,sed,Linux,Bash,Sed,目前,我编写了一个简单的记录器来记录来自bash脚本的消息。记录器工作正常,我只需在日志文件中写入日期和消息。由于日志文件将增加,我想将记录器的限制设置为例如1000行。达到1000行后,不会删除或完全清除日志文件。它应该截断第一行并用新的日志行替换它。因此,该文件保留1000行,不会进一步增加。最新一行应始终位于文件的顶部。有内置的方法吗?或者我如何解决这个问题?您选择的示例可能不是最好的。正如评论已经指出的那样,logrotate是阻止日志文件大小的最佳工具;此外,直线不是测量尺寸的最佳单位

目前,我编写了一个简单的记录器来记录来自bash脚本的消息。记录器工作正常,我只需在日志文件中写入日期和消息。由于日志文件将增加,我想将记录器的限制设置为例如1000行。达到1000行后,不会删除或完全清除日志文件。它应该截断第一行并用新的日志行替换它。因此,该文件保留1000行,不会进一步增加。最新一行应始终位于文件的顶部。有内置的方法吗?或者我如何解决这个问题?

您选择的示例可能不是最好的。正如评论已经指出的那样,
logrotate
是阻止日志文件大小的最佳工具;此外,直线不是测量尺寸的最佳单位。这些评论都是对的

然而,我从表面上看你的问题并回答它

您可以通过shell内置实现所需的功能,但使用外部工具(如
sed
)会更快、更简单。(
awk
是另一个选项,但它缺少
-i
开关,在这种情况下简化了您的生活。)

因此,假设您的文件已经存在并且名为
script.log
,那么

maxlines=1000
log_msg='Whatever the log message is'

sed -i -e1i"\\$log_msg" -e$((maxlines))',$d' script.log
做你想做的事

  • -i
    表示在适当位置修改给定文件
  • -e1i“\\$log\u msg”
    表示在第一(1)行之前插入
    $log\u msg
  • -e$((maxlines)),$d'
    表示从行号
    $((maxlines))
    删除到最后一行($)

    • 您选择的示例可能不是最好的。正如评论已经指出的那样,
      logrotate
      是阻止日志文件大小的最佳工具;此外,直线不是测量尺寸的最佳单位。这些评论都是对的

      然而,我从表面上看你的问题并回答它

      您可以通过shell内置实现所需的功能,但使用外部工具(如
      sed
      )会更快、更简单。(
      awk
      是另一个选项,但它缺少
      -i
      开关,在这种情况下简化了您的生活。)

      因此,假设您的文件已经存在并且名为
      script.log
      ,那么

      maxlines=1000
      log_msg='Whatever the log message is'
      
      sed -i -e1i"\\$log_msg" -e$((maxlines))',$d' script.log
      
      做你想做的事

      • -i
        表示在适当位置修改给定文件
      • -e1i“\\$log\u msg”
        表示在第一(1)行之前插入
        $log\u msg
      • -e$((maxlines)),$d'
        表示从行号
        $((maxlines))
        删除到最后一行($)

      为什么要用新消息替换第一行,从而导致日志文件中消息的顺序跳转,而不是仅仅删除第一行并附加新消息,例如,简单地说:

      log() {
          tail -999 logfile > tmp &&
          { cat tmp && printf '%s\n' "$*"; } > logfile
      }
      
      log "new message"
      
      如果日志文件总是小行,甚至不需要tmp文件,只需将尾部的输出保存在一个变量中并打印出来即可


      请注意,与
      sed-i
      解决方案不同,上述内容不会更改
      logfile
      的inode、硬链接、权限或任何其他内容-它与刚开始更新的内容相同,它不会被新文件替换。

      为什么要用新消息替换第一行,从而导致日志文件中消息的顺序跳转,而不是只删除第一行并附加新消息,例如:

      log() {
          tail -999 logfile > tmp &&
          { cat tmp && printf '%s\n' "$*"; } > logfile
      }
      
      log "new message"
      
      如果日志文件总是小行,甚至不需要tmp文件,只需将尾部的输出保存在一个变量中并打印出来即可


      请注意,与
      sed-i
      解决方案不同,上述内容不会更改
      logfile
      的inode、硬链接、权限或任何其他内容-它与您刚开始使用的文件相同,只是更新了内容,不会被新文件替换。

      您可以让自己完成这项工作。“1000行”是一个无用的限制,因为一行的长度可以是1 GB。您可以让自己来完成这项工作。“1000行”是一个无用的限制,因为一行的长度可以是1 GB。如果日志记录过程仍然保留日志文件的打开文件描述符,这将无效。@hek2mgl是的,这是正确的,您指出它是正确的。但是,在这种情况下,我知道OP询问的命令将是唯一一个操作日志文件的命令。如果日志记录过程仍然保留日志文件的打开文件描述符,则此命令无效。@hek2mgl是的,这是正确的,您指出它是正确的。但是,在本例中,我知道OP询问的命令将是唯一一个操作日志文件的命令。