从Web应用程序登录log4net

时间:2009-12-21 18:15:46

标签: logging log4net

我有一个框架库,可以执行很多操作,包括日志记录。我们使用log4net进行日志记录。该框架具有静态日志记录类LogManager,ILog(logger)的静态实例和用于记录INFO,WARNING,DEBUG等的静态方法。

静态实例记录器正在初始化,如下所示:

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类中,因此只为我的应用程序生成了一个实例。

2 个答案:

答案 0 :(得分:2)

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

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

当然,您可以根据需要为变量命名,但我认为这是log4net团队推荐的,因为这会导致每个类的实例只有一个ILog - 实例。

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

我通常将配置放在Web.config或App.config中。如果您使用其中任何一个配置,我无法推断。如果你使用它们就很简单。您只需为log4net添加configuration部分,然后添加所需的记录器,追加器和过滤器。

如果要记录自定义数据,可以将其添加到日志消息中,例如:

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

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

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

答案 1 :(得分:1)

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

如果要登录文件,只需确保该文件位于apps目录中即可。

如果您没有为日志框架中的日志记录声明配置,但是在应用程序调用它之前将其延迟,则默认情况下将使用log4net配置部分进行此操作。如果它先加载然后加载,则将使用第一个加载的版本,除非您在代码中覆盖它。