C# ASP.NET C中IIS上文件系统的部分日志记录#
我的ASP.NET web应用程序在.NET 4.6.1上使用C#时有一种非常奇怪的行为。当我将信息记录到IIS上的文件系统时,它似乎无法正常工作。在VS环境中,一切正常,日志文件似乎与预期的一样 我使用在apppool Start的C# ASP.NET C中IIS上文件系统的部分日志记录#,c#,logging,C#,Logging,我的ASP.NET web应用程序在.NET 4.6.1上使用C#时有一种非常奇怪的行为。当我将信息记录到IIS上的文件系统时,它似乎无法正常工作。在VS环境中,一切正常,日志文件似乎与预期的一样 我使用在apppool Start的global.asax应用程序启动事件处理程序中设置我的环境和我自己的日志系统 我初始化我的日志文件,如\location\myapp20180606.log,并编写两行,如“application start”、“version bla bla” 奇怪的是,我用同
global.asax
应用程序启动
事件处理程序中设置我的环境和我自己的日志系统
我初始化我的日志文件,如\location\myapp20180606.log,并编写两行,如“application start”、“version bla bla”
奇怪的是,我用同样的方法在global.asax中写这两行,在所有其他页面中写标准日志
在VS环境中,我可以看到完整的日志文件已填充
一旦我在IIS上发布,日志文件只包含全局asax的两行,而不包含所有其他行的线索
这是密码,希望有什么我没看到的错误
public void Log(string msg, logLevel level = logLevel.Debug)
{
if (string.IsNullOrWhiteSpace(msg))
return;
string now = String.Format(@"{0:hh:mm:ss:sss}", DateTime.Now);
if (string.IsNullOrEmpty(UserName))
UserName = "SYSTEM";
if (string.IsNullOrEmpty(Application))
Application = "*unknow app*";
string lvl = "";
switch (level)
{
case logLevel.Action: lvl = "ACT"; break;
case logLevel.Debug: lvl = "DBG"; break;
case logLevel.Info: lvl = "INF"; break;
case logLevel.Error: lvl = "ERR"; break;
case logLevel.Fatal: lvl = "FTL"; break;
case logLevel.Warning: lvl = "WAR"; break;
}
string line = now + "|" + UserName + "|" + Application + "|" + lvl + "|" + msg;
if(FileValid)
AppendToFile(LogFile, line);
}
public static bool AppendToFile(string nomeFile, string testo, bool addNewline = true, bool deletefirst = false)
{
try
{
if (nomeFile == "") return false;
StreamWriter fs;
if (!File.Exists(nomeFile))
{
string cartella = Path.GetDirectoryName(nomeFile);
if (cartella != null && !Directory.Exists(cartella))
Directory.CreateDirectory(cartella);
fs = new StreamWriter(nomeFile, false);
}
else
{
if (deletefirst)
File.Delete(nomeFile);
fs = new StreamWriter(nomeFile, true);
}
if (addNewline)
fs.WriteLine(testo);
else
fs.Write(testo);
fs.Flush();
fs.Close();
fs.Dispose();
return true;
}
catch (Exception ex)
{
return false;
}
}
}
在global.asax中
LogFile = file + "_" + String.Format(@"{0:yyyyMMdd}", DateTime.Now) + ".log";
string line = "Ora|UserName|Application|Severita|Messaggio";
FileValid = AppendToFile(LogFile, line);
以及应用程序中的任何位置
log("test msg");
在VisualStudio环境中,我可以看到完整的生成日志
发布到IIS后,我只看到在global.asax
中生成的两行以及其他任何内容
在池启动后,似乎设置了一些不允许写入文件系统的策略,但我无法找到位置和方式
感谢您的帮助您如何调用此日志功能?直接,从工作线程?你熟悉使用多个线程访问同一资源的危害吗?有多个日志框架(如nlog、Log4Net)将记录到文件(和许多其他目标):不要重新发明轮子。我知道Log4Net,但我总是使用自己的DLL,这在其他应用程序上没有问题。考虑IDE内的工作情况。为什么要将池拆分为多线程?池是一个线程,没有异步调用,我登录web表单页面,比如Load_page events,它应该是一个普通线程。如果你在一个网站中公开它,它将在多个线程上运行。我真的猜不出发生了什么,但如果你停止吞咽
异常
(),你可能会对出现的情况感到惊讶。此外,你需要使用使用或最终使用这些一次性物品。