要将日志文件按照日期精确分割成每天一个文件,我们需要知道日志中,日期的精确格式,并且日志应该是按时间顺序排列的。这里给出一个基于Apache/Nginx日志格式(每行开始有标准的日期和时间戳)的例子脚本。我们将使用awk
和date
命令配合处理:
#!/bin/bash
# 指定日志文件夹路径
LOG_DIR="/path/to/log/folder"
# 设置日志格式,这里假设是Apache/Nginx通用日志格式 %d/%b/%Y:%H:%M:%S
LOG_DATE_FORMAT="%d/%b/%Y:%H:%M:%S"
# 遍历日志文件夹中的所有文件
for LOG_FILE in "$LOG_DIR"/*.log; do
while read -r LINE; do
# 提取每行的日期部分
DATE_STR=$(echo "$LINE" | awk '{ print $4" "$5 }')
# 将提取的日期字符串转换为Unix时间戳
TIMESTAMP=$(date -d "$DATE_STR" +%s)
# 计算出日期对应的日志文件名
DAY_LOG_FILE="${LOG_DIR}/${LOG_FILE##*/}.$(date -d "@$TIMESTAMP" +%Y-%m-%d).log"
# 写入对应日期的日志文件
echo "$LINE" >> "$DAY_LOG_FILE"
done < "$LOG_FILE"
done
echo "Logs have been split by day."
# 注意:这个脚本依赖于准确的日志格式和正确的date解析设置。
# 如果日志格式不是Apache/Nginx样式,请修改LOG_DATE_FORMAT和日期提取部分的awk命令。
# 对于非常大的日志文件,此脚本可能会消耗大量内存,
# 在生产环境中,建议使用更高效的方法,如使用流式处理工具如awk本身或者使用专门的日志分析工具如Logstash等。
这个脚本逐行读取日志文件,对每行提取日期,然后将该行写入对应日期的日志文件中。但请注意,对于非常大的日志文件,逐行处理可能效率较低,而且会占用较多内存。在处理大规模日志时,推荐采用能处理流式数据的方式,比如直接在awk内部完成全部处理,或者利用专门的日志收集和处理工具,如Logstash等。同时,一定要确保日志格式匹配,否则日期提取将会失败。
标签:LOG,切割成,单独,日期,awk,FILE,格式,日志 From: https://blog.51cto.com/u_16161880/9325170