You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Windows上创建指向远程计算机目录的符号链接以实现应用日志重定向

如何在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」符号链接,右键创建一个文本文档,结果弹出报错:

创建文件报错提示

到目前为止我总结出三点:

  1. 在Windows上创建符号链接要用mklink,而且得用管理员权限打开命令提示符
  2. 要创建指向远程目录的符号链接/ junction,得用UNC路径,不能用驱动器盘符
  3. 可以用fsutil behavior query symlinkEvaluation命令检查本地到远程的符号链接权限是否开启

现在我卡在下一步了:到底该去哪里检查符号链接/ junction目标目录的权限?有没有大佬能指点一下?

备注:内容来源于stack exchange,提问作者Dominique

火山引擎 最新活动