嘿,我在web.config中有这个配置
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="mylog.log" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="" />
<param name="Footer" value="" />
<param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header]\r\n" />
<param name="Footer" value="[Footer]\r\n" />
<param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
但是log4net无效。我的项目编译得很好,我也没有调试错误。我告诉log.debug("somemessage")
的行可以正常运行,但我找不到mylog.log
文件,那么它在哪里?
答案 0 :(得分:281)
这类事情的一个问题是确保通过在XmlConfigurator
中放置以下行来将AssemblyInfo.cs
属性添加到程序集中:
[assembly: log4net.Config.XmlConfigurator]
否则log4net永远不会激活。
答案 1 :(得分:48)
我想log4net根本就没有记录,或者文件没有达到预期的水平。
首先,你实际上打过电话吗
XmlConfigurator.Configure()
代码中的任何位置?如果上面的xml片段在应用程序配置文件中,则此调用将起作用。如果xml片段在其自己的文件中,则需要使用获取文件路径的.Configure(string)
重载。如果没有这个调用(或者显然是Kirk Woll提到的汇编级别属性),那么log4net将根本不会记录。
如果您认为这一切都已完成,并且log4net应该是日志记录,那么您可能应该在进一步调试时为日志文件添加一个完全限定的路径。这将让您确定文件应该的位置。
答案 2 :(得分:30)
还有另一个小问题,请看这里:http://logging.apache.org/log4net/release/manual/configuration.html#dot-config
[assembly: log4net.Config.XmlConfigurator]
方法不适用于app.config。如果从app.config配置log4net,则必须使用log4net.Config.XmlConfigurator.Configure()
方法。
答案 3 :(得分:16)
这是我的log4net被证明是顽固的时候的清单:
答案 4 :(得分:7)
对于添加
的ASPNET MVC项目log4net.Config.XmlConfigurator.Configure();
到Global.asax.cs也有帮助:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
**log4net.Config.XmlConfigurator.Configure();**
}
}
答案 5 :(得分:6)
这些是最终使我的文件记录工作的步骤:
<appender name="MainLogger"...
<layout type="log4net.Layout.SimpleLayout"/>
<add key="log4net.Internal.Debug" value="true"/>
添加到appSettings
。答案 6 :(得分:5)
我曾经历过日志记录系统无声地失败而不会引发异常的经历。我认为这是有道理的,因为如果记录器记录错误,那么如何记录它无法执行记录的错误?
因此,如果文件未在磁盘上创建,请从查看文件系统权限开始,以确保您的应用程序正在运行的用户可以将新文件写入该磁盘位置。
出于测试目的,您可能希望手动在磁盘上创建应写入的文件,并为每个人写入权限打开权限。如果记录器开始写入它,那么您知道它是基于权限而不是基于配置。
答案 7 :(得分:2)
答案 8 :(得分:1)
我尝试了以上所有但没有奏效。在 app.config configSections
部分添加此行为我工作。
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />
确保Version
和PublicKeyToken
正确无误
答案 9 :(得分:1)
所以,在接受的答案中,解决方案是把
[assembly: log4net.Config.XmlConfigurator]
进入 AssemblyInfo.cs
文件。
另外,还有评论提示
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
但是,如果它仍然不起作用,请考虑配置您的 log4net 配置文件的名称(在我的情况下为 log4net.config
):
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
在那之后,日志工作就像一个魅力。
答案 10 :(得分:0)
<param name="File" value="mylog.log" />
说“将mylog.log写入实际文件夹”。这意味着如果您的webapp在IIS下,则日志将写入C:\ inetpub \ wwwroot \ appname \ mylog.log。
如果没有日志文件,则可能帐户正在运行的帐户对文件夹没有写入权限。您可以从SysInternals运行Process Monitor,以查看是否以及在何处写入文件。
还在调试模式下运行VS,以查看是否抛出任何异常(Debug-&gt; Exceptions-&gt; CLR Exceptions,check Thrown)。
答案 11 :(得分:0)
在我的情况下,我忘记将log4Net.config文件属性设置为&#34;内容&#34;所以该文件未包含在部署中。 所以要注意它:
Compile action : Content
答案 12 :(得分:0)
不幸的是,以上方法均无济于事。班级中的显式配置将额外记录到以前的设置建议中,这对我来说很成功。
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));
答案 13 :(得分:0)
检查您的报告级别设置为“调试”或“全部”。 这引起了我的注意,我花了很长时间试图调试我的 log4net 设置。 我将它设置为错误,因为它没有出错,所以没有记录任何内容。
答案 14 :(得分:0)
除了所有其他答案之外,我的问题是我需要在启动类(WinForms 示例)中调用 GetLogger():
static class Program
{
public static readonly ILog MainLog = LogManager.GetLogger("Main");
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
我所有的“有意义的”日志语句都在一个 DLL 中,该 DLL 对于 log4net 来说显然加载太晚了。
答案 15 :(得分:-7)
也过了几个小时后,我发现了为什么它不能为我工作......
我有:public static class Program
{
private static CommunicationManager _bcScanner = new CommunicationManager();
private static ILog _log = LogManager.GetLogger(typeof(Program));
private static SocketServer socketListener;
但它应该是:
public static class Program
{
private static ILog _log = LogManager.GetLogger(typeof(Program));
private static CommunicationManager _bcScanner = new CommunicationManager();
private static SocketServer socketListener;
所以确保ILog在第一行....