我使用 python 脚本将日志文件导入 Piwik,我可以一次成功地解析一个日志文件,但是如何为目录中的所有日志文件执行此操作?
从自述文件中,脚本的用法是:
import_logs.py [options] log_file [ log_file [...] ]
所以如果我有日志文件 u_ex120101.log 到 u_ex120701.log 我怎么能运行一次来完成所有这些文件?我确信答案正盯着我看,但我对 python 基本上一无所知。
谢谢。
我使用 python 脚本将日志文件导入 Piwik,我可以一次成功地解析一个日志文件,但是如何为目录中的所有日志文件执行此操作?
从自述文件中,脚本的用法是:
import_logs.py [options] log_file [ log_file [...] ]
所以如果我有日志文件 u_ex120101.log 到 u_ex120701.log 我怎么能运行一次来完成所有这些文件?我确信答案正盯着我看,但我对 python 基本上一无所知。
谢谢。
如果您在一个目录中有一堆日志文件并且您只想要其中的一个范围,另一种选择是编写一个小的 Python 脚本,该脚本接受一个范围和一个基数,并且只为每个日志文件调用导入日志(或者,如果您想要特别花哨,其实可以import_logs
直接导入)。
Popen
你可以在 Python中运行任何 shell 命令。所以如果你想运行import_logs log_base_str01123.txt
,你可以运行以下命令:
from subprocess import Popen, PIPE
print Popen("import_logs.py log_base_str01123.txt", stdout=PIPE, shell=True).stdout.read()
如果你想为一堆字符串做到这一点:
from subprocess import Popen, PIPE
import os
base_prefix = "u_ex"
base_suffix = ".log"
logs=["my", "list", "of", "log#s"]
for log in logs:
path = "import_logs.py {prefix}{log_name}{suffix}".format(
prefix=prefix, log_name=log, suffix=base_suffix)
if not os.path.exists(log):
print Popen(,
stdout=PIPE, shell=True).stdout.read())
这可能是一个更通用的解决方案/让您拥有更细粒度的控制。
如果你想通过一个连续值列表,你可以使用:
logs = map(str, range(start_number, end_number + 1))
您可以在 Python中使用glob模块。glob.glob() 函数接受一个包含通配符的字符串,并返回一个包含匹配文件和文件夹的列表。
例子:
import blob
# assume file_argument is a variable containing wildcard
file_argument = '/var/log/*.log'
for log_file in glob.glob(file_argument):
do_stuff(log_file)
这将导致 Python 为您执行通配符扩展。
仅使用 shell 通配符调用脚本怎么样?
cd logs/
import_logs.py u_*.log
*注意:这不适用于 Windows。Windows shell 不会扩展通配符。接收程序必须这样做(即import_logs.py)
Windows 解决方案:使用cygwin、powershell或其他 *nix-like shell 替换。
我使用的是 Windows Server 2012,我没有使用 Python 的经验,并且我有 4 年的日志文件,每个文件大小约为 20mb-40mb。
我只是想分享一下我使用了一个名为 Merge Logs 的免费实用程序来解决这个问题。使用copy *.log merged.txt
ortype *.log > merged.txt
花了很长时间,而这个实用程序在几分钟内完成了我需要的工作。
这是下载:http ://www.allscoop.com/dotnet-software/log-file-merge.php