从文件中保留最后x个日志 - Linux

时间:2015-09-09 14:53:04

标签: linux apache logging

我的服务器完全没有磁盘空间。我有一个非常大的日志文件,我需要保存日志文件的最后10000行。 我知道tune2fs有空间但是日志文件填满了相当快,我不希望空间用完,因为这可能会导致问题。

注意:最新的日志非常重要,但95%的文件都是无用的信息。我正在修复,apache日志报告的信息超出了我的需要。

我不想创建新文件然后再移回日志。我想从文件中保存最后X个日志,并删除其余日志而不先移动到新文件。

命令我使用了哪些不起作用:

cat test | tail -10000 | tee test

tail -n 10000 test | tee test

tail -n 10000 test > test

我还没有尝试sed,这可能有用吗?

请,任何建议将不胜感激。此时我正在测试一个单独的文档文件,因为我现在意外删除了所有日志。到目前为止所有命令都失败了。 谢谢你的帮助

附加说明:现在这完全是假设,因为我使用上述命令之一意外破坏了我的文件。

3 个答案:

答案 0 :(得分:1)

您可以使用dd快退来覆盖文件 搜索指针返回到输出文件的开头。例如 保持/ tmp / a的最后5行:

$ len=$(tail -5 /tmp/a | wc -c)
$ tail -5 /tmp/a | dd conv=notrunc of=/tmp/a
$ truncate -s $len /tmp/a

以下是一个示例测试:

$ cat /var/log/messages >/tmp/a
$ wc -l /tmp/a
13160 /tmp/a
$ head -1 /tmp/a
Sep  2 03:34:11 pure-ftpd: [INFO] Timeout (no operation for 1800 seconds)
$ len=$(tail -5 /tmp/a | wc -c)
$ tail -5 /tmp/a | dd conv=notrunc of=/tmp/a ; truncate -s $len /tmp/a
$ wc -l /tmp/a
5 /tmp/a
$ cat /tmp/a
Sep  9 17:05:02 systemd: Started Session 7209 of user meuh.
Sep  9 17:10:01 systemd: Starting Session 7210 of user meuh.
Sep  9 17:10:01 systemd: Started Session 7210 of user meuh.
Sep  9 17:15:01 systemd: Starting Session 7211 of user meuh.
Sep  9 17:15:01 systemd: Started Session 7211 of user meuh.

答案 1 :(得分:0)

只需使用

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceProcess;


namespace NetworkAuthIssue
{
    class Program
    {
        static void Main(string[] args)
        {
            string result;
            try
            {
                using (new Impersonation.Network.SoddingNetworkAuth("Invalid User", "localhost", "InvalidPassword"))
                {
                    var serviceController = new ServiceController("Power", "localhost");
                    if (serviceController.Status == ServiceControllerStatus.Running)
                    {
                        result = "Authenticated, service running";
                    }
                    else
                    {
                        result = "Authenticated, service not running";
                    }
                }
            }
            catch (Exception e)
            {
                result = "Authentication Failed";
            }
            Console.WriteLine(result);
            Console.Read();
        }
    }
}

这将打印10k最后一行FILENAME。 您可以将最后一行保存到另一个文件,然后通过键入

删除原始的大型FILENAME文件
[]() -> Type { }

or 

[]() -> QString { }

答案 2 :(得分:0)

如果您的系统使用systemd,则使用journalctl命令过滤掉您需要的消息。

一些例子:

仅显示来自httpd守护程序的日志消息:

journalctl -u httpd.service

仅显示来自httpd守护程序的日志消息以获取给定时间范围:

journalctl -u httpd.service --since today
journalctl --since="2015-09-21 09:00:00" --until="2015-09-22 13:59:59"

显示最后100个对数行(对于所有/ httpd /给定的pid):

journalctl -n 100
journalctl -u httpd.service -n 100
journalctl _PID=2100 -n 100

您可以通过附加> log.txt将所有命令的输出保存到文件log.txt中。 journalctl -u httpd.service --since today > log.txt

在某些发行版中,如果日记未被保留或您的用户不在sudo组中,则可能需要在命令前添加systemd-journal