【问题标题】:log multiple assemblies using log4net使用 log4net 记录多个程序集
【发布时间】:2012-04-30 07:40:29
【问题描述】:

经过很多问题,我终于设法为我的窗口服务配置了 log4net。

我对它很陌生,今天我开始配置它。我有以下这些疑问。

1) 我需要在多个程序集中使用它。假设我有一个程序集“A”作为引用添加到程序集“B”中,这是我的主要程序集,我有 log4net 的引用。我需要记录程序集“A”和“B”。

2) 我的应用程序是多线程的并且使用大量线程。那么 log4net 是线程安全的吗?

3) 我在我的 app.config 中使用以下配置。我不太清楚它有什么用。但我不想使用不必要的参数。

<log4net>
     <root>
       <level value="DEBUG"/>
       <appender-ref ref="LogFileAppender"/>
     </root>
     <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
       <param name="File" value="C:\logs\log.txt"/>
       <param name="AppendToFile" value="true"/>
       <rollingStyle value="Size"/>
       <maxSizeRollBackups value="10"/>
       <maximumFileSize value="100KB"/>
       <staticLogFileName value="true"/>
       <layout type="log4net.Layout.PatternLayout">
         <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"/>
       </layout>
     </appender>   
</log4net>

【问题讨论】:

  • 你的问题到底是什么?
  • 第 1 点和第 2 点中确切指定的问题
  • 下次请用问号(?),这样更清楚。
  • 有一个很好的常见问题解答,我认为它可以回答你所有的问题...logging.apache.org/log4net/release/faq.html 文档也很不错,我只需阅读它就知道如何在一天内使用它。跨度>

标签: c# .net log4net .net-assembly log4net-configuration


【解决方案1】:

在 appender 部分下使用 &lt;lockingModel type="log4net.Appender.FileAppender+MinimalLock" /&gt;。我将提高日志记录性能。

log4net 是线程安全的。

<maximumFileSize value="10MB" /> //For 100 Kb configuration there will be lot of files.

&lt;datePattern value="_yyyyMMdd" /&gt; //它会提示记录器在每个日期创建一个新文件。

为 Logger 创建一个静态类,并从您要使用的每个程序集中调用该静态函数。

日志示例类:

public static class Logger
    {
        static Logger()
        {
            XmlConfigurator.Configure();
        }

        public static void Log()
        {
            string methodName = new System.Diagnostics.StackFrame(1, true).GetMethod().Name;
            string moduleName = new System.Diagnostics.StackFrame(1, true).GetMethod().ReflectedType.FullName;

            var appLog = LogManager.GetLogger(loggername);
            appLog.Error(...);

        }
    }

【讨论】:

  • 感谢您的回复,我只是在做同样的事情。假设我在程序集 A 中添加了 log4net 引用,该引用在程序集 B 中添加为引用。现在,如果我在程序集 A 中创建一个将使用 log4net 的静态类,并且程序集 B 可以使用它,那么在这种情况下,必须在程序集 B 中添加 log4net dll 引用还。你说什么。
  • 您无需在 dll B 中添加 log4net dll,因为您将使用 dll A 进行日志记录。
  • 谢谢Romil,我已经解决了问题。 log4net 方法引用仅在当前程序集中退出,在此处添加它的地方说 A。所以我在下面的链接中创建了一个建议的课程,作为对稍后阅读这篇文章的人的帮助。 actcode.com/2009/11/…
  • Romil 您的 MinmalLock 建议是错误的。它比不使用最小锁定要慢,因为日志文件将为每个日志输出打开/关闭一次。见:logging.apache.org/log4net/release/sdk/…
【解决方案2】:
  1. 这不是问题;只需像往常一样在程序集 B 中使用 ILog
    只需确保在应用程序的生命周期中调用一次Configure()
  2. 是的。
  3. 我建议您熟悉 log4net。一个简单的google search 或查看docs 应该可以解决问题。

【讨论】:

  • 我现在正在做的事情。我在程序集 B 中创建了添加的引用,并使用该对象 ILog 进行日志记录。在程序集 A 中,我没有添加 log4net 引用,现在有一种方法可以在两个程序集中不添加 log4net 引用的情况下进行记录。程序集 A 作为引用添加到程序集 B
  • 所以,您问是否可以在不引用定义它的程序集的情况下使用ILog?答案显然是“不”……
  • 在程序集 B 中,我引用了 log4net dll。为了记录程序集 A,我是否需要在其中再次添加 log4net 引用。
  • 查看我之前的评论...在您希望使用 ILog 接口的任何程序集中,您必须引用定义它的程序集(即 log4net)。
【解决方案3】:
 <root>
       <level value="DEBUG"/>
       <appender-ref ref="LogFileAppender"/>
     </root>

它只会在调试模式下登录,所以在配置中输入以下条目:

 <root>
       <level value="ALL"/>
       <appender-ref ref="LogFileAppender"/>
     </root>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多