2009-08-22 129 views
9

我正在使用VS2005,一个网站项目,一个web部署项目和Log4Net。当我在本地开发时,我可以使用日志记录。我可以看到日志文件,一切都很好。当我构建我的网站时(使用Web部署项目),我使用部署作为单个DLL选项。当我然后检查我的日志文件的位置时,我看不到任何文件。为什么Log4Net不能在生产中创建日志文件?

有没有办法解决这个问题。我不认为将调试值添加到应用程序设置将会有所帮助,因为我没有控制台,因为它是一个网站。

编辑 我不希望150代表最后一次去浪费。我将来自我的开发环境的内部跟踪与生产中的跟踪进行比较。我的开发环境跟踪显示了Xml配置器的调用,其中生产者没有。我在application_start()方法的global.asax中有代码。我把调试代码放在那里,它在dev中调用,但不是在生产中调用。

我认为这是Web部署项目导致一些问题的地方。 global.asax是否被编译到单个DLL中?当我在部署目录中进行构建时,我看到一个global.compiled文件。这是否必须在生产中进入bin文件夹?或者是单个DLL中的global.asax代码?在bin文件夹或只有DLL中都没有改变任何东西。

回答

3

我已经找到了问题。权限是正确的。事实证明,使用Web部署项目还会在根中创建precompliled.config文件。我没有将它复制到生产环境中。只要这是一切工作。对不起,没有人得到赏金。

1

这发生在我之前,并且是ASPNET用户在需要时创建文件的权限。可以检查窗口事件日志中是否有任何内容表明这一点?

为了检查什么类型的东西(我们看守望者!),我们使用OutputDebugString() via pinvoke.写出了log4net的输出结果。我们也试图抓住这一点,以确保我们发现有关这方面的错误,因为使用它能够正确记录是非常重要的。

7

工作进程是否有足够的权限写入日志目录?我猜测事实并非如此。您可能希望赋予工作进程组权限以写入目录并查看是否可以解决您的问题。

+0

哪些群体,我必须写权限授予。我认为这是网络服务? – uriDium 2009-08-22 14:22:15

+3

我想有一个本地组,IIS_WPG,我会使用。通常情况下,任何运行工作进程的帐户都应该放在这个组中。如果您因某种原因决定更改帐户,使用该组可以保护您。另外,如果您的日志目录位于网站中,请确保您对其设置了一些保护措施,以免人们对此做出请求。 – tvanfosson 2009-08-22 14:36:42

+0

谢谢你的建议。有没有我们可以在这里读到的地方。我对安全和权限非常陌生。 – uriDium 2009-08-22 14:42:22

0

检查预期输出目录的权限并确保Web服务可以写入。最简单的方法是运行filemon.exe(一个SysInternals应用程序)并相应地限制它。这应该告诉你是否有任何问题,并且可以根据需要进行修复。

+0

我已经运行了filemon并为*日志进行过滤。唯一出现的文件是Log4Net的内部调试文件。它没有试图打开写任何东西到所需的日志文件。 – uriDium 2009-08-22 14:41:17

0

确保log4net get的配置正确。也许该DLL是好的,但配置文件丢失? log4net可以在那里,但没有任何活跃的appender。

0

为了确保log4net配置正确,我创建了一个UDP Appender,它可以记录到端口9090.我使用链锯http://logging.apache.org/chainsaw/index.html来检查日志条目。

有了这个,您可以检查是否至少有一些日志条目已完成,并且记录器正在运行。

UDP Appender的配置

<appender name="UdpAppender" type="log4net.Appender.UdpAppender"> 
     <remoteAddress value="localhost" /> 
     <remotePort value="9090" /> 
     <layout type="log4net.Layout.XmlLayoutSchemaLog4j"> 
      <locationInfo value="true" /> 
     </layout> 
</appender> 

电锯XML

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">  
    <plugin name="LocalReceiver" class="org.apache.log4j.net.UDPReceiver"> 
     <param name="Port" value="9090" /> 
    </plugin>  
</log4j:configuration> 
+0

我试过这个。有几件事让我感到困惑。我没有log4j配置文件。我正在使用Log4net。这会继续吗?接下来,我使用我的web配置文件来保存我的设置(在dev中工作)。我打开了9090端口,但Chainsaw似乎在端口4445和4560上侦听。我是否应该将上述内容放在某个文件中并重试? – uriDium 2009-08-26 19:54:02

+0

另外,最后一件事,我看到你指向apache类的插件。我是否也必须下载这些课程,或者他们是否包含在webstart中? – uriDium 2009-08-26 19:55:33

+0

只需将第二个xml保存为一个文件,并且只要您启动链锯,就可以打开一个配置文件 - >如果没有要求选择配置文件,则必须删除用户目录中的“.chainsaw”目录。 你不需要log4j配置,只需使用你的web.config - >但添加这个appender配置如上 – nWorx 2009-08-27 07:08:09

2

它看起来像你的问题的根源是,在Global.asax的Application_Start事件在不触发。

从VS 2005部署到Windows 2003时存在“已知”问题,即Application_Start未触发。

Global.asax.cs的内容将被编译到dll中。 但是,除非存在Global.asax文件,否则Application_Start将不会运行。

这里有几个相关链接:

http://accidentaltechnologist.com/asp-net/application_start-not-firing-and-the-globalasax/

http://www.velocityreviews.com/forums/t300292-web-deployment-projects-globalasax-problem.html

但是也有一些盖在上面链接了一些其他的可能性。

希望这有助于

西拉

4

在AssemblyInfo.cs文件中添加这一点,并检查

[assembly: log4net.Config.XmlConfigurator(Watch=true)]