0

我使用 python 脚本将日志文件导入 Piwik,我可以一次成功地解析一个日志文件,但是如何为目录中的所有日志文件执行此操作?

从自述文件中,脚本的用法是:

import_logs.py [options] log_file [ log_file [...] ]

所以如果我有日志文件 u_ex120101.log 到 u_ex120701.log 我怎么能运行一次来​​完成所有这些文件?我确信答案正盯着我看,但我对 python 基本上一无所知。

谢谢。

4

4 回答 4

1

如果您在一个目录中有一堆日志文件并且您只想要其中的一个范围,另一种选择是编写一个小的 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))
于 2012-07-04T03:00:44.563 回答
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 为您执行通配符扩展。

于 2012-07-23T18:34:21.393 回答
1

仅使用 shell 通配符调用脚本怎么样?

cd logs/
import_logs.py u_*.log

*注意:这不适用于 Windows。Windows shell 不会扩展通配符。接收程序必须这样做(即import_logs.py)

Windows 解决方案:使用cygwinpowershell或其他 *nix-like shell 替换。

于 2012-07-04T02:34:49.073 回答
1

我使用的是 Windows Server 2012,我没有使用 Python 的经验,并且我有 4 年的日志文件,每个文件大小约为 20mb-40mb。

我只是想分享一下我使用了一个名为 Merge Logs 的免费实用程序来解决这个问题。使用copy *.log merged.txtortype *.log > merged.txt花了长时间,而这个实用程序在几分钟内完成了我需要的工作。

这是下载:http ://www.allscoop.com/dotnet-software/log-file-merge.php

于 2012-10-02T07:48:16.407 回答