log4net 与 ASP.NET 3.5 问题
-
03-07-2019 - |
题
我在让 log4net 从 ASP.NET 3.5 运行时遇到一些问题。这是我第一次尝试使用 log4net,我觉得我错过了一块拼图。
我的项目引用了 log4net 程序集,据我所知,它已成功部署在我的服务器上。
我的 web.config 包含以下内容:
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler
, log4net"
requirePermission="false"/>
</configSections>
<log4net>
<appender name="InfoAppender" type="log4net.Appender.FileAppender">
<file value="..\..\logs\\InfoLog.html" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern
value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<logger name="_Default">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</logger>
</log4net>
我正在使用以下代码来测试记录器:
using log4net;
using log4net.Config;
public partial class _Default : System.Web.UI.Page
{
private static readonly ILog log = LogManager.GetLogger("_Default");
protected void Page_Load(object sender, EventArgs e)
{
log.Info("Hello logging world!");
}
}
在我的 Global.asax 中,我正在执行以下操作:
void Application_Start(object sender, EventArgs e)
{
log4net.Config.XmlConfigurator.Configure();
}
此时此刻,我想不出我还做错了什么。我尝试存储日志的目录是可写的,即使我尝试不同的目录,我也会得到相同的结果:没有文件,没有日志。
有什么建议么?:-)
编辑:我尝试了几种不同的日志文件路径和名称格式,其中一些包括“..\..\InfoLog.html”、“InfoLog.html”、“logs\InfoLog.html”等,只是如果有人想知道这是否是问题所在。
编辑:我已将根记录器节点添加回 log4net 部分,但在从示例复制时无意中忽略了这一点。根记录器节点如下所示:
<root>
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</root>
然而,即使如此,我仍然没有运气。
解决方案
我认为根记录器是强制性的。我怀疑配置失败,因为root不存在。
另一个潜在的问题是Configure没有指向Web.config。
尝试配置(Server.MapPath(&quot;〜/ web.config&quot;))。
其他提示
对我来说,这听起来很像文件权限问题。如果指定不带任何路径的文件名,log4net 将写入 Web 应用程序的根目录。尝试一下。除非那里成功,我建议您通过将以下内容放入 web.config 来启用内部 log4net 调试:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
</configuration>
然后,部署以调试模式编译的应用程序并运行 Visual Studio 远程调试器 查看抛出的任何错误。
我只花了3个小时试图解决这个问题,结果是web.config格式化。
我有这个,但它不起作用:
<section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler
, log4net"
requirePermission="false"/>
将其更改为固定它:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" requirePermission="false"/>
恼人!!
仅供参考:文件路径必须格式如下:
<file value="..\\..\\logs\\InfoLog.html" />
来自 CodeProject 的简单配置教程
我没有在.net 3.5中运行Global.asx
这是我的代码...我将log4net配置在一个单独的文件log4net.config
中// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
//My Web Services class name
private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Service1");
我有同样的(令人沮丧的)问题。我将根移动到log4net配置部分的顶部,一切正常。另外,我也有root和logger元素,每次调用logger时都会产生两行。我删除了记录器元素,只是保持根和它的工作正常。
如何使用页面类型创建记录器,如下所示:
private static readonly ILog log = LogManager.GetLogger(typeof(_Default));
这就是我在Global.ASX中所拥有的。在asp.net 3.5中完成了所有工作
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
log4net.Config.XmlConfigurator.Configure();
}
void Application_End(object sender, EventArgs e)
{
// Code that runs on application shutdown
log4net.LogManager.Shutdown();
}
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
}
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
}
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
}
</script>