【问题标题】:How to write Python and shell console outputs to a file in an order?如何按顺序将 Python 和 shell 控制台输出写入文件?
【发布时间】:2021-08-06 14:35:35
【问题描述】:

我在 Python 文件中运行 impdp 语句表单,我想在日志文件中的 Python 脚本中编写打印语句,该日志文件是在“abccmd”中使用“>>”附加符号创建的。

两个待解决的问题:

  1. 打印命令正在覆盖使用 impdp 命令生成的日志
  2. 我希望日志按照它们在脚本中的顺序排列(所有打印命令都位于日志文件的顶部。即使是被调用函数中 impdp 语句之后的命令)

另外,我正在为创建的日志文件使用动态命名系统。

def import_command_run(DP_WORKLOAD, dp_workload_cmd, imp_loop, vardate):
        abccmd = 'impdp admin/DP_PDB_ADMIN_PASSWORD@DP_PDB_FULL_NAME SCHEMAS=ABC >>' + logdir + '/DP_IMP_' + DP_PDB_FULL_NAME[i] + '_' + DP_WORKLOAD + '_' + str(vardate) + '.log 2>&1'
        defcmd = 'impdp admin/DP_PDB_ADMIN_PASSWORD@DP_PDB_FULL_NAME SCHEMAS=DEF >>' + logdir + '/DP_IMP_' + DP_PDB_FULL_NAME[i] + '_' + DP_WORKLOAD + '_' + str(vardate) + '.log 2>&1'

    # any of the above commands
    run_imp_cmd(eval(abccmd))

def run_imp_cmd(cmd):
    output = subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    stdout,stderr = output.communicate()
    return stdout

在 imp_workload() 和 main() 方法中使用的所有打印命令都应该在日志文件中按照准确的顺序出现。

def imp_workload(DP_WORKLOAD, DP_DURATION_SECONDS, vardate):
        imp_loop = 1
        while DP_DURATION_SECONDS > 0:
            print("------------------------------------------------------------------------------------------------------------------------------------------")
            print("                                               PDB " + DP_PDB_FULL_NAME[i] +  " for Workload " + DP_WORKLOAD + ": Import number " + str(imp_loop) + " Starts")
            print("------------------------------------------------------------------------------------------------------------------------------------------")

            duration = 0
            print("\nImport is running for Time loop : " + str(imp_loop))
            startImport = datetime.now()
            start = time.time()
            print("Start Time for the Import is    : " + startImport.strftime("%Y-%m-%d %H:%M:%S"))
       
            # Calling the above function here
            import_command_run(DP_WORKLOAD, dp_workload_cmd, imp_loop, vardate)
            time.sleep(60)

            stop = time.time()
            endImport = datetime.now()
            print("Stop Time for the Import is     : " + endImport.strftime("%Y-%m-%d %H:%M:%S"))
            duration = stop - start

            print("\nTotal Time elapsed for Data Pump Import Time loop " + str(imp_loop) + ": " + str(int(duration/3600)) + " hours " + str(int(((duration/60)%60))) + " minutes " + str(int((duration % 60))) + " seconds\n")

            DP_DURATION_SECONDS = DP_DURATION_SECONDS - duration

            if DP_DURATION_SECONDS>0:
                print("\nData Pump Import will again run for: " + str(int(DP_DURATION_SECONDS)) + " seconds\n")
            else:
                print("\nDATA Pump Import has ended for the workload: " + DP_WORKLOAD + "\n")

            imp_loop = imp_loop + 1

如您所见,我正在尝试使用 sys.stdout。但它正在覆盖由 impdp 语句创建的日志文件。

if __name__ == "__main__":
        vardate = datetime.now().strftime("%d-%b-%Y-%I_%M_%S_%p")

        # Running loop through each workload mentioned in the config file
        for i in range((len(DP_PDB_FULL_NAME))):
                print("\n==========================================================================================================================================")
                print("\n                                                    Data Pump Workload has Started                                                        \n")
                print("==========================================================================================================================================")

                # Conversion of time form minutes to seconds
                DP_DURATION_SECONDS = int(DP_DURATION) * 60

                now = datetime.now()
                print("Current Date and Time: " + now.strftime("%Y-%m-%d %H:%M:%S"))

                print("\nData Pump Import will run for " + DP_DURATION  + " minutes\n")

                for DP_WORKLOAD in DP_WORKLOAD_NAME:
                        sys.stdout = open(logdir + '/DP_IMP_' + DP_PDB_FULL_NAME[i] + '_' + DP_WORKLOAD  +  '_' + str(vardate) + '.log', 'w')
                        p1 = multiprocessing.Process(target=imp_workload, args=(DP_WORKLOAD, DP_DURATION_SECONDS, vardate, ))
                        p1.start()
                        sys.stdout.close()

请建议一种以正确方式记录它们的方法。

【问题讨论】:

  • 很简单。不要使用print() 进行日志记录。使用记录器进行记录。
  • @Tomalak 但是我将如何使用记录器添加我想要的语句?还有,如何合并使用 impdp 语句生成的导入日志?
  • 关于impdp - 这是一个单独的进程(实际上是几个,因为您使用的是多处理) - 您不能只将这些文件与您的 Python 进程生成的日志合并。但是您可以在开始每个导入过程之前使用impdp's logging configuration 使用 Python 设置顺序日志文件名称。也许这就够了?如果您真的必须将它们与 Python 的日志合并,则必须编写代码来读取所有这些文件并执行此操作。

标签: python python-2.7 shell logging


【解决方案1】:

不知道这可能是你想要的结果,反正你可以试试这个:

python -m abc.py > d:\output.txt

它在d:中生成output.txt,它会按照调用顺序记录所有打印结果。

【讨论】:

  • 我实际上是使用动态命名的日志文件名。
猜你喜欢
  • 1970-01-01
  • 2017-09-30
  • 2020-04-10
  • 1970-01-01
  • 2012-12-18
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多