【问题标题】:Linux: stream rotating log files into one fileLinux:将旋转日志文件流式传输到一个文件中
【发布时间】:2013-05-17 14:52:24
【问题描述】:

我想收集所有日志条目,这些条目会被写入日志文件并进行轮换:

    log_2013_05_10.txt
    log_2013_05_11.txt
    log_2013_05_12.txt
    ...

...合并到一个文件中。目标是,在对一个通宵运行的应用程序进行压力测试期间,所有条目都在一个文件中可用(并且仅从这个时间段开始),因此不需要手动合并和清理(从测试期之前和之后删除条目)。

是否有任何工具(linux 命令行)可以跟踪文件(匹配某种模式)? 比如:

    streamer 'log_2013*' > joined.txt

(只要 joiner 命令运行,joined.txt 就会被附加 - 例如 24h)

【问题讨论】:

    标签: linux shell logging


    【解决方案1】:

    tail -Fq -n 0 log_2013_05_10.txt log_2013_05_11.txt ... > joined.txt 应该可以工作。它将跟随文件的末尾,在目标文件到达时将其新内容写入目标文件。如果你使用 Bash 4,你可以创建一个简单的表达式来匹配一整年的所有文件(然后是一些):log_2013_{01..12}_{01..31}.txt

    例子:

    $ cd -- "$(mktemp --directory)"
    $ tail -Fq -n 0 date.log disk.log > joined.txt & # Start logging
    [1] 30827
    tail: cannot open 'date.log' for reading: No such file or directory
    tail: cannot open 'disk.log' for reading: No such file or directory
    $ while true; do date >> date.log; sleep 5; done & # Log time every 5 seconds
    [2] 30835
    tail: 'date.log' has become accessible
    $ while true; do df -Ph / | tail -n 1 >> disk.log; sleep 10; done & # Log disk use every 10 seconds
    [3] 30847
    tail: 'disk.log' has become accessible
    

    现在您可以tail -f -n 0 joined.txt 来查看正在写入连接日志的内容。

    【讨论】:

    • 它不会跟随新创建的文件。
    • 如果你指定他们的名字而不是使用 glob,它会。
    • 更新后会随之而来。添加如何生成文件名可能很有用。例如,tail -Fq -n 0 $(echo log_2013_05_{1..100})
    • {1..31} ;) 此外,它不适用于零填充数字。
    【解决方案2】:

    我认为,multitail 可能对你有用。

    MultiTail 让您可以像查看原始尾部一样查看一个或多个文件 程序。不同之处在于它会在您的 控制台(带有 ncurses)。 它还可以监控通配符:如果另一个文件 匹配通配符具有更新的修改日期,它将 自动切换到该文件。 这样您就可以,例如, 监控文件的完整目录。合并2个甚至更多 日志文件是可能的。

    【讨论】:

    • +1 非常有趣的工具,尤其是拆分窗口以跟踪多个文件,谢谢
    【解决方案3】:

    这很简单,但应该可以解决问题。

    #!/bin/bash
    
    OUTFILE=/tmp/joinedlog.txt
    touch $OUTFILE
    
    if [ "$1" == "" ]; then
        PATTERN='log_*05*'
    else
        PATTERN=$1
    fi
    
    echo "Searching for $PATTERN"
    
    for x in $( ls $PATTERN ); do
        echo Joining $x
        cat $x >> $OUTFILE
    done
    

    【讨论】:

    • 谢谢亨利。该脚本适用于准备好的文件,并且只加入它们。我正在考虑跟踪,例如: streamer 'log_2013*' >joined.txt 这将真正跟踪更改,仅跟踪我感兴趣的更改(时间段 - 我会在测试结束时终止命令)跨度>
    • @Tomasz 啊,明白了。祝你好运
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多