【问题标题】:Logger file not saved, no logger shown in console记录器文件未保存,控制台中未显示记录器
【发布时间】:2015-06-24 14:46:33
【问题描述】:

我非常仔细地按照 log4net 教程进行操作,但记录器未能保存为 txt 文件,也未能出现在控制台中。我希望日志文件保存在 C:\temp 下。

这是我的 app.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, Log4net"/>
  </configSections>
  <log4net>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="C:\temp\Logs.txt"/>
      <param name="AppendToFile" value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="3MB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline"/>
      </layout>
    </appender>
    <root>
      <level value="Debug"/>
      <appender-ref ref="LogFileAppender"/>
    </root>
  </log4net>
</configuration>

我也加入了

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 在 AssemblyInfo.cs 中。

我将记录器放在 LoggerView.xaml.cs 类中。 (我正在使用 MVVM 设计模式。)

[Export]
[PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.NonShared)]
public partial class LoggerView : Window
{
    private LoggerViewModel _viewModel;
    protected static readonly ILog log = LogManager.GetLogger(typeof(LoggerView));

    [ImportingConstructor]
    public LoggerView(LoggerViewModel viewModel)
    {
        _viewModel = viewModel;
        this.DataContext = _viewModel;
        InitializeComponent();
    }

    static void Main(string[] args)
    {
        log4net.Config.XmlConfigurator.Configure();
        log.Debug("Debug Statement");
        log.Info("Info");
        log.Error("Error Statement");
        log.Warn("Warning Statement");
        log.Fatal("Fatal Statement");
    }
}

我有什么遗漏或做错了吗?

谢谢。

【问题讨论】:

  • 在运行时检查 LogManager.GetRepository().Configured 以查看 log4net 是否已获取配置,您还可以查看 LogManager.GetRepository().ConfigurationMessages.Cast&lt;LogLog&gt;() 是否有任何配置错误。这些可能不包括权限错误。
  • 尝试开启log4net内部调试:stackoverflow.com/questions/756125/…

标签: c# wpf logging mvvm log4net


【解决方案1】:

尝试在您的 AssemblyInfo.cs 中指定配置文件,我的是这样的:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

将 XML 文件 log4net.config 添加到您的项目中,使用它开始:

    <?xml version="1.0" encoding="utf-8" ?>
 <configuration>
  <configSections>

  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:\log.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="1MB" />
      <filter type="log4net.Filter.LevelRangeFilter">
        <acceptOnMatch value="true" />
        <levelMin value="INFO" />
        <levelMax value="FATAL" />
      </filter>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="=========================================
                                  %nLEVEL:........%-5level
                                  %nTIMESTAMP:....%date 
                                  %nMessage:
                                  %n%m
                                  %nUsername: %username
                                  %n=========================================
                                  %n" />
      </layout>
    </appender>

    <root>
      <level value="all" />
      <appender-ref ref="RollingFileAppender" />
      <appender-ref ref="SmtpAppender" />
    </root>
  </log4net>
</configuration>

然后把它放到你的应用中(我的只是一个简单的控制台应用,只记录“测试”。

class Program
{
    private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

    static void Main(string[] args)
    {
        log.Error("Test");
        Console.ReadLine();

    }
}

【讨论】:

  • 我之前尝试过,但没有成功。日志是否应该出现在输出窗口中?
  • 您的配置文件是否名为 Log4net.config?我知道如果我忽略 ConfigFile="log4net.config",则不会记录任何内容。您是否将配置文件设置为内​​容,始终在属性中复制?
  • 我的配置文件叫做app.config。是的,我确实像往常一样在属性中将构建操作设置为内容并复制到输出目录。
  • 刚刚制作了一个简单的程序,log4net 在其中运行良好。我所做的只是添加我最初在答案中的行,然后进行编辑,仅此而已。在使用 LoggerView 类等使其复杂化之前尝试这样做。
  • 一旦你能做到这一点,试着加入你的补充。让我知道这是否适合你
【解决方案2】:

验证 log4net 是否具有写入文件夹的正确权限 关于登录到控制台,您还需要添加附加程序,请参阅此帖子以获取更多详细信息How to configure log4net to print to console in debug mode

这是使 log4net 正常工作的配置文件的一部分:

<log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingFileAppender" />
      <appender-ref ref="SmtpAppender" />
      <appender-ref ref="AdoNetAppender" />
    </root>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:\Logs\EntitlementPermissionManagerService.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="100KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
</log4net>

【讨论】:

  • 我确实像那篇文章所说的那样添加了附加程序。您知道如何检查 log4net 是否有权写入该文件夹吗?如果它没有权限,我将如何授予它权限?
  • 我刚刚用我的配置文件更新了我的帖子,你的看起来不同,所以比较两者并进行更改。
  • 查看此链接以获取文件夹访问权限stackoverflow.com/questions/4946042/…
  • 为什么需要在根目录下添加 SmtpAppender 和 AdoNetAppender?
  • 在我的情况下,我需要添加附加程序,但您可以在您的情况下删除它们。很高兴你最终让它工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
相关资源
最近更新 更多