2011-01-06 63 views
11

我想实现日志功能到一个类库中,它本身在web服务中被引用。我尝试添加app.config并完成了所有需要的操作,但似乎在引发异常时,log4net完全没有任何作用。如何将log4net包含到类库中?

我的app.config

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\mylogfile.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="test" /> 
     </filter> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="error" /> 
     </filter> 
     <filter type="log4net.Filter.DenyAllFilter" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO"/> 
     <appender-ref ref="RollingFileAppender"/> 
     <appender-ref ref="ConsoleAppender" /> 
    </root> 
    </log4net> 
在AssemblyInfo.cs中

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "app.config")] 
在LogManager.cs

private static readonly ILog Log = log4net.LogManager.GetLogger 
      (MethodBase.GetCurrentMethod().DeclaringType); 
public static void WriteLog(Exception ex) 
{ 
    Log.Error(ex); 
} 

能否请你告诉我,什么是错的?我怎样才能让log4net为我的类库工作?

谢谢

+0

代码如何看起来像你在调用WriteLog? – 2011-01-06 07:42:02

+0

顺便说一句,你有没有尝试将根级别设置为ALL,并尝试删除RollingFileAppender上的所有筛选器。 – 2011-01-06 07:45:20

+0

@Pauli:我试着按照你的建议,它仍然没有工作:) – Vimvq1987 2011-01-06 07:59:02

回答

1

请参阅我的回答以下问题:

Use log4net in SDK

它有一个日志配置程序,将构建一个log4net的配置文件中的完整路径。因为你在web服务中,所以我不在寻找你期望的“app.config”。

另外,还要确保你有写权限“d:\ mylogfile.txt”从你的web服务。

6

在运行时,配置文件总是从主机应用程序使用,除非明确声明。在这种情况下,web.config正在被使用而不是app.cofig。而是提及一些其他自定义配置文件名,并确保该文件被复制到Web服务的虚拟目录中。正如chibacity所说,确保日志文件的权限。最好将其保存在Web服务主机的app_data文件夹中。

3

你可以使用某种形式的注入,任你打造一个简单的名字:

public interface ILogger 
{ 
    void LogInfo(string message); 
     . 
     . 
     . 
} 

然后你只需注入相匹配的接口,像log4net的或这样的一个包装的东西。

但是,我认为最正确的是不登录类库。为什么我这么认为是因为库本身不是应用程序,所以你的Web服务是这样的,你的Web服务应该决定要记录什么。如果你想记录异常,就不要在类库中捕获异常,并让Web服务处理日志记录。这也将使记录的集中化变得更容易。

相关问题