RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1116432
Accepted
Mikhail Murugov
Mikhail Murugov
Asked:2020-04-27 16:38:23 +0000 UTC2020-04-27 16:38:23 +0000 UTC 2020-04-27 16:38:23 +0000 UTC

如何从日志中获取最后 %date% 时间的数据?

  • 772

有一个系统Linux。它有一个日志。在此日志中有以下格式的条目:

2020-04-24 14:00:58.870+0300:Some log
2020-04-24 14:00:58.872+0300:Some another log
2020-04-24 14:00:58.891+0300:And another

例如,有必要从此日志中获取最后 10 分钟的记录(有时需要花费最后几秒钟)。问题是日志可以分成几行,例如:

2020-04-24 14:00:58.870+0300:Some log
2020-04-24 14:00:58.872+0300:Some
another
log
2020-04-24 14:00:58.891+0300:And another


我试过的:

sed -n "/^$(date --date='10 min ago' '+%Y-%m-%d %H:%M:%S')/,\$p" log.log

该选项很好,但它不执行所需的操作(如果在调用命令的同一秒内没有日志,则不会找到任何内容)。

awk -v from_date="$(date --date='10 min ago' '+%Y-%m-%d %H:%M:%S')" -v to_date="date '+%Y-%m-%d %H:%M:%S'" '$0 > from_date && $0 < to_date || $0 ~ to_date' log.log

此选项更好,可以满足需要,但由于某些日志被分成几行而中断。


正如我看到的问题的解决方案:
1. 计算需要日志的日期%date% = date --date='10 min ago' '+%Y-%m-%d %H:%M:%S'
2.%строка%从最后一行
2.1 的日志中向上。如果开头%строка%与正则表达式\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}
2.1.1 重合。然后
是 2.1.1.1。如果%строка% > %date%(按字典顺序),则输出所有通过的行;打破循环。

但是因为 我不强,我不知道该怎么做bash。


我的算法草图:

d=$(date --date='10 min ago' '+%Y-%m-%d %H:%M:%S'); tac log.log | (while read -r line; do ([[ $line =~ ([0-9]{4}-[0-9]{2}-[0-9]{2}.*) ]] && [[ "$line" > "$d" ]] && break) || echo $line; done;) | tac -

但在这种情况下,会显示整个日志。

d=$(date --date='10 min ago' '+%Y-%m-%d %H:%M:%S'); tac log.log | (while read -r line; do ([[ $line =~ ([0-9]{4}-[0-9]{2}-[0-9]{2}.*) && $d > $line ]] && (break)) || echo $line; done;) | tac -

在这种情况下,选择了真正必要的日期,但它不起作用break,并且显示的“旧”日志不是从该日期开始的。它也可以工作很长时间,因为我认为日志已被完全读取。


限制:

系统具有只读访问权限。那些。无法在那里上传一些文件、安装一些实用程序、配置现有实用程序的功能。

linux
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Ainar-G
    2020-04-27T17:53:41Z2020-04-27T17:53:41Z

    使用GNU AWK你可以这样做:

    BEGIN {
        from_date = strftime("%Y-%m-%d %H:%M:%S", systime() - 10 * 60);
    }
    
    {
        if (/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/) {
            date = substr($0, 1, 19);
            if (date > from_date) {
                print;
            } else {
                nextfile;
            }
        } else {
            print;
        }
    }
    
    • 1
  2. sanmai
    2020-05-05T16:49:09Z2020-05-05T16:49:09Z

    如果将问题重新表述为仅获取日志文件中最后添加的行,而不考虑时间格式等,则可以使用 diff 解决整个问题,如下所示:

    tail -n 1000 error.log > error.log.new
    touch error.log.old
    diff --unchanged-line-format= --old-line-format= --new-line-format='%L' error.log.old error.log.new
    mv error.log.new error.log.old
    

    我们在这里做什么:

    • 我们从当前日志中取出最后 1000 行。
    • 如果尚未创建旧日志文件,请创建它。
    • 将包含旧 1000 行的文件与包含新行的文件进行比较,仅显示添加的行。
    • 用新的日志文件替换旧的日志文件。

    该文件的输出可以发送到另一个程序进行传输,例如,发送到 Slack 或其他地方的一般聊天。

    即使系统具有只读权限,也可以将旧新的结束日志文件放在/tmp或的目录中/var/tmp。

    • 0

相关问题

  • 如果 fuser -k number/tcp 没有帮助,如何在 Debian 中释放端口?

  • Ubuntu。startx 不起作用。黑屏

  • --syn 在 iptables 中有什么作用?

  • 为什么需要iso格式?

  • C程序中没有密码的sudo

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5