2009-12-21 88 views
0

我有一个框架库,它可以做很多事情,包括日志记录。我们正在使用log4net进行日志记录。这个框架有静态日志类日志管理,ILog的(记录)和静态方法的用于记录信息,警告,调试等静态实例log4net从Web应用程序登录

静态实例记录仪越来越初始化这样的:

public static class LogManager 
{   
    private static ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

    static ActivityLogManager() 
    { 

    } 

    public static void LogDebugy(string message, params object[] messageParameters) 
    { 
     // Log the message here 
    } 
} 

我有我自己的怀疑,如果这是正确的做法。我从here看到每个需要登录的类都应声明一个静态实例ILog

另外我看到,我将不得不在我的框架项目中指定Log4net配置文件来记录。以为我读here,配置将从执行的程序集中获取,但我没有看到它发生。

有没有什么办法可以让我的日志记录从我的框架类中完成,从我的Web应用程序(用于我的Web应用程序)或其他商业库项目(用于我的业务类库)中获取配置?我也想添加一些自定义信息到我的日志(如自定义业务对象ID等,应用程序池,ServerName,ClientHostName,ClientBrowser,ClientOS,客户端用户等)。可能吗?

我正在使用AdoNetAppender。

Edit1:在我的assembly.cs中使用log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true)指向log4net配置文件。

Edit2:我的ILog Logger在我的框架LogManager类,因此只有一个实例为我的应用程序生成。

+0

通常每个需要记录东西的类都有自己的ILog实例,最好使用一个名称来表示某种类型的hiearchy(命名空间+类型是常见的)。这允许人们过滤消息。 NHibernate这样做可以让你过滤掉某些子库中的消息并转储所有的SQL查询(通常在DEBUG中记录)。 – Skurmedel 2009-12-21 18:44:57

回答

2

很多,但关于第一个问题,我用这种风格记录程序问题:

private static ILog Log = LogManager.GetLogger(typeof(MyClass)); 

当然,你可以命名任何你喜欢的变量,而这是通过log4net的球队,我认为推荐,因为这只会导致您的类的每个实例只有一个ILog -instance。

这或多或少是你在做什么,所以没有什么可担心的。我不知道为什么你要通过执行方法很长的路要走。

我通常将配置放置在Web.config或App.config中。我无法推断出你是否使用这些配置中的任何一个。如果你确实使用它,那很简单。您只需为log4net添加一个configuration部分并添加您需要的记录器,appender和过滤器。

如果你想记录的自定义数据,你可以把它添加到日志消息,例如:

Log.WarnFormat(
    "Reactor malfunction, temperature {0} celsius." 
    + "Evacuate sector {1} immediately", 
    temp, 
    sector); 

或者如果需要存储在某个对象的值,你可以做一个“渲染”了该类型将在对象作为日志消息传递时自定义打印,例如Log.Warn(myObjWithCustomFormatting)

对象渲染器必须从IObjectRenderer派生并将其注册到配置中。

+0

我使用上面的但与System.Reflection.Methodbase.GetCurrentMethod()。DeclaringType()自动获取类的类型。因为这只发生在构造函数被调用时相当便宜。 – GrayWizardx 2009-12-21 18:33:20

+0

我明白你的意思了。我想是一个偏好问题。 – Skurmedel 2009-12-21 18:37:43

+0

谢谢Skurmedal:我没有使用web.config或app.config,使用assembly.cs(请参阅我的编辑)。另外我不是在谈论格式,当我的意思是我想记录自定义对象。我发现使用InfoFormat或WarnFormat将它记录到我的DB列 - 消息中。我想要在数据库中创建一个自定义列并存储一些自定义信息 – ram 2009-12-21 18:44:55

1

我们在一些webapps中使用log4net,它们都很好。如果要从Web应用程序登录到事件日志,需要完成一些特殊设置,这取决于您使用的是哪个版本的Windows。简而言之,它要求您授予正在运行的用户写入事件日志的权限。在Win 7,2008等下,您必须授予整个分支机构的权限,其他所有权限都只是特定的应用程序日志。

如果你想记录到一个文件,只要确保该文件在apps目录中,它应该没问题。

如果您没有在日志框架中声明日志记录的配置,但会延迟它,直到您的应用程序调用它为止,默认情况下,这将在log4net配置节中发生。如果它先加载然后否,则将使用第一个加载版本,除非您在代码中覆盖它。