如何在Windows上创建指向远程计算机目录的符号链接以实现应用日志重定向
最近我碰到这么个需求:我的应用会把日志硬编码写到运行目录下的「Logs」文件夹里,现在有客户问能不能把日志存到另一台电脑的目录里。
最开始我试着用WSL创建符号链接来测试,步骤是这样的:
- 先停掉应用
- 删除原来的「Logs」目录
- 在WSL里执行命令:
ln -s /mnt/c/Temp_Folder/TestLog/ /mnt/c/<Application>/Logs - 重新启动应用
结果发现C:\Temp_Folder\TestLog\里根本没生成日志文件。我琢磨着要么是在Windows上用Linux的符号链接思路完全错了,要么是有啥细节没注意到,希望是后者,所以想问问到底得考虑哪些要点?
第一次更新(参考Harry的回答后)
对啊,为啥要用WSL的ln -s呢?直接用Windows自带的mklink不香吗?我立马试了,但还是没成功:
C:\<Runtime_Dir>mklink /D Logs E:\TestLog\ => result: 29/03/2024 08:21 <SYMLINKD> Logs [E:\TestLog\]
符号链接确实创建出来了,但启动应用后,日志只在控制台里显示,根本没写入文件。
我还试了 junction(之前有点印象但记不清细节了):
C:\<Runtime_Dir>mklink /D /J Logs E:\TestLog\ Local volumes are required to complete the operation.
C:\<Runtime_Dir>mklink /D /H Logs E:\TestLog\ The system cannot find the path specified.
C:\<Runtime_Dir>mklink /J Logs E:\TestLog\ Local volumes are required to complete the operation.
第二次更新(更多测试后)
我发现指向同一台电脑的其他目录是可以的,但跨驱动器就不行:
C:\<Runtime_Dir>mklink /D Logs C:\Temp_Folder\TestLog\ symbolic link created for Logs <===>> C:\Temp_Folder\TestLog\
C:\<Runtime_Dir>mklink /D /J Logs C:\Temp_Folder\TestLog\ Junction created for Logs <===>> C:\Temp_Folder\TestLog\
这两种情况日志都能正常生成!也就是说问题不在Windows符号链接/ junction本身,而是指向其他驱动器或者远程目录的时候出问题了。
我记得Windows里有几种映射驱动器的方式(比如驱动器映射、subst还有别的?记不太清了),会不会符号链接/ junction只对某些类型的驱动器生效?有没有办法绕过这个限制?
第三次更新(参考u1686_grawity的回答后)
我按照要求用了UNC路径,并且确认symlinkEvaluation设置是正确的,但还是不行:
fsutil behavior query symlinkEvaluation Local to local symbolic links are enabled. Local to remote symbolic links are enabled. => 这个应该就是关键项吧? Remote to local symbolic links are disabled. Remote to remote symbolic links are disabled.
C:\<Runtime_Dir>mklink /D Logs \\petrvs01\Log\TestLog\ symbolic link created for Logs <===>> \\petrvs01\Log\TestLog\
链接创建成功了,但远程目录里还是没有日志文件。我又试了个操作:打开资源管理器进入这个「Logs」符号链接,右键创建一个文本文档,结果弹出报错:

到目前为止我总结出三点:
- 在Windows上创建符号链接要用
mklink,而且得用管理员权限打开命令提示符 - 要创建指向远程目录的符号链接/ junction,得用UNC路径,不能用驱动器盘符
- 可以用
fsutil behavior query symlinkEvaluation命令检查本地到远程的符号链接权限是否开启
现在我卡在下一步了:到底该去哪里检查符号链接/ junction目标目录的权限?有没有大佬能指点一下?
备注:内容来源于stack exchange,提问作者Dominique




