首页 新闻 会员 周边 捐助

Asp.Net网站无法写入错误日志,测试站点可以,正是站点不行

0
悬赏园豆:50 [已解决问题] 解决于 2020-10-14 14:47

我最近在做一个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));
}

starstarfish的主页 starstarfish | 初学一级 | 园豆:143
提问于:2020-09-18 14:19
< >
分享
最佳答案
0

如果你不怕的话直接 给到iis localsystem权限 在写日志的目录上给到everyone的权限 . 试试

收获园豆:15
望着天的蜗牛 | 菜鸟二级 |园豆:354 | 2020-09-18 16:11

系统非让选择一个最佳答案,我只好选这个了。真正答案请看末尾我自己的回复。

starstarfish | 园豆:143 (初学一级) | 2020-10-14 14:49
其他回答(4)
0

web程序的权限不够,写不了文件呗...

收获园豆:13
czd890 | 园豆:14488 (专家六级) | 2020-09-18 14:21

呃,具体说说?要如何改权限呢?这个web程序在测试站点就可以写,那是怎么回事呀?

支持(0) 反对(0) starstarfish | 园豆:143 (初学一级) | 2020-09-18 14:25

@starstarfish: 把你日志文件换到一个普通目录就可以了.比如d:/logs/error.log. 或者在的现在的文件上修改权限增加iis运行的用户拥有写入权限. 或者iis设置拥有写入权限

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2020-09-18 15:01
0

直接给everyone 吧,

收获园豆:12
永远跟党走i | 园豆:1542 (小虾三级) | 2020-09-20 15:43
0

建议放到其他盘,C盘的权限一般比较高

收获园豆:10
E行者 | 园豆:1811 (小虾三级) | 2020-09-26 16:42
0

额,最后终于解决了。但是如何解决的呢?这个问题实在是狡猾,隐藏的太深。和我们开始看到的,想到的不一样。
我先说结论:错误日志打印功能没错。为了能写入日志给的权限实际上也够用了。放在正式站点时明明报错却打印不出来错误日志,原因是这样的:报的错误是“请求超时”,其实程序没有出任何错误,只是网站在调用PowerShell脚本中,脚本中有一步需要等待时间很长,(约2分钟),这个时候,没有任何数据返回给浏览器,就会报出“请求超时”。网站程序运行至此,还没有出任何真正的错误,所以日志上也没有任何记录。

而在我的本地和测试位置上为什么运行时会出现实际的错误呢?是因为我本地运行时没有调用PowerShell脚本的权限,所以会报错。在测试位置运行时,那个测试站点的应用程序池和正式站点的应用程序池不一样。正式站点的应用程序池的身份标识是管理员,就是为了能够调用PowerShell脚本。而测试站点的应用程序池的身份标识是"应用程序池身份“,也就是属于IIS_IUsers组,无法调用PowerShell脚本,就会报错。这两种情况都会报实际的错误,也就会写入错误日志。(此时还没有运行到PowerShell脚本中长时间等待那步)。

不过非常感谢大家给的这些思路,让我对于网站运行的身份,以及网站根目录的权限问题有了进一步认识。
我看看能不能把园豆分一些给大家。

starstarfish | 园豆:143 (初学一级) | 2020-10-14 14:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册