我最近在做一个Asp.Net的网站的维护工作,该网站是一个Webform网站,中间调用了PowerShell命令文件做SharePoint部署的一些任务。
为了调试方便,我最关键的一步(在.cs文件中)加了将Exception的信息写入文本文件。这个“写入日志”的功能在我的本地机上运行良好,发布到服务器上的一个测试网站(端口号与正式网站不同),“将错误写入日志”也是正常运转,但是发布到服务器上的正式站点,就无法写入了。网站明明报错了,但是打开日志文件,就是啥也没有。
查看了正式站点和测试站点的文件夹的权限,没发现什么不同。不过正式站点在D盘,测试站点在C盘。权限中Authenticated Users 和Users都给的完全控制。
图片是在本地和服务器测试站点成功的错误日志。还有一张是站点的文件夹权限设置,测试站点和正式站点是一样的。
代码如下,错误日志文件ErrorLog.txt 直接手动创建好放在那里了。
try
{
XXXXXX
}
catch (Exception ex)
{
string LogPath = "";
String LogStr = String.Empty;
LogPath = HttpContext.Current.Server.MapPath("ErrorLog.txt");
LogStr += " 发生时间: " + DateTime.Now.ToString() + " \r\n ";
LogStr += " 详细描述: " + ex.Message + " \r\n ";
LogStr += " 内层错误: " + ex.InnerException.ToString() + " \r\n ";
LogStr += " StackTrace: " + ex.StackTrace + " \r\n ";
LogStr += " TargetSite: " + ex.TargetSite + " \r\n ";
LogStr += " -----------------------------------------------------------------------------------------------------------------\r\n\r\n\r\n ";
File.AppendAllText(LogPath, LogStr, System.Text.Encoding.Unicode);
//做了修改,最后要改回去,对错误详细信息和堆栈做了输出
context.Response.Write(GetJson(0, LogStr, 0, "部署失败", false));
}
如果你不怕的话直接 给到iis localsystem权限 在写日志的目录上给到everyone的权限 . 试试
系统非让选择一个最佳答案,我只好选这个了。真正答案请看末尾我自己的回复。
web程序的权限不够,写不了文件呗...
呃,具体说说?要如何改权限呢?这个web程序在测试站点就可以写,那是怎么回事呀?
@starstarfish: 把你日志文件换到一个普通目录就可以了.比如d:/logs/error.log. 或者在的现在的文件上修改权限增加iis运行的用户拥有写入权限. 或者iis设置拥有写入权限
直接给everyone 吧,
建议放到其他盘,C盘的权限一般比较高
额,最后终于解决了。但是如何解决的呢?这个问题实在是狡猾,隐藏的太深。和我们开始看到的,想到的不一样。
我先说结论:错误日志打印功能没错。为了能写入日志给的权限实际上也够用了。放在正式站点时明明报错却打印不出来错误日志,原因是这样的:报的错误是“请求超时”,其实程序没有出任何错误,只是网站在调用PowerShell脚本中,脚本中有一步需要等待时间很长,(约2分钟),这个时候,没有任何数据返回给浏览器,就会报出“请求超时”。网站程序运行至此,还没有出任何真正的错误,所以日志上也没有任何记录。
而在我的本地和测试位置上为什么运行时会出现实际的错误呢?是因为我本地运行时没有调用PowerShell脚本的权限,所以会报错。在测试位置运行时,那个测试站点的应用程序池和正式站点的应用程序池不一样。正式站点的应用程序池的身份标识是管理员,就是为了能够调用PowerShell脚本。而测试站点的应用程序池的身份标识是"应用程序池身份“,也就是属于IIS_IUsers组,无法调用PowerShell脚本,就会报错。这两种情况都会报实际的错误,也就会写入错误日志。(此时还没有运行到PowerShell脚本中长时间等待那步)。
不过非常感谢大家给的这些思路,让我对于网站运行的身份,以及网站根目录的权限问题有了进一步认识。
我看看能不能把园豆分一些给大家。