postgresql - 通过 Powershell Start-Transcript 将时间戳添加到 Postgres PSQL 执行输出
问题描述
我搜索了论坛和网络,我没有找到任何符合我的问题的情况。
我需要根据 Powershell 执行的 PSQL 命令(postgres 行命令)的详细输出“采取行动”。
我能找到的最好的方法(非常感谢来自堆栈交换的人)是使用 Start-Transcript 注册详细信息,然后阅读日志并采取行动。问题是,我仍然需要检查是否有办法在“执行期间”采取行动,或者至少可以“测量”每个详细输出的时间。
非常不幸的是,我无法正确更改 pgsql 函数,我所拥有的只是详细的输出和已经实现的“通知”。
我尝试了“如何将时间戳添加到 PowerShell 和输出的各个行? ”建议的“过滤时间戳”解决方案,但由于某种原因,它没有按照我需要的方式生成时间戳。
我完全按照帖子示例进行了操作,您可以看到我非常简单的 powershell 命令是:
filter timestamp {"$(Get-Date -Format o): $_"}
cmd /c $DBCmd -f c:\di\mycmd.sql "postgresql://myuser:mypass@myhost/mydb" | timestamp
检查 Start-Transcript 生成的日志以及直接在命令行中的结果如下:
2018-07-30T16:30:32.6632687-03:00: ?column?
2018-07-30T16:30:32.6632687-03:00: -----------------------------------
2018-07-30T16:30:32.6632687-03:00: TIME2018-07-30 16:26:09.683957-03
2018-07-30T16:30:32.6632687-03:00: (1 row)
2018-07-30T16:30:32.6789028-03:00:
psql:c:/di/LOCK01.sql:2: NOTICE: [LOG][Delete] [ADT_SPD_EFD_NFC_NECF_RDIA_ANALIT_ITEM]
psql:c:/di/LOCK01.sql:2: NOTICE: [LOG][Delete] [ADT_SPD_EFD_NFC_NECF_NF]
psql:c:/di/LOCK01.sql:2: NOTICE: [LOG][Delete] [ADT_SPD_EFD_NFC_NECF_RDIA_ANALIT]
psql:c:/di/LOCK01.sql:2: NOTICE: [LOG][Delete] [ADT_SPD_EFD_NF_ITEM]
psql:c:/di/LOCK01.sql:2: NOTICE: [LOG][Delete] [ADT_SPD_EFD_CFE_EQP_SAT]
psql:c:/di/LOCK01.sql:2: NOTICE: [LOG][Delete] [ADT_SPD_EFD_NFC_ECF_CFE_CPL]
psql:c:/di/LOCK01.sql:2: NOTICE: [LOG][Delete] [ADT_SPD_EFD_CFE]
psql:c:/di/LOCK01.sql:2: NOTICE: [LOG][Delete] [ADT_SPD_EFD_NFC_NECF_NF_ITEM]
psql:c:/di/LOCK01.sql:2: NOTICE: [LOG][Delete] [ADT_SPD_EFD_NF_CPL]
2018-07-30T16:30:37.2569238-03:00: fn_adt_myfunction
2018-07-30T16:30:37.2588785-03:00: -----------------------------------------
2018-07-30T16:30:37.2598554-03:00: 1
2018-07-30T16:30:37.2608365-03:00: (1 row)
2018-07-30T16:30:37.2618073-03:00:
commad mycmd.sql 是 pgsql 函数的执行:
SELECT adt_objprog.fn_myfunction(myparams);
函数 myfunction 有简单的删除,如图:
v_cmd := 'DELETE FROM ADT_TDL.ADT_SPD_EFD_EGA_CV115_CDIA_ANALIT'||v_partionname||' WHERE COD_INT_ADT = '||v_cod_int_adt||' AND COD_INT_EFD IN (SELECT COD_INT_EFD FROM WORKDL_ADT.ADT_SPD_EFD_CHAVE_REMOCAO_1427_1);';
raise notice '[LOG][Delete] [ADT_SPD_EFD_EGA_CV115_CDIA_ANALIT]';
execute(v_cmd);
v_cmd := 'DELETE FROM ADT_TDL.ADT_SPD_EFD_EGA_CV115_CDIA'||v_partionname||' WHERE COD_INT_ADT = '||v_cod_int_adt||' AND COD_INT_EFD IN (SELECT COD_INT_EFD FROM WORKDL_ADT.ADT_SPD_EFD_CHAVE_REMOCAO_1427_1);';
raise notice '[LOG][Delete] [ADT_SPD_EFD_EGA_CV115_CDIA]';
execute(v_cmd);
正如您在示例中看到的那样,我真的不明白为什么没有为“通知”消息生成时间戳。
有没有人知道为什么会发生这种情况,以及是否有办法(任何方式)做到这一点?
非常感谢您,
此致,
路易斯
ps:我确实将标题更改为更好的标题(我认为),并进行了较小的更正。
解决方案
推荐阅读
- jquery - 图像在子模态选项卡中不可见 - MVC 5 .NET 中的模态内模态
- python - 如何在 Python 中截取屏幕截图?
- r - 将文件名和工作表名称分配给 R 中的(多个)观察值
- vue.js - 使用 Vue/Axios 调用访问 Jenkins api 的问题
- javascript - 在背景上添加元素(圆圈)但在html css js中的文本后面
- cron - 如果 cron 作业在 Cronitor 上成功,则发送电子邮件
- javascript - Firebase 用户配置文件添加自定义字段
- maven - Maven 不在带有 Spring Boot 的多模块项目中运行单元测试
- java - 当布尔表达式为假时,for循环仍然有效
- java - 如何在 Java 中制作强化学习代理?