Python生成Windows服务教程:定时写日志
一、准备工作
1.1 环境要求
-
Windows操作系统(Win7/10/11/Server均可)
-
Python 3.x 已安装
-
管理员权限(安装服务需要)
1.2 安装必要的Python库
pip install pywin32
二、编写服务代码
2.1 完整代码
创建一个新的Python文件,比如 log_service.py,代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Windows 服务版本的定时写日志程序
功能:无需批处理、无需黑窗口,开机自动后台运行,每隔3分钟向 C:\log.txt 写入系统时间
"""
import win32serviceutil
import win32service
import win32event
import servicemanager
import sys
import time
from datetime import datetime
class LogService(win32serviceutil.ServiceFramework):
"""定时日志写入服务类"""
# 服务名称(命令行中使用)
_svc_name_ = "shao_log"
# 服务显示名称(服务管理器中显示)
_svc_display_name_ = "定时日志写入服务"
# 服务描述
_svc_description_ = "每3分钟向C:\\log.txt写入系统时间"
def __init__(self, args):
"""初始化服务"""
win32serviceutil.ServiceFramework.__init__(self, args)
# 创建停止事件
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
# 服务运行状态
self.running = True
# 写入间隔(秒)- 3分钟 = 180秒
self.interval = 180
# 日志文件路径
self.log_file = r"C:\log.txt"
def SvcStop(self):
"""服务停止方法"""
self.running = False
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
"""服务运行方法"""
# 记录服务启动日志到系统事件查看器
servicemanager.LogMsg(
servicemanager.EVENTLOG_INFORMATION_TYPE,
0, # 事件ID
(self._svc_name_, '服务已启动')
)
# 执行主逻辑
self.main()
def write_log(self):
"""写入日志到C盘"""
try:
# 获取当前时间
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 尝试写入C盘
with open(self.log_file, "a", encoding="utf-8") as f:
f.write(f"{current_time} - 服务运行中\n")
except Exception as e:
# 写入失败时,记录到系统事件日志
error_msg = f"C盘写入失败: {e}"
servicemanager.LogErrorMsg(error_msg)
def main(self):
"""主循环逻辑"""
# 立即写入一次日志
self.write_log()
# 循环执行,直到服务停止
while self.running:
# 等待停止事件或超时
ret = win32event.WaitForSingleObject(self.hWaitStop, self.interval * 1000)
if ret == win32event.WAIT_OBJECT_0:
# 收到停止信号,退出循环
break
# 写入日志
self.write_log()
if __name__ == "__main__":
"""服务入口"""
if len(sys.argv) == 1:
# 直接运行时,启动服务控制分发器
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(LogService)
servicemanager.StartServiceCtrlDispatcher()
else:
# 带命令行参数时,处理服务命令(install/start/stop/remove等)
win32serviceutil.HandleCommandLine(LogService)
2.2 代码说明
| 部分 | 说明 |
|---|---|
_svc_name_ | 服务名称,用于命令行操作 |
_svc_display_name_ | 服务显示名称,在服务管理器中看到的名字 |
interval = 180 | 写入间隔,单位秒(180秒=3分钟) |
log_file | 日志文件路径,这里是C盘根目录的log.txt |
SvcStop() | 服务停止时自动调用 |
SvcDoRun() | 服务启动时自动调用 |
三、安装和运行服务
3.1 以管理员身份打开命令提示符
-
按
Win + X,选择"Windows PowerShell(管理员)"或"命令提示符(管理员)" -
或者搜索cmd,右键选择"以管理员身份运行"
3.2 安装服务
# 进入代码所在目录 cd C:\path\to\your\script # 安装服务 python log_service.py install
3.3 启动服务
python log_service.py start
3.4 查看服务状态
python log_service.py status
3.5 停止服务
python log_service.py stop
3.6 卸载服务
python log_service.py remove
四、验证服务是否正常运行
4.1 检查日志文件
等待3分钟,检查C盘根目录下是否生成了 log.txt 文件,内容类似:
2024-01-15 10:30:00 - 服务运行中 2024-01-15 10:33:00 - 服务运行中 2024-01-15 10:36:00 - 服务运行中
4.2 服务管理器中查看
-
按
Win + R,输入services.msc回车 -
在服务列表中找到"定时日志写入服务"
-
查看状态是否为"正在运行"
4.3 系统事件查看器中查看
-
按
Win + X,选择"事件查看器" -
导航到:Windows日志 → 系统
-
筛选来源为"shao_log"的事件
五、常见问题解决
5.1 安装失败:"拒绝访问"
-
原因:没有以管理员身份运行
-
解决:右键命令提示符,选择"以管理员身份运行"
5.2 服务启动后立即停止
-
原因:代码有语法错误或权限问题
-
解决:检查C盘是否有写入权限,查看系统事件日志获取错误信息
5.3 C盘无法写入日志
-
原因:Windows限制了普通程序写入C盘根目录
-
解决方案:
-
elf.log_file = r"C:\ProgramData\log.txt" # 或 self.log_file = r"D:\log.txt"
-
5.4 服务名称已存在
# 先卸载现有服务 python log_service.py remove # 重新安装 python log_service.py install
六、常用命令一览表
| 命令 | 说明 |
|---|---|
python log_service.py install | 安装服务 |
python log_service.py remove | 卸载服务 |
python log_service.py start | 启动服务 |
python log_service.py stop | 停止服务 |
python log_service.py restart | 重启服务 |
python log_service.py status | 查看服务状态 |
python log_service.py debug | 调试模式运行(前台显示) |
七、进阶:修改配置
如果想修改写入间隔或日志路径,只需修改代码中的两个地方:
# 修改写入间隔为5分钟 self.interval = 300 # 修改日志路径为D盘 self.log_file = r"D:\mylog.txt"
修改后需要重新安装服务才能生效:
python log_service.py remove python log_service.py install python log_service.py start
八、总结
通过本教程,你学会了:
-
✅ 使用Python创建Windows服务
-
✅ 安装、启动、停止、卸载服务
-
✅ 服务开机自启动
-
✅ 定时执行任务的实现
-
✅ 日志写入和错误处理
现在你的服务已经可以开机自动运行,无需任何人工干预了!
更多推荐


所有评论(0)