Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET C中IIS上文件系统的部分日志记录#_C#_Logging - Fatal编程技术网

C# ASP.NET C中IIS上文件系统的部分日志记录#

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” 奇怪的是,我用同

我的ASP.NET web应用程序在.NET 4.6.1上使用C#时有一种非常奇怪的行为。当我将信息记录到IIS上的文件系统时,它似乎无法正常工作。在VS环境中,一切正常,日志文件似乎与预期的一样

我使用在apppool Start的
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,它应该是一个普通线程。如果你在一个网站中公开它,它将在多个线程上运行。我真的猜不出发生了什么,但如果你停止吞咽
异常
(),你可能会对出现的情况感到惊讶。此外,你需要使用
使用
最终使用这些一次性物品。