2015-06-16 35 views
0

我最近将log4net软件包添加到我的WCF Web应用程序中。现在我有几个问题我:使用log4net软件包

  1. 我在VS 2013包添加log4net的包安装和 它增加了整个包。我的猜测是,log4net只是dll,我可以通过添加dll将它添加到我的项目中?

  2. 当我加入log4net的打包packages.config文件已经被添加到我的项目与此内容:

    <?xml version="1.0" encoding="utf-8"?> 
    <packages> 
        <package id="log4net" version="2.0.3" targetFramework="net45" /> 
    </packages> 
    

是什么呢?我可以删除它吗?

  • 我可以用log4net的都在我的项目,而不在每个类的顶部定义它?

  • 我想添加额外的字段到消息部分。例如我想记录下这样的事件:

    Log.Debug(IP,“这是一个DEBUG级别的消息,通常是你的最VERBOSE级别。”);

  • 和日志文件显示这样的:

    72 DEBUG 2015-06-16 08:17:41,713 [10] [(null)] [InsertDate] - from source IP(192.168.1.1) This is a DEBUG level message. Typically your most VERBOSE level. 
    
  • 我到conversionPattern还增加%line,但它不工作。每次从72开始。这怎么解决?

  • 如何在wcf应用程序中停止并启动应用程序?

  • +0

    如果您在整个应用程序中使用它,则需要在每个将要使用它的课程中引用该程序集。 – Brian

    回答

    4

    你居然问在1 前4个问题,你要明白,你已经使用了NuGet包管理器,这是一个很好的做法,包括使用的NuGet可用的软件包,但不作为手动自动放置包在适当的地方,让您轻松地将此软件包添加到解决方案的其他项目,提供版本控制等。 了解更多关于NuGet的信息。例如,here

    现在关于你的问题:

    首先:没有,log4net包不仅含有log4net.dll文件。它也有log4net.xml文件。是的,您可以手动添加这两个文件,而无需使用NuGet软件包管理器。

    第二个:它是您的项目中的NuGet包列表。你只能删除它,如果你不打算使用NuGet。但是,这不是一个好主意 - 让它在那里,它是一个轻量级的XML文件。

    第三:这是一个面向对象的问题。创建一个单独的全球记录,例如:

    public static class LoggingFactory 
    { 
        private static ILog _logger; 
    
        private static CreateLogger() 
        { 
         // Some log4net initialization 
         return LogManager.GetLogger("Logger"); 
        } 
    
        public static GetLogger() 
        { 
         return _logger ?? (_logger = CreateLogger()); 
        } 
    } 
    
    public class AnyClassOfYourWholeSolution 
    { 
        LoggingFactory.GetLogger().DebugFormat("{0} {1}", a, b); 
    } 
    

    第四:这是OOP的问题又来。创建一个适配器,并使用它:

    public interface ILogger 
    { 
        void Debug(string ip, string message); 
        void Info(string ip, string message); 
        void Error(string ip, string message); 
    } 
    
    public class Log4NetLogger : ILogger 
    { 
        private ILog _logger; 
    
        public Log4NetLogger() 
        { 
         // Some log4net initialization 
         _logger = LogManager.GetLogger("Logger"); 
        } 
    
        public void Debug(string ip, string message) 
        { 
         // ... 
        } 
    
        public void Info(string ip, string message) 
        { 
         // ... 
        } 
    
        public void Error(string ip, string message) 
        { 
         // ... 
        } 
    } 
    
    public static class LoggingFactory 
    { 
        private static ILogger _loggerAdapter; 
    
        private static Initialize(ILogger adapter) 
        { 
         _loggerAdapter = adapter; 
        } 
    
        public static GetLogger() 
        { 
         return _logger; 
        } 
    } 
    
    public class BeginningOfYourProject 
    { 
        // Main() or Global.asax or Program.cs etc. 
        LoggingFactory.Initialize(new Log4NetLogger()); 
    } 
    
    public class AnyClassOfYourWholeProject 
    { 
        LoggingFactory.GetLogger().Debug(ip, message); 
    } 
    

    或者你也可以提取IP来的log4net的属性:

    // During initialization 
    log4net.ThreadContext.Properties["ip"] = ip; 
    
    // log4net Config 
    <layout type="log4net.Layout.PatternLayout"> 
        <conversionPattern value="%n%-5p %d %t IP: %property{ip} %m" /> 
    </layout> 
    

    这一切都取决于你的幻想。

    +0

    真棒回答,从一个从未使用Log4Net的人。非常详细和重点。 –