log4net无法正常工作

时间:2010-10-09 22:51:13

标签: c# .net-4.0 log4net

嘿,我在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文件,那么它在哪里?

16 个答案:

答案 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被证明是顽固的时候的清单:

  • 确保在构建时将log4net.config文件复制到bin \文件夹(在编译器中设置为“如果更新则复制”)
    • 在处理已安装的代码时,请确保log4net.config随身携带(在编译器中设置为'Content')
  • 确保进程运行的用户具有写入日志的文件夹的写权限
  • 如果有疑问,请给c:\ temp \赋予混杂权限并获取所有内容以登录()
  • 启动Sysinternal / Dbgview.exe以查看是否告诉您任何内容

答案 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)

这些是最终使我的文件记录工作的步骤:

  • -Check AssemblyInfo.cs包含以下属性。     [assembly:log4net.Config.XmlConfigurator] 。这会加载log4net。
  • 检查日志目录是否具有写权限。
  • 检查记录器是否指定了格式。这是通过检查配置中的每个元素是否指定了布局元素来完成的。例如:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • 最后,尝试启用log4net内部日志记录以启用控制台日志记录并检查控制台。为此,请将<add key="log4net.Internal.Debug" value="true"/>添加到appSettings

答案 6 :(得分:5)

我曾经历过日志记录系统无声地失败而不会引发异常的经历。我认为这是有道理的,因为如果记录器记录错误,那么如何记录它无法执行记录的错误?

因此,如果文件未在磁盘上创建,请从查看文件系统权限开始,以确保您的应用程序正在运行的用户可以将新文件写入该磁盘位置。

出于测试目的,您可能希望手动在磁盘上创建应写入的文件,并为每个人写入权限打开权限。如果记录器开始写入它,那么您知道它是基于权限而不是基于配置。

答案 7 :(得分:2)

在我这边,我忘记标记正在编译应用程序时要复制的配置文件。

Copy the config file to output directory

只需右键单击log4net.config文件,选择属性,然后选择“复制到输出目录”作为“复制XXXX”

答案 8 :(得分:1)

我尝试了以上所有但没有奏效。在 app.config configSections部分添加此行为我工作。

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

确保VersionPublicKeyToken正确无误

答案 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在第一行....