Python 在 windows 服务器 2012 上使用调度程序调用时记录器未记录
Python logger not logging when called with scheduler on windows server 2012
我在 Windows 服务器上写了一个简单的 "git pull" 脚本 运行:
import logging
import subprocess
# Initialize logging
logger = logging.getLogger('autopull')
logger.setLevel(logging.INFO)
log_file = logging.FileHandler('autopull.log')
log_file.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s:%(levelname)s:%(message)s")
log_file.setFormatter(formatter)
logger.addHandler(log_file)
# Main part
logger.info('Started')
try:
subprocess.check_output("C:\Program Files\Git\cmd\git pull")
logger.info('Pulled repo successfully')
except:
logger.exception("Pulled failed")
我使用了记录器,因为调度程序总是告诉我它以退出代码 0 执行,我想仔细检查是否是这种情况。
当我手动调用脚本时,它工作正常并且记录器写入 autopull.log。但是,当它被调度程序调用时,记录器什么也不写。任务 运行 与 "Run with highest privileges" 和 "Run whether user is logged or not"。
我是不是哪里做错了?
编辑 1:添加计划任务参数
一般:
- "Run whether user is logged on or not" 和 "Run with highest privileges".
- 配置:Windows Server 2012 R2
触发器:
- 触发:一次
- 详情:2017 年 6 月 26 日下午 12:30 - 触发后,无限期地每 1 小时重复一次
- 状态:已启用
操作:
- 操作:启动程序
- 详细信息:D:\Anaconda3\python.exe D:\projects\foo\autopull.py
条件:
- "Start the task only if the computer is on AC power" 和 "Stop if the computer switched to battery power".
设置:
- "Allow task to be run on demand" 和 "if the running task does not end when requested, force it to stop".
@老鼠博士,试试这个。我能够 运行 你的代码(注销时)。仅供参考,我也在 Windows 上 运行ning Anaconda。
一旦进入编辑操作 window(在上面显示的操作中,单击编辑按钮),在 program/script 中,确保它指向实际实例你的 Python (Anaconda)。
在 Program/Script
两边加上双引号
"D:\Anaconda3\python.exe"
不要复制粘贴,输入即可。
在可选参数中添加:
-u "D:\projects\foo\autopull.py"
在开始于(可选)中将文件夹位置添加到不带引号的脚本中:
D:\projects\foo
如果上述方法不起作用,出于故障排除目的:
- 当您在任务计划程序中单击 运行(运行 立即执行)时是否有效(登录时自然如此)?
- 在任务调度器中,您是否查看了任务的历史记录以查看调度器在哪里失败?
编辑:仔细想想,我记得 运行ning python 直接使用 "Run whether user is logged on or not".
有一些问题
如果以上方法不起作用,试试这个:
创建批处理文件 (.bat) 并在其中添加以下行:
D:\Anaconda3\python.exe D:\projects\foo\autopull.py %*
将任务调度器指向这个批处理文件(而不是直接指向 python 脚本)。
我在 Windows 服务器上写了一个简单的 "git pull" 脚本 运行:
import logging
import subprocess
# Initialize logging
logger = logging.getLogger('autopull')
logger.setLevel(logging.INFO)
log_file = logging.FileHandler('autopull.log')
log_file.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s:%(levelname)s:%(message)s")
log_file.setFormatter(formatter)
logger.addHandler(log_file)
# Main part
logger.info('Started')
try:
subprocess.check_output("C:\Program Files\Git\cmd\git pull")
logger.info('Pulled repo successfully')
except:
logger.exception("Pulled failed")
我使用了记录器,因为调度程序总是告诉我它以退出代码 0 执行,我想仔细检查是否是这种情况。
当我手动调用脚本时,它工作正常并且记录器写入 autopull.log。但是,当它被调度程序调用时,记录器什么也不写。任务 运行 与 "Run with highest privileges" 和 "Run whether user is logged or not"。
我是不是哪里做错了?
编辑 1:添加计划任务参数
一般:
- "Run whether user is logged on or not" 和 "Run with highest privileges".
- 配置:Windows Server 2012 R2
触发器:
- 触发:一次
- 详情:2017 年 6 月 26 日下午 12:30 - 触发后,无限期地每 1 小时重复一次
- 状态:已启用
操作:
- 操作:启动程序
- 详细信息:D:\Anaconda3\python.exe D:\projects\foo\autopull.py
条件:
- "Start the task only if the computer is on AC power" 和 "Stop if the computer switched to battery power".
设置:
- "Allow task to be run on demand" 和 "if the running task does not end when requested, force it to stop".
@老鼠博士,试试这个。我能够 运行 你的代码(注销时)。仅供参考,我也在 Windows 上 运行ning Anaconda。
一旦进入编辑操作 window(在上面显示的操作中,单击编辑按钮),在 program/script 中,确保它指向实际实例你的 Python (Anaconda)。
在 Program/Script
两边加上双引号"D:\Anaconda3\python.exe"
不要复制粘贴,输入即可。
在可选参数中添加:
-u "D:\projects\foo\autopull.py"
在开始于(可选)中将文件夹位置添加到不带引号的脚本中:
D:\projects\foo
如果上述方法不起作用,出于故障排除目的:
- 当您在任务计划程序中单击 运行(运行 立即执行)时是否有效(登录时自然如此)?
- 在任务调度器中,您是否查看了任务的历史记录以查看调度器在哪里失败?
编辑:仔细想想,我记得 运行ning python 直接使用 "Run whether user is logged on or not".
有一些问题如果以上方法不起作用,试试这个:
创建批处理文件 (.bat) 并在其中添加以下行:
D:\Anaconda3\python.exe D:\projects\foo\autopull.py %*
将任务调度器指向这个批处理文件(而不是直接指向 python 脚本)。