【问题标题】:Castle Log4Net facility not loggingCastle Log4Net 设施未记录
【发布时间】:2015-01-22 18:26:20
【问题描述】:

我正在尝试在 Windows 服务中使用 Castle log4Net 工具。我无法让它写日志,所以我想我会创建一个控制台应用程序来尝试让它首先工作。我仍然没有看到写入的日志文件。我做错了什么或错过了什么?

namespace CastleLoggingFacilityWithLog4Net
{
    class Program
    {
        private static IWindsorContainer _container;

        static void Main(string[] args)
        {

            _container = new WindsorContainer();
            _container.Register(Component.For<IService>().ImplementedBy<Service>().LifestyleTransient());
            _container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.Log4net));
            //_container.Install(FromAssembly.This());

            var service = _container.Resolve<IService>();
            service.TestLogging();
        }
    }

    public interface IService
    {
        void TestLogging();
    }

    public class Service : IService
    {
        private ILogger logger = NullLogger.Instance;

        public void TestLogging()
        {
            Logger.Info("this is a test");
        }

        public ILogger Logger
        {
            get { return logger; }
            set { logger = value; }
        }

    }
}

在log4net.config中添加我的log4net配置如下...

<configuration>
  <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
  <file value="logging\log.txt" />
  <appendToFile value="true" />
  <datePattern value="dd-MM-yyyy'.log'" />
  <staticLogFileName value="false" />
  <rollingStyle value="Date"/>
  <maximumFileSize value="10MB" />
  <maxSizeRollBackups value="5" />
  <dateTimeStrategy type="log4net.Appender.RollingFileAppender+UniversalDateTime" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%utcdate %-5level %logger - %message%newline%exception" />
  </layout>
</appender>
<root>
  <level value="DEBUG" />
  <appender-ref ref="RollingFile" />
</root>
</log4net>
</configuration>

【问题讨论】:

  • 在服务中,为什么要设置 logger = NullLogger.Instance?
  • 可能是这个link可以帮助你
  • 谢谢@prasy 我已经看过那个链接了。

标签: c# log4net castle-windsor castle


【解决方案1】:

结果证明我的代码或配置没有任何问题。问题是 log4net 配置未设置为复制到输出目录!很遗憾 Castle 或 log4net 都无法告诉我找不到日志文件。

【讨论】:

  • log4net 仅在您要求时警告您配置错误(请参阅如何启用 log4net 内部调试?此处:logging.apache.org/log4net/release/faq.html)。否则它会保持沉默
  • 感谢@samy,这是一个很棒的提示
【解决方案2】:

您必须在 Main() 中添加以下代码才能生成日志文件,这将导致使用 configSource

log4net.Config.XmlConfigurator.Configure();

编辑: 根据 app.config 中的文件值。它将日志文件写入 ProgramFiles,并非所有用户都有权在 programfile 中写入/编辑文件。所以,我建议在 AppData 中编写日志文件。

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="${LOCALAPPDATA}\logging\log.txt" />
....
</appender>

【讨论】:

  • 这似乎不对。 Castle 的 log4net 集成中已经包含读取 log4net 配置文件的代码。我认为问题在于在服务中设置 logger = NullLogger.Instance。
  • @wageoghe 我不认为 logger = NullLogger.Instance 是问题,请参考这个link
  • 我不必添加 log4net.Config.XmlConfigurator.Configure();我的 Castle 安装程序使用 .WithConfig 方法... container.AddFacility(f => f.UseLog4Net().WithConfig("log4net.config"));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多